好友
阅读权限10
听众
最后登录1970-1-1
|
OD载入目标程序
OD设置不忽略内存访问异常,
00409000 >60pushad 载入后停在这里
00409001E8 01000000 call UnPackMe.00409007
00409006- 73 83 jnb short UnPackMe.00408F8B
00409008C40485 F546E801 les eax,fword ptr ds:[eax*4+1E846F5]
0040900F0000add byte ptr ds:[eax],al
0040901100E8add al,ch
0040901383C4 04 add esp,4
004090160F88 03000000 js UnPackMe.0040901F
0040901C66:13DF adc bx,di
0040901FE8 01000000 call UnPackMe.00409025
004090247A 83 jpe short UnPackMe.00408FA9
隐藏下OD,F9运行,看堆栈
0012FF78 0012FFE0指针到下一个 SEH 记录
0012FF7C 0041A731SE 句柄 //注意这里SE 句柄
0012FF80 00000001
0012FF84 0000003A
0012FF88 00004F62
在汇编窗口CTRL+G 输入0041A731
在0041731右键设置内存访问断点,SHIFT+F9运行
0041A7318B5C24 0C mov ebx,dword ptr ss:[esp+C]
0041A7358383 B8000000 0>add dword ptr ds:[ebx+B8],2
0041A73C33C0xor eax,eax
0041A73EC3retn
0041A73F64:67:FF36 0000 push dword ptr fs:[0]
0041A74564:67:8926 0000 mov dword ptr fs:[0],esp
0041A74B33C0xor eax,eax
在0041731 F2下断,SHIFT+F9运行
0041A7818B048Emov eax,dword ptr ds:[esi+ecx*4]
0041A7848B5C8E 04 mov ebx,dword ptr ds:[esi+ecx*4+4]
0041A78833C3xor eax,ebx
0041A78AC1C8 02 ror eax,2
0041A78D2BC2sub eax,edx
0041A78F81F2 CC5F1FD5 xor edx,D51F5FCC
0041A79589048Emov dword ptr ds:[esi+ecx*4],eax
在0041A781 F2下断,SHIFT+F9运行
0041A79589048Emov dword ptr ds:[esi+ecx*4],eax
0041A79849dec ecx
0041A799^ EB E1 jmp short UnPackMe.0041A77C
0041A79B61popad
0041A79C61popad
0041A79DC3retn
取消断点和内存断点后,在0041A79D F4运行到这里
ALT+M 在CODE段下断,在SHIFT+F9运行
内存映射,项目 23
地址=00401000
大小=00003000 (12288.)
物主=UnPackMe 00400000
区段=.text
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
到了这里,这里就是OEP了,记下OEP入口地址 004011A4
004011A4- E9 846E0000 jmp UnPackMe.0040802D
004011A9CCint3
004011AACCint3
004011ABCCint3
004011ACCCint3
004011ADCCint3
004011AE0000add byte ptr [eax], al
004011B00000add byte ptr [eax], al
004011B20000add byte ptr [eax], al
004011B43000xor byte ptr [eax], al
往上看看
0040118C- FF25 44104000 jmp dword ptr [401044] ; MSVBVM60.EVENT_SINK_QueryInterface
00401192- FF25 30104000 jmp dword ptr [401030] ; MSVBVM60.EVENT_SINK_AddRef
00401198- FF25 3C104000 jmp dword ptr [40103C] ; MSVBVM60.EVENT_SINK_Release
0040119E- FF25 78104000 jmp dword ptr [401078] ; MSVBVM60.ThunRTMain
004011A4- E9 846E0000 jmp UnPackMe.0040802D
看到这0040119E- FF25 78104000 jmp dword ptr [401078] ; MSVBVM60.ThunRTMain应该知道是VB的程序,典型的VB入口,但是在我们这里下面是被抽了代码
下面找被抽的代码
大家都知道,VB的入口是
Microsoft Visual Basic 5.0 / 6.0
00401166- FF25 6C104000 JMP DWORD PTR DS:[<&MSVBVM60.#100>]; MSVBVM60.ThunRTMain
0040116C >68 147C4000 PUSH PACKME.00407C14
00401171E8 F0FFFFFF CALL <JMP.&MSVBVM60.#100>
004011760000ADD BYTE PTR DS:[EAX],AL
004011780000ADD BYTE PTR DS:[EAX],AL
0040117A0000ADD BYTE PTR DS:[EAX],AL
0040117C3000XOR BYTE PTR DS:[EAX],AL
或省略第一行的JMP
00401FBC >68 D0D44000push dumped_.0040D4D0
00401FC1E8 EEFFFFFFcall <jmp.&msvbvm60.ThunRTMain>
00401FC60000 add byte ptr ds:[eax],al
00401FC80000 add byte ptr ds:[eax],al
00401FCA0000 add byte ptr ds:[eax],al
00401FCC3000 xor byte ptr ds:[eax],al
00401FCE0000 add byte ptr ds:[eax],al
这里有一个这样的方法,找到VB程序的这一句入口,
JMP DWORD PTR DS:[<&MSVBVM60.#100>]; MSVBVM60.ThunRTMain
在这个JUMP下断,在我这里是找到OEP上句就是了0040119E
F2在0040119E下断,SHIFT+F9运行,注意堆栈窗口
0012FFBC 00408079UnPackMe.00408079
0012FFC0 00402D40UnPackMe.00402D40
0012FFC4 7C816FF7返回到 kernel32.7C816FF7
我特意找了几个VB的程序看看它的入口特征,发现在堆栈窗口里的
"返回到 kernel32.7C816FF7" 这句的上一句就是push的地址,在这里的是00402d40
在堆栈窗口中的00402d40处点右键-数据窗口中跟随
用十六进制查看
00402D4056 42 35 21 1C 23 76 62 36 63 68 73 2E 64 6C 6CVB5!#vb6chs.dll
看到没有,被push的地址是VB5!#vb6chs.dll
感觉有点投机取巧,但是我查看了N个VB程序用了这种方法都可以找到被抽的字节
这应该算是一种规律吧
CTRL+G 输入 004011A4 回车,
回到原来的OEP入口,把下面的NOP掉
004011A4- E9 846E0000 jmp UnPackMe.0040802D
004011A9CCint3
004011AACCint3
004011ABCCint3
004011ACCCint3
004011ADCCint3
依次填上
push 00402D40
call0040119E
代码补回来了
004011A468 402D4000 pushUnPackMe.00402D40
004011A9E8 F0FFFFFF callUnPackMe.0040119E; jmp 到 MSVBVM60.ThunRTMain
004011AE0000add byte ptr [eax], al
004011B00000add byte ptr [eax], al
004011B20000add byte ptr [eax], al
004011B43000xor byte ptr [eax], al
取消所有断点后,用LOADPE把程序dump出来,ImportRec修复,OEP填上11A4 修复后,收工
UnPackMe16脱文与附件.rar |
|