最近试着分析找了一下VMP3.31保护下的oep,以前从没分析过,第一次分析还是挺有意思的,打算和大家说说我找oep的旅途,错误纰漏处还请指正包涵。
找暂停点,不仅仅是为了下硬件断点,
下断 CreateToolhelp32Snapshot
run2次
对vmp0下内存执行断点并且run
停在vmp0区段
先把ep第一行nop掉(避免首字节int3检测),ep第二行改成jmp 0x45e53e,使程序只跑在ep这一段代码。
这样做有2个好处:
1.尽量减少原程序的干扰(例如API的调用)
2.跑起来后,直接下断停住,观察寄存器和和堆栈有什么“特点”,同时还可以与初始环境对比。
(我想先试试内存断点快速找到OEP。
一试,要么被抓到(反调试),要么程序没停住。。。
根据第二种情况,我又试图下断VirtualProtect,看看有没有改写text区段的属性。
结果断是断下了很多次,但是并没有看见对text区段的操作,这时我猜测可能模拟wow64直接走syscall了,但这个应付起来有点麻烦,暂且不管,先试试别的方法。)
现在,出现在我脑袋里的是第二个方法:对比环境
左图为初始环境,右图为oep环境
先扫一遍寄存器,都跟OEP无关。再看ebp和esp,发现没有改变,这是个好事
再看堆栈,esp-4处(19FF80)出现了OEP(45E53D)。猜测是push oep,再retn过来的
为了证实这个猜测,我把VMP的反调试选项关闭(解除硬件断点检测的干扰),重新加壳,直接对esp-4处下硬件访问断点。
一路run,run到了oep。(同时多次重新加壳,重复这个操作,都没问题。)
至此,oep已经能锁定。
由于之前VirtualProtect成功停下过,先试试这个。
下断,run9次后跑飞。那就在run8次后停下,下硬件断点,run,看看会不会检测到。
很幸运,此时已经躲过硬件断点检测了,成功到达oep。
(同时,我又想到一个念头。既然躲过了硬件断点检测,那内存断点检测是否也不在了。
对此,我在text下内存执行断点,runrunrun。结果一直被停在text区段各个retn上面(应该是vmp为了对付内存断点的手段),run到后面还被反调试查出来了。这个方法宣告死亡)
之前第一个方法用VirtualProtect。感觉能找到API,运气成分很大。换别的壳可能就找不到这种API了。
遂想试试第二种方法,稳妥点找到一个API(用的是API Monitor)
(虽然vmp从3.1开始有wow64模拟,但是现在看来,wow64模拟也没有模拟全部API。)
找API时尽量按以下要求找:
1.从后往前找,越后面调用的API越好
2.尽量不选被检测的API
3.下断API后,run到跑飞的次数要尽可能是固定的(需要多次测试)
4.需要run的次数越少越好(但检测必须已run过去)。
对比,我一直从下往上找,找到了一个适用的
但是这个API有点“不完美”,或者说太底层了。每次重新加载程序,都会在这里停10次左右。
对此,我停住后往下单步走,跟到了壳调用的API
经过多次测试,这个API就很不错,适合做暂停点。不管是默认加壳,还是全保护加壳,都只需要断2次(VirtualProtect会因此需要改变中断次数),便可以下硬件断点
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-6-30 11:34
被Lixinist编辑
,原因: 很多人看不懂,优化文章,添加思维导图