Shark恒 发表于 2015-1-20 16:36

使用OllyDbg从零开始Cracking 第二十三章-OllyDbg反调试之ProcessHeap,NTGlobalFla...

       第二十三章-OllyDbg反调试之ProcessHeap,NTGlobalFlag,OutputDebugStringA本章是反调试的最后一章,本章将介绍ProcessHeap和NTGlobalFlag标志位以及如何通过这两个标志位进行反调试,介绍完这部分内容我们就掌握了常见的反调试技巧。反调试的手法还有很多,我们介绍的只是最基本,最常见的。像一些保护壳,比如说Execryptor的反调试是比较厉害的,我们后面再介绍。Execryptor壳除了我们介绍的这几种反调试以外,还有别的反调试手法,它的每个新版本都会增加一些新的反调试选项,这都是后话了,我们先来把常规的反调试手法介绍完。HideOD插件中提供绕过这个两个标志检测的选项,我们来看看。HideOD插件见附件,上一章也提供了,红圈标注的就是绕过ProcessHeap和NTGlobalFlag两个标志位的选线,我们首先还是来手工绕过这个两个标志位的检测吧。这两个标志置位的话表示当前进程正在被调试,很容易定位到这两个标志位。不知道大家还记得不得IsDebuggerPresent对应的那个调试标志位是如何定位的,如果你不记得的话,回头去看看第19章,如果你弄明白如何定位那个标志位的话,那么这两个标志位也就好定位了,因为这两个标志位就在那个标志位的附近。由于勾选上HideNtDebugBit选项,就会绕过ProcessHeap和NTGlobalFlag的检测,这里我们不勾选。这里我们的实验对象是Cruehead’a的CrackMe,我们首先来定位这两个标志位。我们用OD加载该CrackMe,并确保HideOD插件的配置如上图所示。好了,我们现在来看看如何手工定位和修改ProcessHeap和NTGlobalFlag这两个标志位。我们先定位到第19章介绍过的IsDebuggerPresent的那个标志,最简单的做法就是EIP在入口点处时找到EBX寄存器的值,然后单击鼠标右键选择-Follow in Dump。完整的定位流程你可以回头看第19章。我们在数据窗口中定位到该标志位,我机器上的这个地址可能与你的不同,而且,该程序每次重新启动该地址也可能不同。我们知道IsDebuggerPresent是获取该标志位来检测是否被调试的,NTGlobalFlag就在它的隔壁,嘿嘿,我们只需要将EBX的值加上0x68就可以定位NTGlobalFlag标志位,当前,EBX的值为7FFDA000,加上0x68等于7FFDA068。这就是NTGlobalFlag标志位,当前不为零表示正在被调试,我们来手工将其修改为零。这里把该标志修改为零了。我们可以看到NtGlobalFlag标志清零了。现在我们来定位另一个标志ProcessHeap,也很容易定位。同样是EIP在入口点处时定位到EBX的值,然后将EBX的值加上0x18,我机器上ProcessHeap的值为0x140000,这是程序刚启动的时候创建的一块堆内存空间,该内存是用来保存一些重要的数据的,好了,我们知道这些就够了。我们来看看堆中保存了些什么。我们选中这4个字节,单击鼠标右键选择-Follow DWORD in Dump就可以在数据窗口中定位该堆空间了。偏移0x10的位置的4个字节就是HeapFlags标志了,当前为零,表示当前没有被调试,这是加载了HideOD和HideDebugger插件的原因,我们不加载这两个插件然后打开该CrackMe。现在该DWORD就不为零,表示当前正在被调试,但是使用了某些插件的话,即使我们不设置绕过ProcessHeap的选项,该DWORD也会变为零。现在我们勾选上HideOD插件的HideNtDebugBit的选项。我们重新启动cruehead’a的CrackMe。断在入口点处,我们定位到IsDebuggerPresent以及NtGlobalFlag标志,可以看到都是零,我们再来看看ProcessHeap标志。也是零,说明HideOD插件起作用了。至此,我们就学会了如何手工定位和修改ProcessHeap和NTGlobalFlag标志。接下来我们看看OutputDebugStringA选项。和这里要提到一点就是:OllyDbg存在一个bug-当被调试程序通过OutputDebugString输出超长的一串调试字符串的时候,OllyDbg无法处理导致崩溃。我们可以通过上面的插件中的OutputDebugStringA选项来修复OD的这个bug。这里我引用Juan Jose的execryptor脱壳教程中一段话来解释:上图中Juan Jose的说法是:“可以通过OutputDebugStringA输出一长串%s字符串,OD无法处理这么长一串字符串,就会发生错误。我们可以使用HideDebuggger插件来修复这个bug。这里我给OutputDebugStringA传递的参数是长度为100的%s字符串。”以上就是Juan Jose的教程中描述。通过HideDebuggger插件的OutputDebugString exploit选项我们可以修复OD的这个bug。好了,这里给大家留一个小练习,名字叫做antisocial1。在这里例子中大家可以看到我们前面介绍过的反调试技巧,同时还夹杂着其他的反调试,嘿嘿,大家发挥自己的想象来解决这个反调试吧。(下面一点点是作者关于这个练习的提示,这里就不做翻译了,挺绕的,嘿嘿,下一章里面对这个例子会有详细介绍)
本系列文章汉化版转载看雪论坛
感谢原作者:RicardoNarvaja(西班牙人) 原作者个人主页:http://www.ricardonarvaja.info/
感谢热心翻译的朋友:1~3章译者:BGCoder4~58章译者:安于此生
全集配套程序下载地址:链接: http://pan.baidu.com/s/1eQzTWfo 密码: vytv


hackysh 发表于 2022-2-20 00:27


[快捷回复]-感谢楼主热心分享!

ghostxu 发表于 2022-2-25 08:01

这么厉害!必须给个红包鼓励下~

别管我了行 发表于 2022-3-1 03:43

曾经沧海 发表于 2023-4-4 10:17

感谢分享。正在试用。

一生逍遥 发表于 2023-4-20 10:48

看了兄弟的分享, 我也脱离苦海了,哈哈

游侠啊 发表于 2023-4-21 16:14

好东西啊,谢谢楼主分享
页: [1]
查看完整版本: 第二十三章-OllyDbg反调试之ProcessHeap_NTGlobalFlag_OutputDebugStringA