TMD壳的脱壳(可能是2.1.8)
本帖最后由 枫笑九洲 于 2017-12-17 22:48 编辑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:,byte ptr ds:[>
007DB41D C685 6C25B711 5>mov byte ptr ss:,0x56
007DB424 B8 396D1FD4 mov eax,0xD41F6D39
007DB429 50 push eax
F8步过,再次F9,停在
007EF98E 8928 mov dword ptr ds:,ebp ; winmm.midiStreamOut
007EF990 5D pop ebp ; winmm.midiStreamOut
007EF991 FC cld
007EF992 AD lods dword ptr ds:
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 处理程序安装
注意数据窗口,
0048D00003010000
0048D00403020000
0048D00803021038
0048D00C03030000
0048D01003040000
0048D01400000000
0048D0185D17D578comctl32.ImageList_GetImageCount
0048D01C5D17B66Ccomctl32.ImageList_SetBkColor
发现有的api正常,有的api被壳改成了自己的函数,我们先进03020000里面去看看
里面有大量的花指令,仔细的跟下,去掉花指令后,有用的几条:
03010000 6A 2C push 0x2C
03010012 68 E3D04927 push 0x2749D0E3
03010032 813424 FB3C9350 xor dword ptr ss:,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:,ebp ; winmm.midiStreamOut
007EF990 5D pop ebp ; winmm.midiStreamOut
007EF991 FC cld
007EF992 AD lods dword ptr ds:
删内存断点,在数据窗口,0048D000处,下硬件写入断点,F9运行,来到
00743A94^\E9 0FCFFFFF jmp PDF2Word.007409A8
00743A99 83C1 04 add ecx,0x4
00743A9C 870C24 xchg dword ptr ss:,ecx
00743A9F 5C pop esp ; PDF2Word.007F24E7
查看堆栈,
0012FF2C 007F24E7ASCII "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:,eax ; advapi32.RegSetValueExA
007F013C 60 pushad
007F013D BB 3CCABA43 mov ebx,0x43BACA3C
007F0142 61 popad
007F0143 8B8D BE2FB711 mov ecx,dword ptr ss:
看见没,后面注释出现了我们第二步找到的函数,此处就是壳写入api的地址
接着我们再一次在.code段下内存写入断点,F9运行,断下
00743A92 8F02 pop dword ptr ds: ; 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 ,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:,ebp ; winmm.midiOutPrepareHeader
007EF990 5D pop ebp ; winmm.midiOutPrepareHeader
007EF991 FC cld
自建函数写入iat,再次F9
007EFE32 AA stos byte ptr es:此时EDI=00431DB0
007EFE33 E9 08000000 jmp PDF2Word.007EFE40
007EFE38 37 aaa
007EFE39 861F xchg byte ptr ds:,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:
通过跟踪,在4.1节F9后到达的A处首地址一共有4种变化,把每种变化都记下来,然后把在原程序中的每
个call都改过来,就可以脱壳了,这里就不一一写明了,有兴趣的同学可以逐一跟下
传个此程序的脱壳脚本.
--------------------------------------------------------------------------------
【版权声明】: 本文原创于枫笑九洲, 转载请注明作者并保持文章的完整, 谢谢!
2017年12月14日 13:00:25 软件下载地址忘记写了
【软件名称】: XXPDF转换成Word转换器3.72
【下载地址】: https://www.52pojie.cn/thread-198930-1-1.html
还是上传不了附件,直接贴文本吧
TMD脱壳脚本
---------------------我是分界线--------------------------
var a
var b
var c
var d
var aa
var bb
var cc
var dd
bc
bphwcall
mov aa,007F0136 //写入api
mov bb,00401000 //代码段地址
mov cc,2F3000 //代码段大小
mov dd,0046A43F //oep
mov d,15ff
bphws aa,"x"
bphws ff,"x"
bpwm bb,cc
esto
sto
esto
start:
cmp eip,dd
je end
mov a,eax
esto
cmp ,#8985#,2
je iat1
cmp ,#8F02#,2
je iat2
cmp ecx,a
jne iat3
cmp ,#8928#,2
je iat1
//------------iat处理---------------
iat1:
bpmc
esto
bpwm bb,cc
jmp start
iat2:
mov b,edx
esto
mov ,a
cmp ,#8822#,2
je call1
jmp start
iat3:
mov b,eax
esto
mov ,a
cmp ,AA,1
je call2
call1:
mov c,edx
esto
esto
mov ,d
add c,2
mov ,b
cmp ,#8822#,2
je call1
cmp eip,aa
je start
call2:
mov c,edi
esto
esto
cmp ,AB,1
je call3
mov ,d
add c,2
mov ,b
cmp ,AA,1
je call2
cmp eip,aa
je start
call3:
esto
mov ,d
add c,2
mov ,b
cmp ,AA,1
je call2
cmp eip,aa
je start
end:
bc
bpmc
bphwc
ret TMD壳感觉好难 感谢分享 不错,支持了 感谢教程 新手学习学习
我记得TMD的壳 我以前手脱过 他有个地方就是弄API的 把他JMP掉然后找OEP 就可以直接修复了 这个好,学习了,研究研究 原创的文章可以学到很多新的方式 看不懂。。。。。。。。。