吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 20972|回复: 38
上一主题 下一主题
收起左侧

[原创] TMD壳的脱壳(可能是2.1.8)

  [复制链接]
跳转到指定楼层
楼主
枫笑九洲 发表于 2017-12-14 13:10 回帖奖励
本帖最后由 枫笑九洲 于 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:[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都改过来,就可以脱壳了,这里就不一一写明了,有兴趣的同学可以逐一跟下
  
  传个此程序的脱壳脚本.

  
   
--------------------------------------------------------------------------------
【版权声明】: 本文原创于枫笑九洲, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2017年12月14日 13:00:25

免费评分

参与人数 11威望 +1 吾爱币 +19 热心值 +10 收起 理由
610100 + 3 + 1 谢谢@Thanks!
wuaicom + 1 我很赞同!
龙骑666 + 1 + 1 谢谢@Thanks!
Hmily + 1 + 10 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
sikelai + 1 用心讨论,共获提升!
hbsbzb + 1 + 1 谢谢@Thanks!
废宅小五 + 1 谢谢@Thanks!
sjclch + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
kk1212 + 1 谢谢@Thanks!
duoqingpangzi + 1 + 1 用心讨论,共获提升!
qq87700906 + 1 + 1 用心讨论,共获提升!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
 楼主| 枫笑九洲 发表于 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 [eip],#8985#,2
je iat1
cmp [eip],#8F02#,2
je iat2  
cmp ecx,a
jne iat3  
cmp [eip],#8928#,2  
je iat1
//------------iat处理---------------
iat1:
bpmc
esto
bpwm bb,cc
jmp start

iat2:
mov b,edx
esto
mov ,a
cmp [eip],#8822#,2
je call1
jmp start

iat3:
mov b,eax
esto
mov ,a
cmp [eip],AA,1
je call2

call1:
mov c,edx
esto
esto
mov [c],d
add c,2
mov [c],b
cmp [eip],#8822#,2
je call1
cmp eip,aa
je start

call2:
mov c,edi  
esto
esto
cmp [eip],AB,1
je call3
mov [c],d
add c,2
mov [c],b
cmp [eip],AA,1
je call2
cmp eip,aa
je start

call3:
esto
mov [c],d
add c,2
mov [c],b
cmp [eip],AA,1
je call2
cmp eip,aa
je start

end:
bc
bpmc
bphwc
ret

免费评分

参与人数 1吾爱币 +2 热心值 +1 收起 理由
MC日月星辰 + 2 + 1 对于我这样的懒人来说,还是建议楼主给个直连下载或者百度云下载

查看全部评分

3#
fengrui99 发表于 2017-12-14 13:27
4#
SouthCity 发表于 2017-12-14 13:43
5#
yhlko1388 发表于 2017-12-14 13:54
不错,支持了
6#
zhaozenghz 发表于 2017-12-14 13:57
感谢教程 新手学习学习
7#
736148001 发表于 2017-12-14 14:36
我记得TMD的壳 我以前手脱过 他有个地方就是弄API的 把他JMP掉然后找OEP 就可以直接修复了
8#
ljg1479 发表于 2017-12-14 15:41 来自手机
这个好,学习了,研究研究
9#
kk1212 发表于 2017-12-14 16:58
原创的文章可以学到很多新的方式
10#
九处 发表于 2017-12-14 17:04
看不懂。。。。。。。。。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-27 00:59

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表