您现在的位置: 晨光科技 >> 文章 >> 技术 >> IT >> 正文  
  一步一步教你加密解密技术——压缩与脱壳(3)         
一步一步教你加密解密技术——压缩与脱壳(3)
[ 作者:佚名    转贴自:http://netsecurity.51cto.com/art/200610/33740.htm    点击数:61    更新时间:2010/11/26    文章录入:admin ]
[注:本站登载的某些文章并不代表本站支持或反对其观点或肯定其真实性]

第四节 手动脱壳

1、基本知识

手动脱壳就是不借助自动脱壳工具,而是用动态调试工具SOFTICE或TRW2000来脱壳。这课谈谈一些入门方面的知识,如要了解更深的脱壳知识,请参考《脱壳高级篇》这课。

工具

*调试器:SoftICE 、TRW2000
*内存抓取工具:Procdump等;
*十六进制工具:Hiew、UltraEdit、Hex Workshop等;
*PE编辑工具: Procdump、PEditor等;

名词概念

PE文件:Microsoft设计了一种新的文件格式Portable Executable File Format(即PE格式),该格式应用于所有基于Win32的系统:Windows NT、Windows 2000、Win32s及Windows 95/98。

★基址(ImageBase ):是指装入到内存中的EXE或DLL程序的开始地址,它是Win32中的一个重要概念。 在Windows NT中,缺省的值是10000h;对于DLLs,缺省值为400000h。在Windows 95中,10000h不能用来装入32位的执行文件,因为该地址处于所有进程共享的线性地址区域,因此Microsoft将Win32可执行文件的缺省基地址改变为400000h。

RVA:相对虚拟地址(Relative Virual Address),是某个项相对于文件映象地址的偏移。例如:装载程序将一个PE文件装入到虚拟地址空间中,从10000h开始的内存中,如果PE中某个表在映像中的起始地址是10464h,那么该表的RVA就是464h。虚拟地址(RVA)=偏移地址+基址(ImageBase )

Entry Point:入口点,就是程序在完成了对原程序的还原后,开始跳转到刚还原的程序执行,此时的地址就是入口点的值。

步骤

★确定壳的种类

一般拿到软件后,可用工具FileInfo、gtw、TYP32等侦测文件类型的工具来看看是何种壳,然后再采取措施。

★入口点(Entry Point)确定

初学者来说定位程序解壳后的入口点确定较难,但熟练后,入口点查找是很方便的。 决大多数 PE 加壳程序在被加密的程序中加上一个或多个段。 所以看到一个跨段的 JMP 就有可能是了。如:UPX 用了一次跨段的 JMP , ASPACK 用了两次跨段的 JMP 。 这种判断一般是跟踪分析程序而找到入口点,如是用TRW2000也可试试命令:PNEWSEC,它可让TRW2000中断到入口点上。
PNEWSEC
运行直到进入一个 PE 程序内存的新的 section时产生断点。(如不懂,以后到脱壳高级篇自会明白)

另外也可用D.boy的冲击波2000,它能轻易的找到任何加密壳的入口点,

★dump取内存己还原文件

找到入口点后,在此处可以用 Procdump的FULL DUMP功能来抓取内存中整个文件,
如是用TRW2000也可用命令:
makepe命令含义:从内存中整理出一个指令名称的PE格式的exe文件, 当前的 EIP 将成为新的程序入口,生成文件的 Import table 已经重新生成过了。生成的PE文件可运行任何平台和微机上。
pedump命令含义:将PE文件的内存映像直接映像到指定的文件里。生成的文件只能在本机运行,不能在其它系统平台或微机运行。

修正刚dump取的文件

如是用 Procdump的FULL DUMP功能脱壳的文件,要用 Procdump或PEditor等PE编辑工具修正入口点(Entry Point)。

2、UPX V1.01的壳

目标程序: 用 UPX V1.01压缩过的Notepad.exe

方法一、使用TRW2000来脱壳

使用工具

TRW2000
FileInfo

★确定壳的种

拿到这软件后,可用工具FileInfo、gtw、TYP32等侦测文件类型的工具来看看是何种软件压缩的,在这我们以FileInfo 为例,把目标文件复制到FileInfo目录下,在资源管理器下双击FileInfo,再按回车,你将看到报告出来:告诉你这是UPX1.01压缩的软件。

★入口点(Entry Point)确定

◇利用跟踪分析来确定入口点

决大多数 PE 加壳程序在被加密的程序中加上一个或多个段。 所以看到一个跨段的 JMP 就有可能是了。 UPX 用了一次跨段的 JMP 。 就是你一步步跟踪时会看到代码有一突跃,一般再跟据领空文件名的变化,就能确定入口点了。运行TRW2000并装载目标程序,然后LOAD,你将中断在主程序入口处:此时合理按F10、F7及F12一直向前走,注意此时领空会是:NOTUPX!UPX1+2xxx.

在你跟踪过程中会出现如下代码:

该程序的具体情况如下:

XXX:XXXXXXXX 60 PUSHAD ;所有的寄存器进栈
XXX:XXXXXXXX BE2EFD4200 MOV ESI, XXXXXXXX ;将下一条指令送入进行解压
XXX:XXXXXXXX 8DBED21FFDFF LEA EDI, [ESI+XXXXXXXX]

.......
....... <---- 按F10跟踪 ;-P

XXX:XXXXXXXX FF96A8C90400 CALL [ESI+XXXXXXXX]
XXX:XXXXXXXX 61 POPAD ;所有寄存器出栈
XXX:XXXXXXXX E9A44AFBFF JMP 00401000 ;跳到程序真正入口点(OEP),文件完全解压。

0137:40ddbe popa
0137:40ddf jmp 00401000 <-此行己完全解压结束,将要跳到记事本程序入口点执行程序(注意此处的一个大的突跃)。
........................
0137:401000 push ebp <-完全解压后的记事本程序第一行

因此入口点(Entry Point)找到为:401000

利用TRW2000特有命令PNEWSEC

TRW2000也是一款优秀的脱壳工具,有许多特有的命令对脱壳很有帮助,在此时用PNEWSEC命令也可方便找到入口点。
运行TRW2000并装载目标程序,然后LOAD,你将中断在主程序入口处,下令:PNEWSEC
等上一段时间,程序将中断在入口点处。

用冲击波2000

冲击波2000是D.boy开发的一个专门查找加壳软件入口点的工具,先运行冲击波2000,点击Track按钮:开始进行跟踪,然后运行要跟踪的程序, 找到入口点后,会在Enter point 显示。可是用这个记事本程序却无效。

★dump取内存中己脱壳的文件

不管你用何种方法找到入口点,首先要来到入口点一行:

0137:401000 push ebp

执行命令makepe 路径/文件名pedump 路径/文件名

就这样脱壳成功

注:TRW2000的makepe重建的PE文件可跨平台运行,pedump抓取的文件却不可。

方法二、用SOFTICE来脱壳

使用工具

TRW2000
FileInfo

ProcDump

★入口点(Entry Point)确定

◇利用跟踪分析来确定入口点

方法同TRW2000。

★dump取内存中己脱壳的文件

0137:40ddf jmp 00401000

现在这一行,键入以下命令:
a eip (然后按回车)
jmp eip (然后按回车)

按下F5

这样将改变0137:40ddf行的代码. 你会注意到在键入"jmp eip"并按下回车后,40ddf的指令现在是一个jmp.这将有效地使程序"暂停"(有点类似TRW2000的suspend命令). 按下F5使你回到window。

运行ProcDump,在Task的列表中的第一个list上点击鼠标右键,然后选择"Refresh list". 在Task列表中找到notepad.exe,在它的上面点击鼠标右键. 然后,选中"Dump (Full)",给脱壳的程序起名存盘. 再在notepad.exe上点击鼠标右键,然后选中"Kill Task".

注:用此方法抓取的文件不可跨平台运行。

★修正刚dump取的文件的入口点

脱壳的notepad.exe程序入口是00401000.
再次使用ProcDump的PE Editor功能, 打开已脱壳的notepad.exe.

在"Header Infos"一项, 你会看见程序Entry Point(入口值)是0000DC70,这当然是错误的. 如果你试着不改动这个入口值而运行脱壳后的notepad.exe,程序将无法运行.

在 Procdump可看到ImageBase =00400000,我们上面跟踪找到的入口值的RVA是00401000,因为:虚拟地址(RVA)=偏移地址+基址(ImageBase ),因此

Entry Poin=00401000-00400000=1000,改变入口值为1000,点击"OK".

现在, 运行脱壳后的notepad.exe吧,它应该正常运行了。

3、Shrinker v3.4 的壳

目标程序: 用Shrinker v3.4压缩过的Notepad.exe
******************************************************************
冰毒注:
1. Notepad.exe就是Windows自带的写字板程序,相信大家的机器中都会有.
2. Shrinker v3.4可以在http://w3.to/protools下载,这里你可以找到你
想要的几乎所有的工具.
******************************************************************
使用工具:
ProcDump
Softice
Symbol Loader (冰毒注:这个是Softice自带的,用过Softice的应该知道)
破解方法:
手动脱壳
教学目的:
教你手动脱壳的基本技术
__________________________________________________________________________
                      关于这个教程
这是我打算写的*简单*的脱壳系列教程的第一篇. 目标程序是notepad.exe,在大多数
的电脑中都有它. 因为我还不能很好地解释脱壳中的一些问题,我只能尽我所能向你们
展示简单的方法. 至于高级的方法,你们必须去读别的教程.
_________________________________________________________________________
      使Softice中断于程序入口处
用Symbol Loader打开已压缩的notepad.exe.
点击Symbol loader任务条上的第二个图标,当你把鼠标移到图标上时,在Symbol Loader
窗口底部提示行你会见到"Load the currently open module"的字样
你将得到一条出错信息并问你是否尽管出错还是要装入这个exe文件. 点击"Yes".
假如Softice已经运行的话, 它应该在程序的入口处中断.可是它并没有中断,压缩过的
notepad.exe直接就运行了.
该到改变characteristics of the sections的时间了...
通过改变characteristics, 你可以使Softice中断于程序入口.
用ProcDump装入压缩过的notepad.exe (使用PE Editor)
你会看到这个以"PE Structure Editor"作为标题的窗口.
点击称作"Sections"的按钮.
你将得到另一个以"Sections Editor"做标题的窗口.
你会见到压缩过的notepad.exe的不同sections.
第一个是 .shrink0 它的characteristics是C0000082.
改变characteristics: 鼠标左键点击.shrink0再点击右键并选择edit section.
你将得到另一个窗口,它用'Modify section value" 作标题.
把Section Characteristics由C0000082改为E0000020.
一路按OK直到你回到ProcDump的主窗口.
你现在可以把ProcDump放在一边了.
**我愿意多作解释为什么必须这样做,但我没这个能力. 8P
你也许要读些PE结构的资料来找到原因.
别人教我说, E0000020将使section成为可执行的,因此Softice将会中断于入口处

找到程序真正入口并进行脱壳
现在, 希望你没有关闭symbol loader. 假如你关掉的话,重新运行它,打开并装入已
压缩的notepad.exe
当你这次点击"Yes"时, 你会发现你已在进入Softice中了...
我把下面的代码贴出来并加上注解.
************************* 你在SICE中所见到的 *************************
**Softice中断时,你会在这儿. 一直按F10走过这部分代码
0041454F  FFFF                INVALID
00414556  55                  PUSH      EBP
00414557  8BEC                MOV      EBP,ESP
00414559  56                  PUSH      ESI
0041455A  57                  PUSH      EDI
0041455B  756B                JNZ      004145C8                (NO JUMP)
0041455D  6800010000          PUSH      00000100
00414562  E8D60B0000          CALL      0041513D
00414567  83C404              ADD      ESP,04
0041456A  8B7508              MOV      ESI,[EBP+08]
0041456D  A3B4F14000          MOV      [0040F1B4],EAX
00414572  85F6                TEST      ESI,ESI
00414574  7423                JZ        00414599                (JUMP)
00414599  33FF                XOR      EDI,EDI
0041459B  57                  PUSH      EDI
0041459C  893D8C184100        MOV      [0041188C],EDI
004145A2  FF1510224100        CALL      [KERNEL32!GetModuleHandleA]
004145A8  8BF0                MOV      ESI,EAX
004145AA  68FF000000          PUSH      000000FF
004145AF  A1B4F14000          MOV      EAX,[0040F1B4]
004145B4  897D10              MOV      [EBP+10],EDI
004145B7  C7450C01000000      MOV      DWORD PTR [EBP+0C],00000001
004145BE  50                  PUSH      EAX
004145BF  56                  PUSH      ESI
004145C0  FF15F4214100        CALL      [KERNEL32!GetModuleFileNameA]
004145C6  EB03                JMP      004145CB                (JUMP)
004145CB  E830EAFFFF          CALL      00413000
004145D0  FF7510              PUSH      DWORD PTR [EBP+10]
004145D3  FF750C              PUSH      DWORD PTR [EBP+0C]
004145D6  56                  PUSH      ESI
004145D7  E806000000          CALL      004145E2
**当你走过这个位于004145D7的CALL, 压缩过的notepad.exe就自由运行了. 再次用
symbol loader装入. 再次来到这个CALL时, 按F8追进去. 你将看到以下代码. 不
过记着先BPX 004145D7.
004145E2  64A100000000        MOV      EAX,FS:[00000000]
004145E8  55                  PUSH      EBP
004145E9  8BEC                MOV      EBP,ESP
004145EB  6AFF                PUSH      FF
004145ED  6810E04000          PUSH      0040E010
004145F2  68EC5D4100          PUSH      00415DEC
004145F7  50                  PUSH      EAX
004145F8  64892500000000      MOV      FS:[00000000],ESP
004145FF  83EC14              SUB      ESP,14
00414602  C745E401000000      MOV      DWORD PTR [EBP-1C],00000001
00414609  53                  PUSH      EBX
0041460A  56                  PUSH      ESI
0041460B  57                  PUSH      EDI
0041460C  8965E8              MOV      [EBP-18],ESP
0041460F  C745FC00000000      MOV      DWORD PTR [EBP-04],00000000
00414616  8B450C              MOV      EAX,[EBP+0C]
00414619  83F801              CMP      EAX,01
0041461C  7510                JNZ      0041462E                (NO JUMP)
0041461E  E886030000          CALL      004149A9
00414623  FF05C0F14000        INC      DWORD PTR [0040F1C0]
00414629  E882F6FFFF          CALL      00413CB0
0041462E  8B35C0F14000        MOV      ESI,[0040F1C0]
00414634  85F6                TEST      ESI,ESI
00414636  0F848D000000        JZ        004146C9                (NO JUMP)
0041463C  833DC4F1400000      CMP      DWORD PTR [0040F1C4],00
00414643  7526                JNZ      0041466B                (NO JUMP)
00414645  833D6417410000      CMP      DWORD PTR [00411764],00
0041464C  741D                JZ        0041466B                (NO JUMP)
0041464E  A164174100          MOV      EAX,[00411764]
**EAX现在的值是000010CC
00414653  030588184100        ADD      EAX,[00411888]
**EAX现在的值是004010CC
00414659  8945DC              MOV      [EBP-24],EAX
**[EBP-24]现在含的是004010CC
0041465C  FF7510              PUSH      DWORD PTR [EBP+10]
0041465F  FF750C              PUSH      DWORD PTR [EBP+0C]
00414662  FF7508              PUSH      DWORD PTR [EBP+08]
00414665  FF55DC              CALL      [EBP-24]
**假如你追过最后这个CALL,notepad.exe将再次自由运行.
由上得知, 既然[EBP-24] = 004010CC, 最后这句代码就意味着压缩过的程序在
CALL 004010CC. 如果你追进这个CALL, 你会发现notepad.exe很快就会运行了.

假如你曾经追过更多shrinker v3.4压缩的程序, 你总会见到这个"CALL [EBP-24]".
所以, 程序实际上正在进入已脱壳的程序的真正入口.
再次装入压缩过的notepad.exe,中断之后,按F5,你将中断于004145D7行(这里你原来
设过断点). 追进去直到你到达00414665行,这里程序正要进入已脱壳程序的真正入口.
现在,键入以下命令:
a eip (然后按回车)
jmp eip (然后按回车)
按下F5
这样将改变00414665行的代码. 你会注意到在键入"jmp eip"并按下回车后,00414665的
指令现在是一个jmp.这将有效地使程序"暂停". 按下F5使你回到window,你就可以dump
已经脱壳的程序到你的硬盘了.
现在又要用ProcDump了,在Task的列表中的第一个list上点击鼠标右键,然后选择"Refresh
list". 在Task列表中找到notepad.exe,在它的上面点击鼠标右键.
然后,选中"Dump (Full)",给脱壳的程序起名存盘.
再在notepad.exe上点击鼠标右键,然后选中"Kill Task".
_________________________________________________________________________
          改动程序入口值
如果你记得的话, 脱壳的notepad.exe程序入口是004010CC.
再次使用ProcDump的PE Editor功能, 打开已脱壳的notepad.exe.
在"Header Infos"一项, 你会看见程序入口值是0001454F,这当然是错误的. 如果你试着
不改动这个入口值而运行脱壳后的notepad.exe,程序将无法运行.
改变入口值为Entry Poin=004010CC-基址(ImageBase ),点击"OK".
现在, 运行脱壳后的notepad.exe吧,它应该正常运行了. 8)
__________________________________________________________________________

