-
-
[分享]aspack 2.12 等大脱壳修复-重新加壳
-
发表于:
2009-9-29 11:32
11983
-
[分享]aspack 2.12 等大脱壳修复-重新加壳
【文章标题】: aspack 2.12 等大脱壳修复-重新加壳
【文章作者】: walkier
【作者邮箱】: lifenjoiner@163.com
【作者QQ号】: 412656818
【软件名称】: notepad_v5.1.2600.5512; LiteServe2.4汉化版
【下载地址】: 自己搜索下载
【加壳方式】: aspack2.12
【编写语言】: vc => Borland delphi =>
【使用工具】: aspack2.12; PEiD; OD; Stud_PE, LordPE, PEditor; WinHex; resfix, DT_FixRes; PE Optimizer
【操作平台】: winxp sp3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
这是成功之后的回忆录,不够详尽细致还望大家海涵,局限谬误处还望大家分析考量之。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
脱壳机脱出来的总是保留了壳的添加段,比原来要大。能不能得到一样大小的文件,并重新加壳?
据说能。参考N多文章……不甚明了……
于是自己实战探索一把。
自己搞个最简单的—— notepad.exe(5.1.2600.5512):
1. aspack212 加壳。80%(66,560 字节 => 53,248 字节)。
2. 分别命名为:notepad.bak.exe、notepad.asp.exe。
第一阶:自动
OD载入,没必要自动分析。
找到OEP,dump并选fix、rebuild import。可运行。命名为:dump_auto.exe。
运行正常,成功。
高手不应只此而已,但可能不屑继续的工作了。虽然不完美,但是够用就行了……
Stud_PE载入。除了壳段之外,又多了.idata2段。
第二阶:修复
把重建的import放在原来的位置(参考notepad.bak.exe)如何,行的话,不就可以少一个段吗?
重新OEP处dump为dump_noreb.exe(PEiD复查),而不选rebuild import。运行Import REConstructor,
填入OEP => "IAT AutoSearch",found something => "Get Imports",都valid => "Fix Dump",
成功得dump_noreb_.exe。(拓展参考②)
运行,失败。
为什么呢?
菜鸟就得踏踏实实来。
WinHex载入notepad.bak.exe、dump_auto.exe、dump_noreb.exe、dump_noreb_.exe从import table
的RawOffset处对比……
新大陆发现了:重建的import table结构上比较特别,它一直在引用原来的IAT,且重建了dll名字串
跟在后面,对应位置的HNT、IAT反而被覆盖掉了!其实只需要修复Image_Import_Directory就好了。
不过手工改就比较烦琐了……
先把notepad.bak.exe的借过来,存为dump_noreb_fix.exe ;p
OEP、import table 指针、文件大小确认。
运行,OK!
一番奋战,终有所获!import table 就脱离魔爪了。(久有企图,次次碰壁……终于小有所获^_^)
第三阶:修整
备份。
Stud_PE(可自动更改文件大小值)删除段".adata"(OK,可运行),".aspack"……
没有图标了!运行不了。
还原。
其实,还有东西在.aspack中,是resource的一部分。用resfixer打开,看红色的就是。
重建:
记下resource段入口地址、段对齐,用DT_resfixdemo导出资源为rsrc。其修复功能会把资源移到
最后。
用WinHex将之写入。rsrc,复制16进制数值;dump_noreb_fix.exe,一定要点定段入口点,不然
很容易写错位置。
删除壳段。
正常运行!
完全干掉壳了!
PE Optimizer优化(77,824 字节 => 66,560 字节)。等大!
PE Headers一般会被提前16位。
第三阶段:善后
重新加壳。提示已经加过壳?仍然可以加的。
不过PEiD早查不出了,壳段都移掉了,还提示?那这个加壳都做了些什么?WinHex比较,可以确认
无它,是PE Headers中reserved被改成[00000000 00100000]了。置0即可。
清除遗毒!趋近完美……
胜利来临啦!当当当当……
第四阶:意外
本来以为没有其它的了。直到我遇到了LiteServe2.4汉化版(全功能的网站架设工具.exe)……才
知道还有一些秘密没有揭开!
PEiD: ASPack 2.12 -> Alexey Solodovnikov
做完除优化外的修整工作,你会发现它运行不了!为什么?怎么办?
LordPE、WinHex、OD全面审查…N久…
终于发现:
原先还考虑要不要删掉的那些基本空白的段也是有用的。源程序是Borland Delphi的,
段比较多,有TLS、basereloc信息。前者是关于线程的,后者是关于relocations的。(参考③)
TLS有的话也需修复。它只是复制了一份在".aspack"段,并没有破坏原来的。WinHex二进制搜索即可
找到。Stud_PE修改指针。
basereloc倒不重要,基本优化时置0。
意外之收获!小小庆祝一下……
至此,再碰到aspack的壳,基本都能完美脱之啦~但是回味一下,还是有一些美中不足:手工修复很麻
烦,希望能够找到规律,然后……
第五阶:了然
这就得参考加壳程序的解码情况——ASPack脱壳详细分析(④)。
调试分析的时候可以在import等地址设写入断点,就可以容易地监视解码情况了。看明白之后,
容易抽取如下关键点:
---------------------------------------------------------------------------------------
[EP+277]
--------
xxxxxxxx BE xxxx0000 mov esi, xxxx [F2],import_OEP
xxxxxxxx 8B95 22040000 mov edx, dword ptr [ebp+422]
xxxxxxxx 03F2 add esi, edx
xxxxxxxx 8B46 0C mov eax, dword ptr [esi+C]
xxxxxxxx 85C0 test eax, eax
xxxxxxxx /0F84 0A010000 je xxxxxxxx 已经完成解码
OD “查找”=>“二进制字串”:8B952204000003F28B460C85C0
---------------------------------------------------------------------------------------
[EP+375]
--------
程序破坏原来的IMAGE_IMPORT_DIRECTORY的OriginFirstThunk等信息。
xxxxxxxx 8907 mov dword ptr [edi], eax [F2], dump
xxxxxxxx 8385 49050000 0>add dword ptr [ebp+549], 4
xxxxxxxx ^ E9 32FFFFFF jmp 010132B6
xxxxxxxx 8906 MOV DWORD PTR DS:[ESI],EAX
xxxxxxxx 8946 0C MOV DWORD PTR DS:[ESI+C],EAX
xxxxxxxx 8946 10 MOV DWORD PTR DS:[ESI+10],EAX
这里与参考④不同!例子:MiniBroser 2.11。
F2 => F9至此 => dump(不选rebuild import)
=> 填写下面的OEP
=> Stud_PE 修改 输入表的指针
[size 不大重要,自己在HexEditer中数一下,看看主角长什么样,混个脸熟。]
=> TLS[未被破坏,16进制搜索即得。]
=> basereloc[不用改,优化时置0。]
可以运行啦。
=> rebuild resource at the original address
ICON 仍在
Group_Icon 被移出
Version_Info 被移出
1. DT_fixresdemo dump, then overwrite with hexediter. 优化后一致。
2. 手工。需要把 resource 相关内容搞明白。
=> delete ".aspack" ".adata" 段, 运行试试。
=> PEoptimize(PE headers一般会提前16位)
890689460C894610
---------------------------------------------------------------------------------------
[EP+399]
--------
xxxxxxxx B8 xxxx0000 mov eax, xxxx [F2],OEP
xxxxxxxx 50 push eax
xxxxxxxx 0385 22040000 add eax, dword ptr [ebp+422]
xxxxxxxx 59 pop ecx
xxxxxxxx 0BC9 or ecx, ecx
xxxxxxxx 8985 A8030000 mov dword ptr [ebp+3A8], eax
xxxxxxxx 61 popad
xxxxxxxx 75 08 jnz short xxxxxxxx
xxxxxxxx B8 01000000 mov eax, 1
xxxxxxxx C2 0C00 retn 0C
xxxxxxxx 68 00000000 push 0
xxxxxxxx C3 retn
50038522040000590BC98985A803000061
---------------------------------------------------------------------------------------
于是,我们有了一个简单易行又优化的脱壳方法。
简化为:“一个断点(375),两个入口(277、389)与大小,资源重建,额外段正;删除壳段;别忘优化”。
====================================================================================================
参考:
①
标 题: 浅谈程序脱壳后的优化
作 者: CCDebuger
时 间: 2006-07-03 22:52
链 接: http://bbs.pediy.com/showthread.php?threadid=28402
②
标 题: 手脱PESHiELD 0.25并完美优化
作 者: lelfei
时 间: 2007-10-01 23:11
链 接: http://bbs.pediy.com/showthread.php?t=52646
③
LUEVELSMEYER的《PE文件格式》
④
标 题: 【原创】ASPack脱壳详细分析
作 者: cradiator
时 间: 2009-08-31,23:56
链 接: http://bbs.pediy.com/showthread.php?t=96870
⑤
标 题:脱ASPack2.12加壳的DLL文件简便方法
发信人:popo123456
时 间:2004-12-18,11:15
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
这个过程中,发现PEditor大牛总是往PE Headers里写记号,虽然能被优化掉,但还是想动动手脚……^e^
于是又发生了一串关于UPX的故事:
被修改过的UPX壳……“-d”参数无效……
UPX加壳再脱壳之后程序的md5不同……
UPX一次解码四个字节……
手工能不能拿到完美的脱壳文件?等我有了结果再向大家汇报。
--------------------------------------------------------------------------------
【经验总结】
很多文章多是提示点拨一下,甚至只是暗示,只是个摘要性的备忘。要想真正吃透,就要自己动手实践
一下。
--------------------------------------------------------------------------------
2009年09月28日 22:05:10
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)