Quantcast
Channel: 看雪安全论坛
Viewing all articles
Browse latest Browse all 9556

分析一种通过修改PE实现的反调试

$
0
0
菜鸟笔记

昨天晚上又拿起CrackMe 2007的一个CrackMe来玩(aalloverred做的znycuk's cracKme#3),发现那个PE根本无法用OD加载,一加载就说这个PE的格式错误了

破文上解释说是因为LoaderFlags和RvaAndSizes(数据目录项)被修改成了一个很大的数值。其实LoaderFlags并不影响OD的调试,只是RvaAndSizes影响而已。

以后可能也想写一个壳+顺便提升逆向能力,所以分析下OD是怎么被这个反调试trick欺骗的也好。

用OD来调试OD,感觉总有点怪怪的(被调试的OD打开反调试CrackMe)

在错误的信息框下暂停,然后在堆栈中找到调用位置,定位到关键跳之后一直回溯,看不出什么东西来

然后用C32把RvaAndSizes设置为AAAA, 再加载OD在内存里面搜索AAAA就知道其应该被存放的位置了,找到之后下个硬件断点就能找到OD读取RvaAndSizes的位置了

(但是当时我用的是傻瓜办法,在前面一些位置下int 3断点,然后盯着AAAA的位置,什么时候修改了就是在哪读取的)

现在再下一个内存访问断点,定位到了以下代码:
代码:

0045C653    .  0FB795 34FAFFFF      movzx edx,word ptr ss:[ebp-5CC] 
0045C65A    .  81C2 80000000        add edx,80 
0045C660    .  8B8D A0F9FFFF        mov ecx,dword ptr ss:[ebp-660] 
0045C666    .  C1E1 03              shl ecx,3 
0045C669    .  81C1 E0000000        add ecx,0E0 
0045C66F    .  3BD1                  cmp edx,ecx 
0045C671    .  7D 07                jge short OllyICE.0045C67A 
0045C673    .  C745 F4 02000000      mov dword ptr ss:[ebp-C],2    ;  这个位置变成了2

可选头大小E0+可选头不包括数据目录部分的大小128 跟 数据目录项*8(正常情况下等于128)+可选头大小E0
前者小于后者则fail
再后面的代码如果看到[ebp-C]的就会弹错误框的了,所以我找了下附近将[ebp-C]修改成2的语句(这些语句前面都有cmp var,const这样的语句,在比较PE的字段)

找到了个比较10B的,就是010B咯,这个数字比较熟悉。。是PE的标志(普通可执行映像)

但是这个修改了程序会无法运行,有时间再找其他的吧,吃早餐去。。

Viewing all articles
Browse latest Browse all 9556


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>