4、ASPack v1.083

用TRW2000调试,装载后,下命令:pnewsec就可中断到入口点。为了提高跟踪水平,下面以SOFTICE为例,讲述跟踪过程。

_________________________________________________________________________

寻找程序的入口点( Entry Point)


用Symbol Loader打开Notepad-ASPACK.exe,点击Symbol loader的第二个图标("Load the currently open module")

如SOFTICE 装载成功,它应中断在起始程序入口处。


当跟踪时,你会经过许多条件跳转指令及循环指令,要用点技巧跳出这些圈子,其形式一般这样:

*************************************
aaaaaaaa
...
wwwwwwww
xxxxxxxx JNZ zzzzzzzz <-- 循环返回到aaaaaaaa
yyyyyyyy JMP aaaaaaaa
zzzzzzzz 新的指令

如果你跟踪时,你将跳转到 aaaaaaa处多次,你可将光标移到 zzzzzzzz一行,按F7让指令直接跳到此处,可省不少时间。
*************************************


在跟踪过程会来到:
167:0040D558 POPAD
0167:0040D559 JNZ 0040D563 (JUMP)
0167:0040D55B MOV EAX,00000001
0167:0040D560 RET 000C
0167:0040D563 PUSH EAX<--EAX的值就是入口点的值=4010CC
0167:0040D564 RET <--返回到记事本的真正的入口点

