使用OllyDbg从零开始Cracking 第二十一章-OllyDbg反调试之检测OD进程名,窗口类名,...
第二十一章-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-Executetill 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结构体的首地址处,接着我们执行到返回就可以获取到第一个进程的相关信息了。我们可以看到第一个进程的名称,第一个进程总是SystemProcess,我们继续运行。嘿嘿,这里调用了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弹出notdebugged!没有被调试的信息。这里,两者并不相等,所以我们继续跟。上面两个字符串不相等,所以比较结果为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就不那么容易被检测到了,现在就不会被通过进程名,窗口名或者窗口类名的方法检测到了,嘿嘿,下一章我们继续讨论其他的反调试方法。我们首先弄明白如何手工绕过对应的反调试,然后使用插件来绕过就很简单了,嘿嘿。
本系列文章汉化版转载看雪论坛
感谢原作者:RicardoNarvaja(西班牙人) 原作者个人主页:http://www.ricardonarvaja.info/
感谢热心翻译的朋友:1~3章译者:BGCoder4~58章译者:安于此生
全集配套程序下载地址:链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv
这个西班牙人不错啊!! 谢谢,收藏一下,也许用的上 跟着大佬少走弯路 向楼主学习!
页:
[1]