cnpaf.net - 中国协议分析网

投递文章 投稿指南 RSS订阅 网站通告:
搜索: 您的位置主页>网络安全>工具使用>阅读文章

压缩与脱壳-脱壳高级篇 下

12-20 13:47 来源: 作者: 【 评论:0 浏览:
1、先装载Icedump
在这用Icedump 6.016版本,其命令操作形式完全和以前的版本不同。先在Icedump目录里运行相应SOFTICE版本的icedump.exe(我用的SOFTICE是4.05版,因此在win9x/405目录下运行icedump.exe),如Icedump装载成功,Icedump会返回如下信息:

icedump v6.0.1.6 for winice v4.05 loader
icedump unloaded
icedump loaded ←出现这句话表示Icedump装载成功

C:>

2、再装载FrogsICE
由于aspack能检测到SOFTICE的存在,因此装载Frogsice就可躲过。在我机子里:FrogsICE 1.00 Final和Icedump不能很好兼容工作,因此我将FrogsICE换成版本v0.43,hehe..它们配合的很好。双击FPloader.exe文件即可装载成功。
OK,到此你的SOFTICE的功能己大大加强里。
这时试试运行aspack,这时屏幕将蓝屏给你一菜单选项,告知aspack发现了SOFTICE,是否欺骗它,这时你按ESC按钮,程序即可正常运行。

3、 记住我们的第一步是抓取import table,它在内存的446000到449000处,因此程序运行时注意这段内存代码的解压情况。
由于SOFTICE不能LOAD aspack.exe,我们用:bpx loadlibrarya命令来拦断。

loadlibrarya命令解释:如果import表没在内存中就使用LoadLibraryA API调用装入该模块,因此我们可以拦截此函数来观察import表。

:bpx loadlibrarya 然后运行aspack将中断如下:
Break due to BPX KERNEL32!LoadLibraryA
:dd 446000 l 40 (下此命令观察内存446000到449000处的数据)

.
-------SPACK!.idata--------------------dword----------ROT--?(0)--
0030:00446000 ???????? ???????? ???????? ???????? ................ 
0030:00446010 ???????? ???????? ???????? ???????? ................ 
0030:00446020 ???????? ???????? ???????? ???????? ................ 
0030:00446030 ???????? ???????? ???????? ???????? ................

上图是SOFTICE的数据窗口,显示 ??...说明import表在内存中没解压。
再按F5一下,程序将中断如下:(记着:在这例中只能要按一下F5,否则将不能抓取正确的import表)

0030:00446000 00000000 00000000 00000000 0004669C .............f..
0030:00446010 0004612C 00000000 00000000 00000000 ,a..............
0030:00446020 000468B6 000461AC 00000000 00000000 .h...a..........
0030:00446030 00000000 000468D0 000461B4 00000000 .....h...a......

这时446000处不是?? ?? ?? ??,意味着import表己被解压了。

.import表以一个IMAGE_IMPORT_DESCRIPTOR数组开始。 image_import_descriptors数据有5组dwords组成。

image_import_descriptors结构:
①dd offset original_first_thunk
②dd timedatestamp    时间及日期标志
③dd forwardchain    正向链结索引
④dd offset library name以NULL结尾的ASCII字符的RVA地址,该字符串包含输入的DLL名,
             比如"Kernel32.dll"或"USER32.DLL"。
⑤dd offset first_thunk 该字段是在Image_thunk_data联合结构中的RVA偏移

其中timedatestamp和forwardchain通常设置为00000000, original first thunk 选项不是必须的.

:dd 446000 l 40
0030:00446000 00000000 00000000 00000000 0004669C .............f..
0030:00446010 0004612C 00000000 00000000 00000000 ,a..............

地址4669c 指向 LibraryName (RVA, 你需要加上基址imagebase+400000)

:db 44669c l 10
0030:0044669C 4B 45 52 4E 45 4C 33 32-2E 44 4C 4C 00 00 00 00 KERNEL32.DLL....

地址612c指向 first_thunk 库。

:dd 44612c l 10
0030:0044612C 000466AA 000466C2 000466DA 000466F2 .f...f...f...f..

