命运舞姬 发表于 2015-6-25 08:49:33

内存断点原理3

iii.实战
好吧,来弄一个猛壳怎么样:
这个壳是一个hying的旧版,我们用他来实验一下我们内存断点法。
OD载入以后来到这里
CODE:
0040D000 u> 56     push esi    //这里
0040D001 52     push edx
0040D002 51     push ecx
0040D003 53     push ebx
0040D004 55     push ebp
0040D005 E8 15010000    call unpackme.0040D11F

根据跟过一次的经验我们将先设置,除int3异常以外忽略其他异常,SHIFT+F9
CODE:
003725B9 90     nop     //到这里
003725BA 8BCD     mov ecx,ebp

然后再设置除“除零”异常外,忽略其他异常。SHIFT+F9
CODE:
00372660 F7F3     div ebx    //到这里
00372662 90     nop

下面是多的单步异常,太麻烦我们不管他,现在开始用内存断点的方法。
对code段下内存访问断点,希望他已经解压完毕。F9
CODE:
0040D19D A4     movs byte ptr es:,byte ptr ds:    //还没解完呢
0040D19E B3 02    mov bl,2

对data段下内存“写入”断点,试试看他是不是要写data段。
CODE:
00372712 F3:A4    rep movs byte ptr es:,byte ptr ds: //断到这里
00372714 5E     pop esi

下面再对code段下内存访问断点。F9
CODE:
00372855 8907     mov dword ptr ds:,eax       ; SHELL32.DragFinish //这里是对IAT加密的地方了!!!
00372857 5A     pop edx
00372858 0FB642 FF    movzx eax,byte ptr ds:
0037285C 03D0     add edx,eax
0037285E 42     inc edx
0037285F 83C7 04    add edi,4
00372862 59     pop ecx
00372863 ^ E2 A9    loopd short 0037280E
00372865 ^ E9 63FFFFFF    jmp 003727CD
0037286A 8BB5 93060000    mov esi,dword ptr ss:       //到这里下断F2

现在如果再对data下访问断点已经是没用了。这时应该格外的小心。
我们现在就想既然这一段是对code解码的,那么我们就绕过他吧!
到0037286A下断F2,然后清除内存断点!!!!
F9以后停在这里,继续对code下内存访问断点。
看看左下角还在解码,哎~真是麻烦!
CODE:
003728E1 /EB 1D    jmp short 00372900
003728E3 |25 FFFFFF7F    and eax,7FFFFFFF
003728E8 |0385 83060000    add eax,dword ptr ss:
003728EE |2B85 8F060000    sub eax,dword ptr ss:
003728F4 |8BDE     mov ebx,esi
003728F6 |2BD8     sub ebx,eax
003728F8 |8958 FC    mov dword ptr ds:,ebx       //停在这里
003728FB |83C7 08    add edi,8
003728FE ^|EB DB    jmp short 003728DB
00372900 \64:FF35 30000000 push dword ptr fs:       //清除内存断点以后到这里下断,F9

又一段解码的代码,再次使用上面的办法手动跳出去。
现在继续对code段下内存访问断点!!F9以后到达这里。
CODE:
004010CC FFD7     call edi        ; unpackme.004010CE //OEP哦
004010CE 58     pop eax
004010CF 83EC 44    sub esp,44
004010D2 56     push esi
004010D3 90     nop
004010D4 E8 B518F7FF    call 0037298E
004010D9 8BF0     mov esi,eax

呵呵~虽然不是我们熟悉的OEP,但是地址是没错了,况且根据我们的步骤,我可以很肯定的说这是code段的第一次“执行”中断!
所以这就是OEP了
总结一下:当我们在寻找OEP的时候,要多次对code下断“赌”一“赌”他解压完毕,如果不是就对别的段试试~如果程序跑飞了,那就没办法了,重来呗~其实说起来要赌的是:当data段,idata段,rsrc段摆在你的面前,你会好好“珍惜”那个段,不过还好上天还会给我们从来一次的机会(ctrl+F2 ^_^),那么我们会对那个不会跑飞的段说3个字----“先断你”如果非要在上面加一个次数,我希望是“一次内存断点就好了”

海潮 发表于 2015-6-25 13:41:26

沙发,学习!

woaijiang1 发表于 2015-6-26 11:20:52

谢谢老师,辛苦了了

小云天 发表于 2015-6-26 17:57:08

谢谢分享好好学习天天向上

nikkitang 发表于 2015-6-27 17:07:35

每天坚持学习,慢慢进步,加油!

332936 发表于 2017-12-15 11:31:00

每天坚持学习,慢慢进步,加油!
页: [1]
查看完整版本: 内存断点原理3