吾爱汇编

 找回密码
 立即注册

QQ登录

绑定QQ避免忘记帐号

查看: 6643|回复: 6

[转载技术] 第二十章-OllyDbg反调试之检测OD进程名

[复制链接]
Shark恒 发表于 2015-1-20 16:32 | 显示全部楼层 |阅读模式

                  第二十章-OllyDbg反调试之检测OD进程名
本章我们介绍通过查找OD进程名来进行反调试技巧,首先我们有必要对OD进行相应的设置。
我们选择主菜单项Option-Debugging options-Security。
image002.jpg
我们可以看到这里有3个复选框,我们知道通常情况下,我们给某个API函数设置断点,当我们重启OD后,刚刚给API函数设置的断点就被清除了。但是勾选上这3个复选框,再给API函数设置断点,重启OD后我们会发现刚刚设置的断点依然存在,这就避免了重启OD后需要重新给API设置断点的麻烦。
实际上,我也不知道OD关于这个功能的实现原理,我们只需要知道这3个复选框可以让我们设置的API断点在OD重启后仍然有效。
image004.jpg
这个设置我觉得很有必要,避免了很多麻烦,现在我们开始讨论通过查找OD进程名来进行反调试的话题吧。
打开OD,接着通过Ctrl+Alt + Delete快捷键打开任务管理器。
image006.jpg
我们可以看到进程名称列表,我们可以通过检测进程名称是否为OllyDbg,如果是就结束进程,哈哈。
我们来看一个CrackMe,这个CrackMe运用我们前面介绍的知识暂时还解决不了,我们只是来看看它是如何检测OllyDbg的进程名,以及我们如何来绕过它的检测,嘿嘿。
这个CrackMe的名字叫做daxxor,如果我们先运行这个CrackMe,然后打开OD,会发现OD马上就退出了。如果我们用OD加载该CrackMe然后运行起来,会发生两者一起退出了。
如何来应对这种情况呢,我们先用OD加载这个CrackMe。
image008.jpg
停在了入口点处,我们先看看该程序使用了哪些API函数。
image010.jpg
我们可以看到有很多API函数,但都不是用于检测进程名的,可能这些重要的API函数被隐藏起来了,没有出现该列表中。
很显然如果程序不直接导入某些API的话,会使用GetProcAddress这个API 函数来获取这些API函数的地址进行间接调用。
image012.jpg
使用GetProcAddress函数加载的一些API函数并不会出现该API函数列表中,我们给GetProcAddress设置一个断点。
image014.jpg
运行起来。
image016.jpg
断在了GetProcAddress的入口点处,当前待获取的函数是__CPPdebugHook,该函数检测进程名没有关系,继续运行。
image018.jpg
我们继续按F9键运行直到待获取的API是与检测进程名相关的为止,这里待获取的API函数是EnumProcesses,这里通过选择主菜单项Debug-Execute till return执行到返回,这个时候EAX寄存器中保存的就是EnumProcesses这个API函数的地址了。我们接着就可以给该地址设置断点了。
image020.jpg
这里EAX就保存了EnumProcesses的函数地址,我的机器上是76BB3A9A(可能与你机器上的不一样)。
image022.jpg
另外,OD的API的函数列表中并没有列出EnumProcesses这个名称,所以我们直接bp EnumProcesses是设置不了断点的,我们可以给EnumProcesses函数的地址设置断点。
image024.jpg
设置成功了。
image026.jpg
好了,我们已经给EnumProcesses设置了断点,继续我们刚才的步骤,看看还有什么API函数被加载。
image028.jpg
这里是获取枚举进程模块函数的地址,我们还是执行到返回,接着给EAX中保存的地址设置断点。
我们直接在命令栏中输入bp EAX。
image030.jpg
同理,我们给所有与检测进程名相关的API函数设置断点。
image032.jpg
这里是另外一个可疑的API函数GetModuleBaseNameA,我们跟之前一样给该函数设置断点,然后我们运行起来,断在了EnumProcesses函数的入口处。
image034.jpg
我们通过双击反汇编窗口的注释区域来给该函数添加注释,注释上该函数的名称EnumProcesses。
image036.jpg
我们给这些通过GetProcAddress加载的API设置断点,并且断下来了,但是OD并没有在API函数列表中找到与之对应的项,所以OD也没有提示该函数相关信息。
我们谷歌一下“EnumProcesses”。
image038.jpg
找到一个微软的网站页面:
image040.jpg
上面的解释是该函数返回正在运行的每个进程的标识即PID。好了,接下来我们看看神马是PID,嘿嘿。
PID是系统分配给每个正在运行的进程的标识符-每次启动的时候都会发生变化。我们来看看进程列表。
image042.jpg
我们可以看到,这里,OD的PID是724-十进制。我们用windows自带的计算器将该PID值转化为十六进制。
image044.jpg
单击Hex按钮,就以十六进制显示了。
image046.jpg
PID对应的十六进制为2D4。可以关闭OD然后重新打开一个OD,会发现PID发生了变化。进程每次重新启动,PID都改变了。
很不走运,API的参数提示也没有了。
image048.jpg
根据MSDN我们知道该函数有3个参数。
image050.jpg
在我们的机器上12EDE4该地址指向了保存所有进程PID的数组,我们执行到返回看看该API函数返回了什么,我们通过数据窗口查看一下。
image052.jpg
在PID列表中我们找到了OD的PID的值,嘿嘿。
我们给该PID设置内存访问断点,看看哪里使用了它。
image054.jpg
运行起来。
image056.jpg
可以看到这里将要调用OpenProcess,如果调用成功,就会获取OD进程的句柄。
PID跟句柄有什么区别呢?很简单。PID是用于区别不同进程的标示符,一个进程被创建后这个进程的PID就是不变的,除非进程重新启动。当前,OD的进程PID是2D4。而句柄实际上是一个指针,它指向一个包含具体数据结构的内存,可能当做索引,所以句柄是你每次访问该进程的时候获取的,使用完毕后要释放,然后通过该句柄可以对该进程进行相应操作。
下面是OpenProcess其他参数参数解释,我们并不感兴趣。
image058.jpg
返回值为指定进程的句柄。
我们F8单步直到调用该函数。
image060.jpg
EAX中返回了OllyDbg进程的句柄,我这里是58。
我们也可以通过单击工具栏上面的H按钮查看OD的句柄列表。
image062.jpg
我们可以看到58对应的类型是Process,它标识的是OllyDbg的进程句柄。
如果另一个进程调用EnumProcesses获取OD的进程PID的话,仍然会是2D4,但是获取进程句柄的话,会是另外一个值,因为句柄在系统中是独一无二的。
这里,OllyDbg进程就比较危险了,有了OD的进程句柄,该程序就可以做很多事情了(比如结束OD进程),以上只是检测OllyDbg步骤的一部分,现在还需要来验证一下进程名称是否为OllyDbg,很明显该程序会对进程列表的所有进程做以上操作,我们跳过这些步骤直接给对应的PID设置内存访问断点。
我们继续F8键单步。
image064.jpg
我们看到了EnumProcessModules这个函数,我们看看MSDN上面关于这个函数的说明。
image066.jpg
该函数是枚举指定进程的模块,我们F7键跟进到该函数的入口处。
image068.jpg
我们在堆栈窗口中来看看参数情况:
image070.jpg
58是OD的进程句柄作为第一个参数。
这里,你需要清楚一点:当我们请求获取进程中模块句柄的时候,系统会返回该模块在进程内存中基地址(模块起始地址),这里,系统给我返回的是400000,该基地址对应的OllyDbg进程中的。
image072.jpg
继续跟,我们可以看到另一个API函数。
image074.jpg
GetModuleBaseNameA
image076.jpg
该函数是获取指定进程模块的名称,lpBaseName这个参数是用来保存模块名称的缓冲区首地址,我们执行到返回。
image078.jpg
堆栈窗口中参数情况如下:
image080.jpg
58是OllyDbg的进程句柄,400000是OD主模块的基地址,用于保存模块名称的缓冲区首地址为12ECE0,我们在数据窗口中定位到这个地址。
image082.jpg
呵呵,很显然,我们执行到返回以后获取到了进程的模块名称,同理,该程序会依次判断每个进程的名称是否为”OLLYDBG.exe”。
image084.jpg
好了,现在我们看到了CloseHandle这个API函数,该函数用来关闭指定的句柄,即58将从句柄列表中消失。
image086.jpg
好了,现在进程句柄被关闭了,我们不能再依赖它了。
image088.jpg
这里有一个CALL指令,我们按F7键跟进。
image090.jpg
这里,我们可以看到将要压入堆栈的是“OLLYDBG”字符串的第一个字母(4F),然后调用一个CALL指令,我们继续跟进。
我们可以看到这个CALL里面没有什么特别的,所以我们跟出来,然后跟到下一个CALL指令处。
image092.jpg
跟进。
image094.jpg
嘿嘿,这里在比较进程名称是否为”OLLYDBG.EXE”,如果是,就会...嘿嘿,我们现在执行到返回,看看会发生什么。
image096.jpg
如果进程名不为”OLLYDBG.EXE”,EAX就不等于0,JNZ条件跳转将会发生,如果EAX为0,条件跳转不会发生,将执行后面结束OD进程等一系列操作。
image098.jpg
跳转不会发生,将会再次调用OpenProcess打开OD进程并且获得其句柄,然后调用TerminateProcess结束掉该OD进程。
image100.jpg
我们按F8键单步。
image102.jpg
返回的是58,我们继续。
image104.jpg
正如你所看到的,调用TerminateProcess这个API函数,指定进程的句柄,结束调用OllyDbg进程。
image106.jpg
我们按F8键,OD被关闭了。这就是我们研究的如何检测OllyDbg进程名的原理。
好吧,我们重新启动OD,然后在OpenProcess入口处设置断点。
image108.jpg
断了下来,我们可以修改该API函数,让它总是返回0,程序就会认为没有其他程序正在运行,获取不到任何进程句柄,要做到这一点,我们修改最后一行。
image110.jpg
这样,这个API函数就总是返回0了。现在我们删除之前设置的所有断点。接着设置一下主菜单项中的调试选项中的异常,如下:
image112.jpg
这里,我们勾选上忽略所以异常,因为这些异常中(有的必须按Shift + F9键,才能忽略异常继续执行,这里我们直接忽略掉)运行起来。
image114.jpg
正常运行,其实你也可以这么做:
image116.jpg
将JNZ修改为JMP,让其直接跳过下面的关闭OllyDbg进程的代码。
运行起来,主窗口显示出来了,我们单击Try按钮。
image118.jpg
会弹出一个错误信息框。显示您已经成功绕过该反调试。
以上的方法并不一定能绕过这个反调试,其实我们可以通过将OLLYDBG.EXE创建一个副本,将其重命名为PIRULO.EXE,然后运行该程序,被其调试的程序将无法找到一个进程名为OLLYDBG的进程了。
image120.jpg
有一点很重要就是在OD的文件夹下面留一个原始的OD,避免OD的插件出现问题。
image122.jpg
以上只是该程序检测OllyDbg的一部分,如果我们输入正确的序列号,该程序还会调用其他的一些API函数来检测是否被OD调用,我们下一章再来详细讨论。