这些是以NULL结尾的ASCII字符的RVA地址, . . 466aa 是第一个API函数的地址,466c2是第二个API函数地址...它们以以NULL结尾。

:db 0004466aa l 20
0030:004466AA 00 00 44 65 6C 65 74 65-43 72 69 74 69 63 61 6C ..DeleteCritical
0030:004466BA 53 65 63 74 69 6F 6E 00-00 00 4C 65 61 76 65 43 Section...LeaveC

通过上面的分析可知,这就是原始的.import表,快dump it!!(看看上文的image_import_descriptors地址)

:/dump 446000 2000 c:\aspack.idata.bin
(如你是用Icedump 6.016以前版本用此命令:pagein d 446000 2000 c:\aspack.idata.bin)

为了方便大家对比,特将dump正确的import表放在此下载。


=part4===part4===part4===part4===part4===
part4===part4===part4===part4===part4=
Dump整个程序并修正文件头

1、现在我们要找程序的入口点,下命令:bpx loadlibrarya ,然后按14下F5,然后按F10一步一步跟踪来到如下代码:

0137:00C1150E  8B4508              MOV      EAX,[EBP+08]                     
0137:00C11511  8B10                MOV      EDX,[EAX]  DS:004664FC=00400000 
0137:00C11513  8B4508              MOV      EAX,[EBP+08]                     
0137:00C11516  035018              ADD      EDX,[EAX+18]                     
0137:00C11519  8B4508              MOV      EAX,[EBP+08]                     
0137:00C1151C  8B401C              MOV      EAX,[EAX+1C]                     
0137:00C1151F  E874F9FFFF          CALL      00C10E98    ←在此按F8进入                     
0137:00C11524  5F                  POP      EDI                               
0137:00C11525  5E                  POP      ESI                               
0137:00C11526  5B                  POP      EBX                               
0137:00C11527  59                  POP      ECX                               
0137:00C11528  59                  POP      ECX                               
0137:00C11529  5D                  POP      EBP                               

0137:00C1152A  C20400              RET      0004 


F8进入后来到如下:

0137:00C10E96  8BC0                MOV      EAX,EAX                         
0137:00C10E98  89C4                MOV      ESP,EAX                         
0137:00C10E9A  89D0                MOV      EAX,EDX                           
0137:00C10E9C  8B1D6C66C100        MOV      EBX,[00C1666C]                   
0137:00C10EA2  89041C              MOV      [EBX+ESP],EAX                     
0137:00C10EA5  61                  POPAD                                       
0137:00C10EA6  50                  PUSH      EAX ;push 442b98 即为入口点                       
0137:00C10EA7  C3                  RET      ;返回到己完全解压的代码处,即入口点处。                                 
0137:00C10EA8  C3                  RET

来到入口点:

0167:00442B98 55 PUSH EBP ←此处为入口点
0167:00442B99 8BEC MOV EBP,ESP
0167:00442B9B 83C4F4 ADD ESP,-0C

在0167:00442B98 处就可dump整个内存数据了,此时程序己完全解压准备运行了。记下程序入口点:00442B98
在dump前,清除所有的断点:bc *.

./dump 400000 79000 c:\aspack.dumped.exe
(如你是用Icedump 6.016以前版本用此命令:pagein d 400000 79000 c:\aspack.dumped.exe)

2、替换正确的import表

用Hexworkshop打开aspack.dumped.exe和aspack.idata.bin. Goto到exe文件的46000偏移处,Select Block大小为2000. 拷贝aspack.idata.bin文件的同样大小(2000)的Block,粘贴到exe文件中以替换掉不正确的.idata section,然后存盘。(注意:以上所有数据都是十六进制)

3、修正PE文件头

用 Procdump打开刚建好的 aspack.dumped.exe文件,点击pe-editor按钮,然后再点击SECTIONS按钮,在每个section点击右键,选中Edit section,把所有的 section 的PSize = VSize offset = RVA 。

如:CODE 的PSize=0001E000; VSize=00042000;offset =00000400;RVA=00001000;
改成:PSize = VSize= 00042000;offset = RVA =00001000;

在改完所有的sections后,按OK,存盘后,你在资源管理器中刷新一下,就会发现aspack.dumped.exe的图标回来了,但还不能运行,你还要修正入口点和import表。

