首页
社区
课程
招聘
[分享]aspack 2.12 等大脱壳修复-重新加壳
发表于: 2009-9-29 11:32 11832

[分享]aspack 2.12 等大脱壳修复-重新加壳

2009-9-29 11:32
11832
【文章标题】: 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

[课程]Linux pwn 探索篇!

收藏
免费 7
支持
分享
最新回复 (2)
雪    币: 157
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
学习一下!
2009-10-4 01:18
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
说的好  学习了
2009-10-23 17:50
0
游客
登录 | 注册 方可回帖
返回
//