-
-
[原创]X64过调试器检测一例
-
发表于:
2015-6-26 22:00
7987
-
前几天搞了一个程序,该程序有32位和64位两种。猜测这两个用的肯定是同一个代码。因为目前32位程序保护措施比较成熟。跟了一下32位的,发现加了一个starforce的壳,看到这个名字,我就很知趣的退出了,因为凭我的能力,完全搞不定starforce。
所以把目光放在了64位程序上。用了最新的x64dbg,载入程序一看,提示检测到调试器。所以第一步就是过调试器检测。
在Win7 64系统下,调试器检测使用的是IsDebuggerPresent这个API函数,在这个函数上下断点,就会触发中断,这个函数在kernel32.dll中,由kernelbase.dll调用。因此,该API函数调用后,返回到kernelbase.dll中,然后再返回到程序中,如果有调试器存在,则rax=1,否则rax=0。
然后就可以修改程序中,对rax检测的代码,就可以过调试器了。
不过,有个地方给我留的空间太少,怎么修改代码都差一个字节,因此,突发奇想,想到了修改kernelbase.dll,让它直接返回0不就可以了么。
于是,修改如下。
将下面第三行,原来本是movzx eax,byte ptr ds:[rcx+2],修改为movzx eax,byte ptr ds:[rcx+1]
如下图所示。
000007FEFDADA6A0 65 48 8B 04 25 30 00 00 mov rax,qword ptr gs:[30]
000007FEFDADA6A9 48 8B 48 60 mov rcx,qword ptr ds:[rax+60]
000007FEFDADA6AD 0F B6 41 01 movzx eax,byte ptr ds:[rcx+1]
000007FEFDADA6B1 C3 ret
这样,无论是否有调试器存在,rax的返回值都是0。这样就可以骗过程序了。
然后,就是拿出PE启动盘,启动后,将修改后的kernelbase.dll替换掉系统中的对应文件。(c:\windows\system32\kernelbase.dll)。
注意,因为权限问题,我的机子无法选择覆盖原文件,所以只能把原文件删除后,再把破解过的复制过去。
再用调试器载入程序,哈哈,顺利通过,没有告警。
总结:现在的32位程序保护非常成熟,手段五花八门,给破解增加了极大的困难。但好在,目前对于64位程序的加壳保护软件几乎没有,所以大部分64位程序都是没有壳的,包括一些商业软件,游戏软件等。这样就给了我们一段宝贵的真空期,至少目前这段时间里,64位程序还是相对好分析破解的。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)