枫笑九洲 发表于 2017-12-14 13:10

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

枫笑九洲 发表于 2017-12-14 13:13

软件下载地址忘记写了
【软件名称】: 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

fengrui99 发表于 2017-12-14 13:27

TMD壳感觉好难

SouthCity 发表于 2017-12-14 13:43

感谢分享

yhlko1388 发表于 2017-12-14 13:54

不错,支持了

zhaozenghz 发表于 2017-12-14 13:57

感谢教程 新手学习学习

736148001 发表于 2017-12-14 14:36

我记得TMD的壳 我以前手脱过 他有个地方就是弄API的 把他JMP掉然后找OEP 就可以直接修复了

ljg1479 发表于 2017-12-14 15:41

这个好,学习了,研究研究

kk1212 发表于 2017-12-14 16:58

原创的文章可以学到很多新的方式

九处 发表于 2017-12-14 17:04

看不懂。。。。。。。。。
页: [1] 2 3 4 5
查看完整版本: TMD壳的脱壳(可能是2.1.8)