*************************************
0167:004010CC PUSH EBP <--真正的入口点
0167:004010CD MOV EBP,ESP
0167:004010CF SUB ESP,00000044
0167:004010D2 PUSH ESI

经过0167:0040D564 RET 一行,程序将来到0167:004010CC刚完全解压的真正程序第一条指令处。
*************************************
当我们跟踪时发现POPAD或POPFD,就要提高警惕,一般入口点就在附近了,在此程序的原始入口点是004010CC
在0167:0040D564 RET一行键入:
a eip (然后按回车)
jmp eip (然后按回车)
F5

这个方法是让程序挂起,按F5回到windows下。
运行 Procdump,在Task的列表中的第一个list上点击鼠标右键,然后选择"Refresh
list". 在Task列表中找到notepad.exe,在它的上面点击鼠标右键.
然后,选中"Dump (Full)",给脱壳的程序起名存盘.
再在notepad.exe上点击鼠标右键,然后选中"Kill Task".


_________________________________________________________________________

修正入口点

脱壳的notepad.exe程序入口是004010CC.
再次使用ProcDump的PE Editor功能, 打开已脱壳的notepad.exe.


修正入口点值=4010CC-00400000(基址)=10CC
点击"OK".

现在, 运行脱壳后的notepad.exe吧,它应该正常运行了。

 

 

 

 

