TA的每日心情 | 难过 2017-11-14 11:03 |
---|
签到天数: 43 天 [LV.5]常住居民I
高级会员
- 积分
- 1830
|
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
[Copy to clipboard]
根据跟过一次的经验我们将先设置,除int3异常以外忽略其他异常,SHIFT+F9
CODE:
003725B9 90 nop //到这里
003725BA 8BCD mov ecx,ebp
[Copy to clipboard]
然后再设置除“除零”异常外,忽略其他异常。SHIFT+F9
CODE:
00372660 F7F3 div ebx //到这里
00372662 90 nop
[Copy to clipboard]
下面是多的单步异常,太麻烦我们不管他,现在开始用内存断点的方法。
对code段下内存访问断点,希望他已经解压完毕。F9
CODE:
0040D19D A4 movs byte ptr es:[edi],byte ptr ds:[esi] //还没解完呢
0040D19E B3 02 mov bl,2
[Copy to clipboard]
对data段下内存“写入”断点,试试看他是不是要写data段。
CODE:
00372712 F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[esi] //断到这里
00372714 5E pop esi
[Copy to clipboard]
下面再对code段下内存访问断点。F9
CODE:
00372855 8907 mov dword ptr ds:[edi],eax ; SHELL32.DragFinish //这里是对IAT加密的地方了!!!
00372857 5A pop edx
00372858 0FB642 FF movzx eax,byte ptr ds:[edx-1]
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:[ebp+693] //到这里下断F2
[Copy to clipboard]
现在如果再对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:[ebp+683]
003728EE |2B85 8F060000 sub eax,dword ptr ss:[ebp+68F]
003728F4 |8BDE mov ebx,esi
003728F6 |2BD8 sub ebx,eax
003728F8 |8958 FC mov dword ptr ds:[eax-4],ebx //停在这里
003728FB |83C7 08 add edi,8
003728FE ^|EB DB jmp short 003728DB
00372900 \64:FF35 30000000 push dword ptr fs:[30] //清除内存断点以后到这里下断,F9
[Copy to clipboard]
又一段解码的代码,再次使用上面的办法手动跳出去。
现在继续对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
[Copy to clipboard]
呵呵~虽然不是我们熟悉的OEP,但是地址是没错了,况且根据我们的步骤,我可以很肯定的说这是code段的第一次“执行”中断!
所以这就是OEP了
总结一下:当我们在寻找OEP的时候,要多次对code下断“赌”一“赌”他解压完毕,如果不是就对别的段试试~如果程序跑飞了,那就没办法了,重来呗~其实说起来要赌的是:当data段,idata段,rsrc段摆在你的面前,你会好好“珍惜”那个段,不过还好上天还会给我们从来一次的机会(ctrl+F2 ^_^),那么我们会对那个不会跑飞的段说3个字----“先断你”如果非要在上面加一个次数,我希望是“一次内存断点就好了”
|
|