本系列文章汉化版转载看雪论坛

感谢原作者:RicardoNarvaja(西班牙人)
原作者个人主页:http://www.ricardonarvaja.info/

感谢热心翻译的朋友:
1~3章译者:BGCoder
4~58章译者:安于此生

全集配套程序下载地址:
链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv



评分

参与人数 9HB +5 THX +6 收起 理由
花盗睡鼠 + 2 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
Jawon + 1
一路走来不容易 + 1
消逝的过去 + 1
我是好人 + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
ghostxu + 1 [吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守!
jaunic + 1
hackysh + 1
lies + 1

查看全部评分

吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
hanjunhao 发表于 2019-7-15 21:31 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
头像被屏蔽
别管我了行 发表于 2022-3-1 03:39 | 显示全部楼层

提示: 作者被禁止或删除 内容自动屏蔽
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
ghostxu 发表于 2022-3-14 22:01 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
凌夏随缘 发表于 2022-6-13 15:38 | 显示全部楼层

谢谢楼主分享
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
曾经沧海 发表于 2023-4-4 10:14 | 显示全部楼层
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
一生逍遥 发表于 2023-4-20 10:44 | 显示全部楼层

学习中牛掰
吾爱汇编论坛-学破解,防破解!知进攻,懂防守!逆向分析,软件安全!52HB.COM
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

警告:本站严惩灌水回复,尊重自己从尊重他人开始!

1层
2层
3层
4层
5层
6层
7层

免责声明

吾爱汇编(www.52hb.com)所讨论的技术及相关工具仅限用于研究学习,皆在提高软件产品的安全性,严禁用于不良动机。任何个人、团体、组织不得将其用于非法目的,否则,一切后果自行承担。吾爱汇编不承担任何因为技术滥用所产生的连带责任。吾爱汇编内容源于网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除。如有侵权请邮件或微信与我们联系处理。

站长邮箱:SharkHeng@sina.com
站长QQ:1140549900


QQ|RSS|手机版|小黑屋|帮助|吾爱汇编 ( 京公网安备11011502005403号 , 京ICP备20003498号-6 )|网站地图

Powered by Discuz!

吾爱汇编 www.52hb.com

快速回复 返回顶部 返回列表