责任编辑 赵毅 zhaoyi@51cto.com TEL:(010)68476636-8001

  • 上一篇文章: 一步一步教你加密解密技术——压缩与脱壳(2)

  • 下一篇文章: 一步一步教你加密解密技术——压缩与脱壳(4)
  •    
    [注:标题搜索比内容搜索快]
    发表评论】【告诉好友】【打印此文】【关闭窗口
     最新5篇热点文章
  • 轨道钢承重计算公式及应用[109]

  • 【选型】如何为变频器选取阻值…[86]

  • AIS2023参展厂商名录[345]

  • AGV综合选型[170]

  • APIE 2023第4届亚太国际智能装…[138]

  •  
     最新5篇推荐文章
  • 外媒:正在唤醒中国的习近平[305]

  • 中国反伪科学运动背后的CIA黑手…[494]

  • [转载]袁隆平真言:中国最大的…[668]

  • 台专家:当年我们造IDF时 大陆…[572]

  • 旅日华人:中国严重误判日本民…[577]

  •  
     相 关 文 章
  • 扭曲变换加密 防止软件破解最好…[101]

  • 一步一步教你加密解密技术——…[132]

  • 一步一步教你加密解密技术——…[96]

  • 一步一步教你加密解密技术——…[84]

  • 一步一步教你加密解密技术——…[102]


  •   网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)
        没有任何评论
    设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 | 管理登录 | 
    版权所有 Copyright© 2003 晨光科技        站长:璀璨星辰        页面执行时间:179.69毫秒
    Powered by:MyPower Ver3.5