|
1、用PEID查壳,发现是TMD壳,我是新手,不知道是哪个版本(可能是2.1.8),载入OD,停在
008E1000 > 83EC 04 sub esp,0x4
008E1003 50 push eax
008E1004 53 push ebx
008E1005 E8 01000000 call PDF2Word.008E100B
2、先找OEP
在代码段下内存写入断点,F9运行,停在
007DB41B F3:A4 rep movs byte ptr es:[edi],byte ptr ds:[>
007DB41D C685 6C25B711 5>mov byte ptr ss:[ebp+0x11B7256C],0x56
007DB424 B8 396D1FD4 mov eax,0xD41F6D39
007DB429 50 push eax
F8步过,再次F9,停在
007EF98E 8928 mov dword ptr ds:[eax],ebp ; winmm.midiStreamOut
007EF990 5D pop ebp ; winmm.midiStreamOut
007EF991 FC cld
007EF992 AD lods dword ptr ds:[esi]
007EF993 F9 stc
删内存断点,下断bp ZwFreeVirtualMemory,F9运行,注意观察寄存器EDI的值,当按F9前后两次EDI的值一样时,
删除断点,在代码断内存访问断点,F9运行,来到OEP
0046A43F /. 55 push ebp
0046A440 |. 8BEC mov ebp,esp
0046A442 |. 6A FF push -0x1
0046A444 |. 68 A82C6A00 push PDF2Word.006A2CA8
0046A449 |. 68 14CD4600 push PDF2Word.0046CD14 ; SE 处理程序安装
注意数据窗口,
0048D000 03010000
0048D004 03020000
0048D008 03021038
0048D00C 03030000
0048D010 03040000
0048D014 00000000
0048D018 5D17D578 comctl32.ImageList_GetImageCount
0048D01C 5D17B66C comctl32.ImageList_SetBkColor
发现有的api正常,有的api被壳改成了自己的函数,我们先进03020000里面去看看
里面有大量的花指令,仔细的跟下,去掉花指令后,有用的几条:
03010000 6A 2C push 0x2C
03010012 68 E3D04927 push 0x2749D0E3
03010032 813424 FB3C9350 xor dword ptr ss:[esp],0x50933CFB
03010052 E8 ED68D974 call advapi32.77DA6944
中间两条手动计算下,变成
03010000 > 6A 2C push 0x2C
03010012 68 18ECDA77 push 77DAEC18
03010052 E8 ED68D974 call advapi32.77DA6944
去advapi32定位,发现是advapi32.RegSetValueExA函数。
3,找api写入点
重新载入程序,在.code段下内存写入断点,F9运行,F8单步,F9运行,来到
007EF98E 8928 mov dword ptr ds:[eax],ebp ; winmm.midiStreamOut
007EF990 5D pop ebp ; winmm.midiStreamOut
007EF991 FC cld
007EF992 AD lods dword ptr ds:[esi]
删内存断点,在数据窗口,0048D000处,下硬件写入断点,F9运行,来到
00743A94 ^\E9 0FCFFFFF jmp PDF2Word.007409A8
00743A99 83C1 04 add ecx,0x4
00743A9C 870C24 xchg dword ptr ss:[esp],ecx
00743A9F 5C pop esp ; PDF2Word.007F24E7
查看堆栈,
0012FF2C 007F24E7 ASCII "h!
"
0012FF30 007EF8CC 返回到 PDF2Word.007EF8CC
我们在007EF8CC,F2下断,F9运行
007EF8CC /0F88 01000000 js PDF2Word.007EF8D3 //断在此处
007EF8D2 |FC cld
007EF8D3 \E9 09000000 jmp PDF2Word.007EF8E1
007EF8D8 ^ E1 FB loopde short PDF2Word.007EF8D5
007EF8DA 79 14 jns short PDF2Word.007EF8F0
接着一路F7单步跟进,直到来到
007F0136 8985 57E2C411 mov dword ptr ss:[ebp+0x11C4E257],eax ; advapi32.RegSetValueExA
007F013C 60 pushad
007F013D BB 3CCABA43 mov ebx,0x43BACA3C
007F0142 61 popad
007F0143 8B8D BE2FB711 mov ecx,dword ptr ss:[ebp+0x11B72FBE]
看见没,后面注释出现了我们第二步找到的函数,此处就是壳写入api的地址
接着我们再一次在.code段下内存写入断点,F9运行,断下
00743A92 8F02 pop dword ptr ds:[edx] ; 03030000
00743A94 ^ E9 0FCFFFFF jmp PDF2Word.007409A8
00743A99 83C1 04 add ecx,0x4
此时EDX=0048D004,栈顶为03030000,为壳自己构建的函数,而0048D004刚好就是没加壳
前advapi32.RegSetValueExA这个函数的地址
好了,到这,我们就可以整理下思路,壳先把正确的api地址写入到壳中某处,然后用自己构
建的新函数替代原iat的函数地址,我们只要先断在007F0136,把EAX的值保存,然后让程序
运行到00743A94,再把保存的值替换壳自己的函数,iat就修复成功了。
4、修复原程序中的call
iat修复成功后,用LordPE+ImportREC脱壳修复后,发现程序还是不能运行,把脱壳后的程序
扔OD中,一步步向下看,发现很多call指令变成了这样
0046A462 |. 8965 E8 mov [local.6],esp
0046A465 E8 D2696A02 call 02B10E3C //壳中的数据
0046A46A 90 nop
0046A46B |. 33D2 xor edx,edx
0046A46D |. 8AD4 mov dl,ah
4.1把原程序扔OD,在代码段下内存写入断点,F9,F8,F9后,删除内存写入断点,在007F0136处
下断,F9运行,然后再一镒代码段下内存写入断点,F9
------------------------------A处------------------------------
007EF98E 8928 mov dword ptr ds:[eax],ebp ; winmm.midiOutPrepareHeader
007EF990 5D pop ebp ; winmm.midiOutPrepareHeader
007EF991 FC cld
自建函数写入iat,再次F9
007EFE32 AA stos byte ptr es:[edi] 此时EDI=00431DB0
007EFE33 E9 08000000 jmp PDF2Word.007EFE40
007EFE38 37 aaa
007EFE39 861F xchg byte ptr ds:[edi],bl
这里就是改原程序的call,call地址就在寄存器中的EDI,2次F9后(可能3次),我们定位00431DB0
00431DB0 |. E8 10706F76 |call winmm.midiOutPrepareHeader
00431DB5 |. 90 |nop
00431DB6 |. 3BC3 |cmp eax,ebx ; PDF2Word.007F010A
00431DB8 |.^ 0F85 AEFEFFFF |jnz PDF2Word.00431C6C
原函数call,应该是这样 call dword ptr ds:[0x48D688]
通过跟踪,在4.1节F9后到达的A处首地址一共有4种变化,把每种变化都记下来,然后把在原程序中的每
个call都改过来,就可以脱壳了,这里就不一一写明了,有兴趣的同学可以逐一跟下
传个此程序的脱壳脚本. |
评分
-
参与人数 22 | 威望 +1 |
HB +42 |
THX +12 |
收起
理由
|
花盗睡鼠
| |
+ 2 |
+ 1 |
[吾爱汇编论坛52HB.COM]-学破解防破解,知进攻懂防守! |
禽大师
| |
+ 1 |
|
|
消逝的过去
| |
+ 2 |
|
|
sjtkxy
| |
+ 1 |
+ 1 |
|
鼎香楼
| |
+ 1 |
|
感谢分享 |
一路走来不容易
| |
|
+ 1 |
|
娄胖胖
| |
+ 1 |
|
|
yexing
| |
|
+ 1 |
|
zyyujq
| |
+ 1 |
|
|
MoeRay
| |
+ 1 |
|
|
三月十六
| |
+ 1 |
|
|
lies
| |
+ 1 |
|
|
Marriner
| |
+ 1 |
+ 1 |
[快捷评语]--积极评分,从我做起。感谢分享! |
1023261581
| |
+ 1 |
+ 1 |
[快捷评语]--吃水不忘打井人,给个评分懂感恩! |
hqw222
| |
+ 1 |
+ 1 |
|
nmswd
| |
+ 1 |
+ 1 |
[快捷评语]--吃水不忘打井人,给个评分懂感恩! |
chehhh
| |
+ 1 |
+ 1 |
|
lanyueliang518
| |
+ 1 |
+ 1 |
论坛的秩序需要大家共同监督与维护,感谢! |
aimee400
| |
+ 1 |
|
[快捷评语] - 2018,狗年发发发,狗年旺旺旺! |
DDK4282
| |
+ 2 |
+ 1 |
[快捷评语] - 给个评分懂感恩! |
皆笑谈
| |
+ 1 |
|
[快捷评语] - 评分=感恩!简单却充满爱!感谢您的作品! |
Shark恒
| + 1 |
+ 20 |
+ 1 |
[快捷评语] - 评分=感恩!简单却充满爱!感谢您的作品! |
查看全部评分
|