首页
社区
课程
招聘
[原创]Zp1.3IAT调用代码加密脱壳(献给广大菜鸟们)
发表于: 2013-3-4 15:08 5948

[原创]Zp1.3IAT调用代码加密脱壳(献给广大菜鸟们)

2013-3-4 15:08
5948
【文章标题】: Zp1.3IAT调用代码加密脱壳(献给广大菜鸟们)
【文章作者】: 红绡枫叶
【作者邮箱】: a474528738@163.com
【软件名称】: XX电话DDOS软件
【软件大小】: 1.81M
【下载地址】: 自己搜索下载
【加壳方式】: ZProtect1.3
【保护方式】: IAT调用代码加密保护
【编写语言】: Delphi v7.0
【使用工具】: DiE64,OD,PeLoader....
【操作平台】: XP SP3
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  前言:
         这款软件采用的IAT调用代码加密对刚入门的菜鸟来说,难度大了一点。因为要修复它,不会脚本或
         pacth的人来说,很难。当然,这个版本低强度的加密对高手来说完全是小菜一碟。高手就免了,菜鸟
         可以看看。如果和我同是菜鸟你有兴趣脱壳,那先不要看我的脱文,自己试着解决,挑战一下自己,提高
         自己的脱壳水平!
          我会尽量过程详细的讲解。
          注:脱这个ZP的壳的时候,我的电脑中了病毒,感染了我的很多文件,这个软件可能有问题。
              最后我声明一点,我留下邮箱是希望和对技术感兴趣的人交流,对发来的求破求脱邮件,我一概
              不予理会。欢迎大家用邮件同我交流经验技术!
          正文开始.
  先DiE查到编写语言是Delphi,这样脱壳时候心中就有了底。
  OD载入:
  0084B000 >  64:8B3D 3000000>MOV EDI,DWORD PTR FS:[30]
  0084B007    8B7F 0C         MOV EDI,DWORD PTR DS:[EDI+C]
  0084B00A    8B7F 1C         MOV EDI,DWORD PTR DS:[EDI+1C]
  0084B00D    8B3F            MOV EDI,DWORD PTR DS:[EDI]
  0084B00F    8B7F 08         MOV EDI,DWORD PTR DS:[EDI+8]
  0084B012    E8 00000000     CALL 0084B017
  0084B017    5B              POP EBX
  0084B018    81EB 17104000   SUB EBX,00401017
  F7单步到0084B017,用ESP定律(难道你不知道?),一路F9,会弹出注册窗口,点继续试用,再F9,到达OEP:
  005F6D38    55              PUSH EBP
  005F6D39    8BEC            MOV EBP,ESP
  005F6D3B    83C4 C0         ADD ESP,-40
  005F6D3E    53              PUSH EBX
  005F6D3F    56              PUSH ESI
  005F6D40    33C0            XOR EAX,EAX
  005F6D42    8945 C0         MOV DWORD PTR SS:[EBP-40],EAX
  005F6D45    8945 C4         MOV DWORD PTR SS:[EBP-3C],EAX
  005F6D48    8945 C8         MOV DWORD PTR SS:[EBP-38],EAX
  005F6D4B    8945 E4         MOV DWORD PTR SS:[EBP-1C],EAX
  005F6D4E    8945 E0         MOV DWORD PTR SS:[EBP-20],EAX
  005F6D51    8945 DC         MOV DWORD PTR SS:[EBP-24],EAX
  005F6D54    8945 E8         MOV DWORD PTR SS:[EBP-18],EAX
  005F6D57    8945 EC         MOV DWORD PTR SS:[EBP-14],EAX
  005F6D5A    B8 80645F00     MOV EAX,005F6480
  005F6D5F    E8 7407E1FF     CALL 004074D8
  005F6D64    33C0            XOR EAX,EAX
  005F6D66    55              PUSH EBP
  005F6D67    68 B06F5F00     PUSH 005F6FB0
  005F6D6C    64:FF30         PUSH DWORD PTR FS:[EAX]
  005F6D6F    64:8920         MOV DWORD PTR FS:[EAX],ESP
  005F6D72    8D55 EC         LEA EDX,DWORD PTR SS:[EBP-14]
  005F6D75    B8 F8206000     MOV EAX,006020F8
  005F6D7A    E8 0D78F9FF     CALL 0058E58C
  005F6D7F    8B55 EC         MOV EDX,DWORD PTR SS:[EBP-14]
  看到OEP处的代码没有,的确是Delphi语言的(不要说你一点都不熟悉Delphi语言程序入口),Zp壳不会对OEP
  进行处理,它的重点是IAT,我们有必要查一查(如果你对IAT也不知道,那你先补习补习基础再来吧)。
  我们进入它的第一个CALL   005F6D5F    E8 7407E1FF     CALL 004074D8 看看:
  004074D8    53              PUSH EBX
  004074D9    8BD8            MOV EBX,EAX
  004074DB    33C0            XOR EAX,EAX
  004074DD    A3 A4805F00     MOV DWORD PTR DS:[5F80A4],EAX
  004074E2    6A 00           PUSH 0
  004074E4    E8 2BFFFFFF     CALL 00407414  《——————再进入
  004074E9    A3 68F65F00     MOV DWORD PTR DS:[5FF668],EAX
  004074EE    A1 68F65F00     MOV EAX,DWORD PTR DS:[5FF668]
  004074F3    A3 B0805F00     MOV DWORD PTR DS:[5F80B0],EAX
  
  来到:
  00407413    90              NOP
  00407414  - FF25 B4326000   JMP DWORD PTR DS:[6032B4]  <---到了这里
  0040741A    8BC0            MOV EAX,EAX
  0040741C  - E9 AB082900     JMP 00697CCC
  00407421    90              NOP
  00407422    8BC0            MOV EAX,EAX
  00407424  - E9 8B0B2900     JMP 00697FB4
  00407429    90              NOP
  0040742A    8BC0            MOV EAX,EAX
  0040742C  - E9 23142900     JMP 00698854
  00407431    90              NOP
  
  这里就是IAT调用跳转被处理了的地方,上下翻看,可以发现有两种加密方式:
  第一种:
  00407424  - E9 8B0B2900     JMP 00697FB4
  00407429    90              NOP
  是E9??????0090型加密
  第二种:
  00407414  - FF25 B4326000   JMP DWORD PTR DS:[6032B4],
  
  其实这种只有三处,还有两处是:
  004013D8  - FF25 14326000   JMP DWORD PTR DS:[603214]
  004079D4  - FF25 EC336000   JMP DWORD PTR DS:[6033EC]
  在00407414  - FF25 B4326000   JMP DWORD PTR DS:[6032B4]跟随可以到达:
  
  00E33E10    8B4424 04       MOV EAX,DWORD PTR SS:[ESP+4]
  00E33E14    E8 57050000     CALL 00E34370  <------进入
  00E33E19    C2 0400         RETN 4
  
  进入后来到:
  00E34370    50              PUSH EAX
  00E34371    FF15 6CC8E300   CALL DWORD PTR DS:[E3C86C]               ; kernel32.GetModuleHandleA
  00E34377    C3              RETN
  
  哈,原来是调用GetModuleHandleA。可以发现,这三个都是调用GetModuleHandleA,于是我们手工解决了它们。
  
  对第一种,我们先要找到它解密的地方。
  我们在004079DC  - E9 7F0B2900     JMP 00698560  新建EIP,F7单步跟踪,可来到
  00E4E734    9C              PUSHFD  <——————在这步之后在命令行输入 hr esp(对ESP下断点)
  00E4E735    E9 F7430000     JMP 00E52B31
  00E4E73A    17              POP SS
  之后F9,可以来到
  00DF6A8E    C3              RETN  <--------停在这里
  00DF6A8F    68 6AD06979     PUSH 7969D06A
  00DF6A94  ^ E9 6795FFFF     JMP 00DF0000
  00DF6A99    000F            ADD BYTE PTR DS:[EDI],CL
  00DF6A9B    B6 53           MOV DH,53
  
  此时堆栈出现
  0012FFC0   7C809A2D  kernel32.LocalAlloc<---------对应的是这句
  0012FFC4   7C817077  返回到 kernel32.7C817077
  0012FFC8   7C930228  ntdll.7C930228
  原来它是跳向LocalAlloc函数,那这里00DF6A8E 就是解密完成后的地方了,现在我们写脚本修复。
  var fi
  var tmp
  var oldeip
  var oldesp
  mov oldeip,eip        //脚本之后要还原EIP,ESP
  mov oldesp,esp
  mov fi,401000
  bphws 00DF6A8E,"x"     //在解密处设置硬件断点
  
  loop:
  mov esp,oldesp
  find fi,#E9??????0090#      //搜索E9??????0090型加密
  cmp $RESULT,0
  je exit
  mov fi,$RESULT
  GCI  fi,TYPE
  CMP  $RESULT,50
  JNZ loop
  gci fi,DESTINATION         //修改指定地址的指令在搜索到的地址处获取目标地址
  mov tmp,$RESULT
  mov eip,fi
  esto
  mov tmp,[esp]                //把解密后的函数写向tmp变量
  eval "jmp {tmp}"             //计算表达式,得到“jmp XXXXXXXXX”
  asm fi,$RESULT                //将结果进行汇编,修改指定地址的指令
  jmp loop
  
  exit:
  mov eip,oldeip
  mov esp,oldesp
  bphwc
  ret
  
  跑完脚本后,我们发现我们原先找到的IAT跳转加密处变成了:
  00407414  - FF25 B4326000   JMP DWORD PTR DS:[6032B4]  ; kernel32.GetModuleHandleA<------这里我们已经修复了的
  0040741A    8BC0            MOV EAX,EAX
  0040741C  - E9 0C26407C     JMP kernel32.LocalAlloc
  00407421    90              NOP
  00407422    8BC0            MOV EAX,EAX
  00407424  - E9 B723407C     JMP kernel32.TlsGetValue
  00407429    90              NOP
  0040742A    8BC0            MOV EAX,EAX
  0040742C  - E9 3428407C     JMP kernel32.TlsSetValue
  00407431    90              NOP
  
  这样的IAT跳转可不行,因为你就算脱掉了,也不能在别的人的电脑上运行。这里介绍一种工具,专门解决这类
  问题的:Universal Import Fixer (UIF) v1.2 FINAL。(你没用过这款工具?啧啧...)
  打开工具,输入我们OD加载的程序ID,把那几个勾都打上,点击开始,于是,我们看到:
  
  00407414  - FF25 68004E01   JMP DWORD PTR DS:[14E0068]               ; kernel32.GetModuleHandleA
  0040741A    8BC0            MOV EAX,EAX
  0040741C  - FF25 A8004E01   JMP DWORD PTR DS:[14E00A8]               ; kernel32.LocalAlloc
  00407422    8BC0            MOV EAX,EAX
  00407424  - FF25 BC004E01   JMP DWORD PTR DS:[14E00BC]               ; kernel32.TlsGetValue
  0040742A    8BC0            MOV EAX,EAX
  0040742C  - FF25 C0004E01   JMP DWORD PTR DS:[14E00C0]               ; kernel32.TlsSetValue
  00407432    8BC0            MOV EAX,EAX
  00407434    50              PUSH EAX
  看到了没有,帮我们都修理好了,哈哈,只剩下DUMP修复了!
  于是我们兴高采烈地Dump,想到我以前脱掉的ZP1.4demo的壳,都会对资源进行处理(不知道的同志到论坛搜搜啦)
  于是Dump的时候去掉了“paste header from disk(从磁盘粘贴PE文件头)”前面的勾
  然后修复IAT,看到UIF的日志
  
  
  74680000 至:746CC000
  
  msctfime.ime
  73640000 至:7366E000
  
  ===============================================================
  
  输入表修复完成!
  
  已修复的模块: 风起电话DDOS软件.exe
  镜像基址:     00400000
  
  IAT RVA : 010E0000
  IAT 大小: 0000080C
  
  正常的输入表函数: 3  <-------这是我们手工修复的三个GetModuleHandleA函数
  直接的输入表函数: 553
  全部的输入表函数: 556
  
  在修复IAT的时候,IAT RVA要填 010E0000,也就是UIF帮我们重建的RVA地址(在上面,还没看见?...)
  填好后,点Get Imports,此时就不要点自动搜索了。修复IAT,我们兴奋地打开“修复好了”的程序,
  咔嚓..心凉了半截,怎么出错了?
  看到出错提示:“应用程序正常初始化(0xc0000005)失败。请单击确定,终止应用程序。”
  傻了眼,怎么会初始化失败呢?看到初始化几个字,你想到了什么?对,多半是PE头出了问题。
  也就是说,我们Dump的时候PE头不是从磁盘粘贴的,而我们得到的是残缺的PE头!那么只要我们从磁盘
  粘贴PE头就可以了吧。但是,程序资源表必然是动过手脚的,怎么办呢?哈哈,这还不简单?我们现在得到的程序虽然PE头有问题,但我们资源表是好的啊,于是记下
  资源表  RVA :00229000
          SIZE:0006BF58
  再重新Dump,此时要勾选“从磁盘粘贴PE头”。修复IAT后,修改资源表RVA,SIZE,保存。
  运行。...哈哈,成功!
  试练软件:http://pan.baidu.com/share/link?shareid=403890&uk=4280448916
--------------------------------------------------------------------------------
【版权声明】: 本文原创于红绡枫叶, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2013年03月03日 下午 09:16:25

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 1626
活跃值: (138)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
2
写得挺详细。
2013-3-4 15:42
0
游客
登录 | 注册 方可回帖
返回
//