将入口点(Entry Point)改为:00042B98(记着:00442B98-imagebase=42B98

再点击Directory按钮,将Import Table改为 RVA (46000 );而其选项Size只要比0大就可;

然后点击OK,退出Procdump,再运行 aspack.dumped.exe ,程序运行的很甜美!

这时你用W32DASM不能反汇编,你可用 Procdump编辑第一个section characteristics:

将其 c0000060 (data, writable)改为: 60000040 (code, executable)或 e0000060 (code, data, etc etc)

注:大家抓取屏幕可在Icedump 6.016中,用:/Screendump抓取。
不加参数命令:/Screendump 选取模式,重复执行,会在0、1、2、3、4五种模式下转换。
模式1(默认)是以文本方式存盘,模式2是以HTML文件存盘。其它的请参考其readme.
模式选好后,就可用命令: /SCREENDUMP [路径]文件名 抓取整个SOFTICE的屏幕。

3、ASProtect v0.9x保护

Advanced Zip Password Recovery 3.0的脱壳

教程写作: 冰毒
作者信箱: break_ice@hotmail.com
写作日期: 2000年3月25日
版权声明: 本文没有版权,允许任意转贴和修改. 但如果只引用文中部分内容时,请最好注明原文出处,以表示对一位Cracker同行的劳动的尊重.

使用工具:
TRW2000 1.03
ProcDump 1.6.2
Hexworkshop 3.02

下载:Advanced Zip Password Recovery 3.0

比起其Beta版来,AZPR 3.0正式版的保护更为加强. 1. 对Softice的多处Check,用FrogsICE不能完全骗过; 2. CRC的校验; 3. 动态地址(好象是这个名吧?); 4.对Loader的防范,这回用Process Patch不行了.

用Softice跟踪它会是一种痛苦 (当然完全可以用Softice,只是你要了解程序的Anti-debugger技巧,在关键的Check后改变跳转方向). 这次祭出我们中国人的骄傲TRW2000来对付它.

先用Procdump的PE Editor查看一下程序的.idata section记下数值. Virtual size=2000, Virtual offset=21000. 另外,记下程序的Image Base: 400000.

1. 运行TRW, Load程序. 程序中断在入口处. 但接下来无论是否BPX设断只要G继续运行程序,便会出错. 下Faults off, G, OK程序退出.
2. 试BPM 421000 (.idata的offset), 再Load程序. G, 程序可以被正常中断, COOL!
3. G,当程序第三次(? 记不清了. 原则是d 421000显示的data区见到XXXX0200 000000字样)中断时,BD*,F10直到下面的语句

*********************************
注意: 程序每次Load时Offset都不一样,你的机器中的XXXX:YYYYYYYY肯定和下面的不同. 下Code on指令,这样才好参照下面的代码. 另外,下面所摘的几段代码是引用高手tiamath的.因为我不清楚在TRW下如何dump屏幕 (谁能指教一下:);而用ICEDump的pagein n命令来Dump Softice的屏幕,我的机器会死机. :(
*********************************

0167:004F34CD 50         PUSH EAX
0167:004F34CE B890274F00     MOV EAX,004F2790
0167:004F34D3 50         PUSH EAX
0167:004F34D4 B8A4274F00     MOV EAX,004F27A4
0167:004F34D9 50         PUSH EAX
0167:004F34DA B8A0284F00     MOV EAX,004F28A0
0167:004F34DF 50         PUSH EAX
0167:004F34E0 B8AC274F00     MOV EAX,004F27AC
0167:004F34E5 50         PUSH EAX
0167:004F34E6 B8646C4E00     MOV EAX,004E6C64
0167:004F34EB 50         PUSH EAX
0167:004F34EC 8B4508         MOV EAX,[EBP+08]
0167:004F34EF 8D4824         LEA ECX,[EAX+24]
0167:004F34F2 8B4508         MOV EAX,[EBP+08]
0167:004F34F5 8B500C         MOV EDX,[EAX+0C]
0167:004F34F8 8B4508         MOV EAX,[EBP+08]
0167:004F34FB 8B4008         MOV EAX,[EAX+08]
0167:004F34FE E899F4FFFF     CALL 004F299C
0167:004F3503 33C0         XOR EAX,EAX <--在这里Dump .idata

下指令 W 421000 L 2000 azprdata.bin

OK. 再往下,直到

0167:004F3637 8D4818         LEA ECX,[EAX+18]
0167:004F363A 8B4508         MOV EAX,[EBP+08]
0167:004F363D 8B10         MOV EDX,[EAX]
0167:004F363F 8B4508         MOV EAX,[EBP+08]
0167:004F3642 8B401C         MOV EAX,[EAX+1C]
0167:004F3645 E8EAF6FFFF     CALL 004F2D34 <--F8进入
0167:004F364A 5F         POP EDI
0167:004F364B 5E         POP ESI

到了

0167:004F2D72 E9148B1DA8     JMP A86CB88B
0167:004F2D77 8E4F00         MOV CS,[EDI+00]
0167:004F2D7A EB01         JMP 004F2D7D
0167:004F2D7C EB89         JMP 004F2D07
0167:004F2D7E 041C         ADD AL,1C
0167:004F2D80 EB02         JMP 004F2D84
0167:004F2D82 EBE8         JMP 004F2D6C
0167:004F2D84 61         POPAD
0167:004F2D85 EB01         JMP 004F2D88
0167:004F2D87 E850EB02E9     CALL E95218DC
0167:004F2D8C 17         POP SS
0167:004F2D8D E802000000     CALL 004F2D94
0167:004F2D92 E91758C35E     JMP 5F1285AE
0167:004F2D97 5B         POP EBX
0167:004F2D98 59         POP ECX

此时小心地跟踪,碰到JMP时按F8而不要按F10

直到显示变成

0167:004F2D72 E9148B1DA8     JMP A86CB88B
0167:004F2D77 8E4F00         MOV CS,[EDI+00]
0167:004F2D7A EB01         JMP 004F2D7D
0167:004F2D7C EB89         JMP 004F2D07
0167:004F2D7E 041C         ADD AL,1C
0167:004F2D80 EB02         JMP 004F2D84
0167:004F2D82 EBE8         JMP 004F2D6C
0167:004F2D84 61         POPAD
0167:004F2D85 EB01         JMP 004F2D88
0167:004F2D87 E850EB02E9     CALL E95218DC
0167:004F2D8C 17         POP SS
0167:004F2D8D E802000000     CALL 004F2D94
0167:004F2D92 E91758C35E     JMP 5F1285AE
0167:004F2D94 58         POP EAX <-- 光标位于此行时, EAX=401000
0167:004F2D95 C3         RET <--这里

下Suspend指令. 回到Windows. 用ProcDump来Dump(full)脱壳的程序,得到azprdump.exe. 你也可以用TRW的PEDUMP命令来得到脱壳程序,但我个人的经验很容易死机,所以我宁愿用ProcDump来做.

4. 用PE Editor修改程序的Entry Point为1000. 并查看脱壳后程序的.idata section. 此时Raw size=1670, Raw offset=1FC00. 修改Directory中Import Table的RVA=21000,SIZE=1670.
5. 用Hexworkshop打开azprdump.exe和azprdata.bin. Goto到exe文件的1FC00偏移处,Select Block大小为1670. 拷贝.bin文件的同样大小(1670)的Block,粘贴到exe文件中以替换掉不正确的.idata section.

现在,再试着运行程序,应该可以正常运行了. 如果程序出错,再做一件事: 把 .bss section的raw size值改为00000000 (高手tiamath的建议).

有了脱壳的程序,大家应该会Patch它成为注册版了吧. 只需改一个字节.

结语: 用本文所描述的方法,可以对绝大多数Asprotect+Aspack保护的程序进行成功的脱壳. 大家读完这篇教程,不妨找几个程序开刀. 比方说,The Bat! 1.39现在不应该再难住大家了.

好了,这次就到这儿了,下回见.

收藏此篇文章内容到:
Tags:
责任编辑:
  • 请文明参与讨论,禁止漫骂攻击。 用户名:新注册) 密码: 匿名:
    评论总数:0 [ 查看全部 ] 网友评论
    关于我们 - 广告合作 - 网站地图 - 版权说明 - 网站历史 - 世界排名 - 加入收藏 - 设为首页 - 返回顶部