- 第一章 - OD 的各个窗口介绍
- 第二章 - 数值系统
- 第三章 - 寄存器
- 第四章 - 汇编指令
- 第五章 - 数学指令
- 第六章 - 比较和条件跳转
- 第七章 - call ret
- 第八章 - 循环 字符串指令和寻址方式
- 第九章 - 基本概念
- 第十章 - 断点
- 第十一章:硬件断点与条件断点
- 第十二章 - 消息断点
- 第十三章 - 硬编码序列号寻踪-Part1
- 第十四章 - 硬编码序列号寻踪-Part2
- 第十五章 - 硬编码序列号寻踪-Part3
- 第十六章 - 序列号生成算法分析-Part1
- 第十七章 - 序列号生成算法分析-Part2
- 第十八章 - 序列号生成算法分析-Part3
- 第十九章 - OllyDbg 反调试之 IsDebuggerPresent
- 第二十章 - OllyDbg 反调试之检测 OD 进程名
- 第二十一章 - OllyDbg 反调试之检测 OD 进程名,窗口类名,窗口标题名
- 第二十二章 - OllyDbg 反调试之 UnhandledExceptionFilter,ZwQueryInformationProcess
- 第二十三章 - OllyDbg 反调试之 ProcessHeap,NTGlobalFlag,OutputDebugStringA
- 第二十四章 - OllyDbg 反调试之综合 CrackMe
- 第二十五章 - 异常处理
- 第二十六章 - Visual Basic 程序的破解-Part1
- 第二十七章 - Visual Basic 程序的破解-Part2
- 第二十八章 - Visual Basic 程序的破解-Part3
- 第二十九章 - P-CODE-Part1
- 第三十章 - P-CODE-Part2
- 第三十一章 - 脱壳简介
- 第三十二章 - OEP 寻踪
- 第三十三章 - 神马是 IAT 如何修复
- 第三十四章 - 手脱 UPX,修复 IAT
- 第三十五章 - 手脱 ASPack V2.12
- 第三十六章 - IAT 重定向
- 第三十七章 - 论 IAT 重定向之修复
- 第三十八章 - 手脱 Yoda's Protector v1.3(Yoda's Crypter)
- 第三十九章 - 神马是 stolen bytes
- 第四十章 - OllyDbg 脚本的编写
- 第四十一章 - 神马是 AntiDump
- 第四十二章 - ACProtect V1.09 脱壳(寻找 OEP 绕过硬件断点的检测 修复 Stolen code)
- 第四十三章 - ACProtect V1.09 脱壳(编写脚本修复 IAT)
- 第四十四章 - ACProtect V1.09 脱壳(修复 AntiDump)
- 第四十五章补充章节-ReCrypt v0.80 脱壳(续)
- 第四十六章 - Patrick 的 CrackMe-Part1
- 第四十七章 - Patrick 的 CrackMe-Part2
- 第四十八章 - PeSpin V1.3.04 脱壳-Part1
- 第四十九章 - PeSpin V1.3.04 脱壳-Part2
- 第五十章 - 再谈 ReCrypt v.0.80 脱壳(调戏 OutputDebugString)
- 第五十一章 - ASProtect v2.3.04.26 脱壳-Part1
- 第五十二章 - ASProtect v2.3.04.26 脱壳-Part2
- 第五十三章 - TPPpack 脱壳
- 第五十四章 - EXECryptor v2.2.50.a 脱壳-Part1
- 第五十五章 - ExeCryptor v2.2.50.a-Part2
- 第五十六章 - EXECryptor v2.2.50.b 脱壳
- 第五十七章 - ExeCryptor v2.2.50.c/d/e/f/g 脱壳
- 第五十八章 - ExeCryptor v2.2.50
第二十一章 - OllyDbg 反调试之检测 OD 进程名,窗口类名,窗口标题名
本章我们继续讨论反调试,将我修改过的一个 CrackMe 作为本章的实验对象。
该 CrackMe 的名字叫做 buggers,其中做的一些修改是为了介绍检测 OllyDbg 进程名的其他一些 API 函数,同时该 CrackMe 也涵盖了检测 OllyDbg 窗口标题名以及窗口类名等知识点。
我们打开原始的 OllyDbg 程序,不使用重命名的,因为本章我们将对上一章的检测 OD 的方法进行延伸,因此让 OD 的文件名是 OllyDbg.exe,保证该 CrackMe 可以检测出来 OD。
我们用 OD 加载该 CrackMe,接着将 HideDebugger1.23 版插件的 IsDebuggerPersent 选项勾选上。
HideDebugger 插件的配置如下:
这里只是为了防止该程序调用 IsDebuggerPresent 对 OD 进行检测。我们打开原始的 OllyDbg.exe,然后打开任务管理器,确保 OD 的进程名为”OLLYDBG.EXE”
好了,我们回到 buggers3,看看该程序使用了哪些 API 函数。
我的天啦!API 列表中居然只是唯一的一个函数 ExitProcess,其他 API 函数应该都是通过 GetProcAddress 加载的,但是 GetProcAddress 也不在该列表中。
我们试试在命令栏中输入 bp GetProcAddress,接着运行起来。
断在了 GetProcAddress 函数的入口处,程序调用 GetProcAddress 加载一些 API 函数,如果我们对哪些 API 函数感兴趣,我们可以执行到返回,就知道了该函数的地址了,然后使用 bp EAX 断这个函数,因为 EAX 中保存了 GetProcAddress 获取到的函数地址。
这个函数我们不感兴趣,我直接按 F9 键运行起来。
运行几次后,我们找到了一个可疑的 API 函数 CreateToolhelp32Snapshot,你可能会问,你是怎么知道的,因为我知道这种检测方法,所以我介绍它,让大家知道哪些 API 函数还可以用于检测 OD。
好了,现在我们选择主菜单项 Debug-Execute till return 来执行到返回。
现在我们到了 RET 指令处,并且 EAX 保存了 CreateToolhelp32SnapShot 的函数地址,我们使用 BP EAX 该函数设置一个断点。
下面是该 API 断点的位置。
我们继续运行,看看有没有其他的可疑的 API 函数的被加载。
恩,OpenProcess 这个函数也是一个可疑函数,其可以获取进程的句柄(我们上一章节已经讨论过了),我们执行到返回,接着使用 BP EAX 给该函数设置断点。
嘿嘿,Process32First 又一个可疑的 API 函数,我们同样执行到返回,然后 BP EAX 给该函数设置断点,接着对下一个可疑的函数 Process32Next 进行同样的操作。
接下来是 TerminateProcess。
我们知道这个函数是用来关闭 OllyDbg 的。因为必须检测 OD 进程才会执行该函数,所以不必给该函数设置断点,但是为了安全起见我们还是给该函数设置断点吧,嘿嘿。
嘿嘿,FindWindowA 又一个可疑的函数,依然按照上面的方法给该函数设置断点。
我们继续 F9 键运行就断在了 CreateToolhelp32SnapShot 的入口处。
堆栈情况如下:
让我们来看看 MSDN 中关于这个函数的说明。
该函数是该当前机器上面运行的所以进程列表创建一个快照,但是返回给我们的仅仅是该快照的句柄,并且没有什么用于保存进程列表的缓冲区之类的参数,我们直接执行到返回。
EAX 中保存了进程快照的句柄。
我机器上返回的进程快照句柄是 2C,我们查看一下该程序的句柄列表。
我们单击工具栏上面 H 按钮打开句柄列表窗口。
我们发现句柄列表中并没有 2C 这个句柄值,不过还好,我们成功了创建了进程快照并获取到了进程快照的句柄,我们运行起来,看看该程序哪里使用了进程列表。
断在了 Process32First 这个 API 函数的入口处,该函数配合 Process32Next 这个 API 函数可以读取进程快照中所有正在运行的进程的相关信息。
好了,我们来看看 MSDN 中关于这个函数的说明。
该函数用于获取第一个参数也就是进程快照(我这里是 2C) 中的第一个进程的信息。第二个参数为 PROCESSENTRY32(进程相关信息) 的结构体的指针。
这个函数仅仅是用来获取第一个进程的信息的,Process32Next 才是用来获取后面的进程的信息的。
我们在数据窗口中转到 PROCESSENTRY32 结构体的首地址处,接着我们执行到返回就可以获取到第一个进程的相关信息了。
我们可以看到第一个进程的名称,第一个进程总是 System Process,我们继续运行。
嘿嘿,这里调用了 FindWindowA,由于 OllyDbg 的窗口标题名和窗口类名是同名的,所以 FindWindowA 也可以指定第一个参数窗口标题名为“OllyDbg”,当前该程序指定是第二个参数窗口类名,同样也是“OllyDbg”。
我们可以使用一个实用的小工具 WinDowse 来获取窗口类名(其实 VC 自带的 SPY++也可以,(*^__^*) 嘻嘻……)
我们知道 OllyDbg 有对应的插件可以用于查看窗口的相关信息。但是 WinDowse 这款工具获取的信息更加详细一些,我们安装这个工具并运行起来。
我们可以看到 Window 标签页中显示了 OllyDbg 的窗口标题名并且 Class 标签页中显示其窗口类名。
正如我们看到的都是 OllyDbg。
我们可以看到 FindWindowA 返回的是指定窗口的句柄,通过该窗口句柄,我们可以对该窗口进行任何操作。
大家没有必要同时设置窗口类名和窗口标题名,你只需要任选择其一,另一个参数赋值为 NULL 即可。
好了,现在我们执行到返回,看看该函数是否会返回 OD 的窗口句柄。
恩,正如我们所看到的,返回的窗口句柄值跟 WinDowse 上面显示的窗口句柄值一致。
好吧,我们继续跟,看看该程序获取了 OD 的窗口句柄会干些什么。
这里判断获取到的窗口句柄是否为空,如果窗口句柄为空,说明不存在 OllyDbg 窗口,如果返回的窗口句柄非空,该程序就会调用 ExitProcess 退出进程。
直接跳转至退出进程的代码块并且不显示任何东西出来。
所以,我们需要 FindWindowA 返回值 EAX 为空。
好了,我们现在知道如何手工绕过该反调试了,下面直接使用 HideDebugger1.23 版插件来绕过该反调试吧,我们来看看该插件的配置吧。
我们可以看到第二个选项,可以绕过 FindWindow 和 EnumWindows 检测 OD 窗口方法,首先我们还是要知道如何手工绕过该反调试以及其原理是什么。好了,我们现在不设置该选项,直接重新启动 OD,手工来实现跳过 ExitProcess 代码块并且继续执行。
我们双击零标志位 Z 将其修改为 1,这样 JNZ 条件跳转就不会实现了。
现在 JNZ 指令不会跳转了。
接下来将会执行 JMP 指令跳过 ExitProcess 的调用代码。
好了,我们继续,介绍如何绕过 FindWindowA 了,现在继续讨论绕过检测 OD 进程名的方法,运行起来。
断了下来,现在调用的是 Process32Next,获取进程快照中第二个进程的相关信息,并且该进程的相关信息会保存在 403134 指向缓冲区中。
我们执行到返回看看保存了什么。
现在获取到的是 System 进程,PID 为 4,我们结合任务管理器来看。
同理,我们就可以看到获取到的每个进程以及其相关信息。
这里我们可以看到 lstrcmpA 这个 API 函数,它将“System”与“buggers3.exe”两个字符串进行比较,即比较当前获取的进程名与该 CrackMe 名称,如果它们相等,将会调用 MessageBoxA 弹出 not debugged!没有被调试的信息。这里,两者并不相等,所以我们继续跟。
上面两个字符串不相等,所以比较结果为 FFFFFFFF。
由于结果不为零,将会跳转至 40119F 地址处。
这里,到了比较关键的地方了,比较获取到的进程名是否为 OLLYDBG.EXE,如果是,结果为零并且 JNZ 条件跳转将不会实现,将会调用 OpenProcess 获取 OD 进程的句柄,然后通过 TerminateProcess 结束掉 OD 进程。跟上一章我们遇到的情况差不多。
我们可以看到当前进程名并不是 OllyDbg.exe,所以会继续执行 Process32Next 获取下一个进程的相关信息。
我们同样是执行到返回,看看到获取到的信息。
现在获取到的进程名称为 smss.exe,其 PID 为 26C。我们结合任务管理器来看。
任务管理器中显示的 smss.exe 进程的 PID,十进制为 620,十六进制即 26C。
恩,接下来该 CrackMe 会逐一比较每个进程看是否为 OLLYDBG.EXE。
现在我们处于 4011B1 这个条件分支处,当前找到一个进程名为 OLLYDBG.EXE,条件跳转将不会发生并且会执行下面的关闭 OD 的代码,因此,我们需要将该 JNZ 指令修改为 JMP 指令,让关闭 OD 的代码永远得不到执行。
现在删除所有断点运行起来。
好了,这样该反调试就被绕过了。我们知道 HideDebugger 插件也可以绕过 FindWindowA 对于 OD 窗口的检测,并且我们也可以将原版的 OLLYDBG.EXE 重命名为 PIRULO.EXE 让其找到 OLLYDBG 这个进程名。
我们打开 PIRULO.EXE。
我们勾选上绕过 FindWindow 的选项,然后单击保存。
接着我们重新启动 OllyDbg。
我们加载 buggers3 之前,先来解决一个小问题,我们来看一下 WinDowse,看看 WinDowse 还是否能够检测 OD 的窗口名。
我们可以看到 OLLYDBG 并没有出现在标题栏中,那 OD 的窗口类名呢?
我们可以 OLLYDBG 的窗口类名被检测出来了,这里我们还需要借助另一个小工具。
它的名字叫做 repair0.6,它是 OLLYDBG 的一个补丁程序。
好了,我们现在关闭 OllyDbg 然后运行该补丁程序。
好了打完补丁以后我们现在有了第 3 个 OllyDbg 了,就是 Nvp11.exe。我们来看看 OD 所在的文件夹。
好了,我们现在运行它,看看其窗口类名。
我们可以看到现在的窗口类名为 Nvp11,进程名称也变成了 Nvp11,好了,现在我们就可以完美运行 buggers3 了,我们来验证一下。
运行起来。
好了,我们给 OD 打了补丁以后,OllyDbg 就不那么容易被检测到了,现在就不会被通过进程名,窗口名或者窗口类名的方法检测到了,嘿嘿,下一章我们继续讨论其他的反调试方法。我们首先弄明白如何手工绕过对应的反调试,然后使用插件来绕过就很简单了,嘿嘿。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论