前言
看到一个小工具,用来查一个指定壳.
主要是size很小,只有9KB.
想逆向练习下,这么小,一定是没壳的,拖进IDA,一个函数都没有,才知道加了壳.
用PEID,Die,RDG查壳,都指出是UPX.
载入OD,ESP定律,F9后,直接停在jmp xx,再F8,到了OEP.
记录
00401074 68 F41B4000 push 00401BF4
00401079 E8 EEFFFFFF call 0040106C ; jmp to MSVBVM50.ThunRTMain
VB的OEP特征:
一个push + 一个call
call是MSVBVM50.ThunRTMain
push的内容是一个字符串”VB5!”
00401BF4 56 42 35 21 8C 0E 2A 00 00 00 00 00 00 00 00 00 VB5!?*.........
如果知道是VB的程序,在程序跑起来后,找OEP的方法.
Memory map,item 22
Address=00401000
Size=00008000 (32768.)
Owner=IsItArma 00400000
Section=UPX0
Type=Imag 01001002
Access=R
Initial access=RWE
- goto 到 00401000
- 右键菜单,搜索2进制字符串,填入Ascii字符串VB5!,开始搜索.
在代码中搜到了2进制字符串”VB5!”,不容易看出是字符串,CTRL_L只有这一个地方.
用”Analyze This”插件分析一下,可以看出是字符串了.
00401BF2 . FFE1 jmp ecx
00401BF4 56 db 56 ; CHAR 'V'
00401BF5 42 db 42 ; CHAR 'B'
00401BF6 35 db 35 ; CHAR '5'
00401BF7 21 db 21 ; CHAR '!'
00401BF8 8C db 8C
00401BF9 0E db 0E
00401BFA 2A db 2A ; CHAR '*'
00401BFB 00 db 00
可以看出”VB5!”字符串地址为00401BF4.
因为VB程序的OEP特征是:
push offset “VB5!”
call MSVBVM50.ThunRTMain
所以确定了offset “VB5!”之后,可以搜指令 push offset “VB5!”,即搜索 push 00401BF4
代码区 => search for => Command,这样找还找不到,要先删除OD的分析后,再查找才能找到.
还可以找字符串的地址参考
去00401075看看.
00401072 00 db 00
00401073 00 db 00
00401074 68 db 68 ; CHAR 'h'
00401075 F41B4000 dd IsItArma.00401BF4
00401079 E8 db E8
0040107A EE db EE
0040107B FF db FF
0040107C FF db FF
0040107D FF db FF
00401072 0000 add byte ptr [eax],al ; this is VB's OEP
00401074 68 F41B4000 push 00401BF4
00401079 E8 EEFFFFFF call 0040106C ; jmp to MSVBVM50.ThunRTMain
0040107E 0000 add byte ptr [eax],al