首页
社区
课程
招聘
[原创]X64过调试器检测一例
发表于: 2015-6-26 22:00 7987

[原创]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期)

收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
谢谢楼主啊
2015-6-27 13:36
0
雪    币: 53
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼主分享
2015-6-27 14:56
0
雪    币: 7752
活跃值: (4257)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
win10的怎么搞,我按照同样的方法试了下,蓝屏,报0x0000007B
2020-3-1 10:53
0
雪    币: 83
活跃值: (1087)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
已阅
2020-3-1 14:47
0
游客
登录 | 注册 方可回帖
返回
//