欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

由对MagicWin 2.0的脱壳想到的 (3千字)

由对MagicWin 2.0的脱壳想到的 (3千字)

本文是我在脱壳过程中的体会,对于软件的脱壳,我目前还有很多不明白的地方,请高手赐教。
url: http://binbin.myrice.com/download/magicwin2.zi
说明:该软件在一定程度上是免费的,本人仅是以这个软件为例来讨论一些问题
MagicWin 2.0是Authorware的第三方外部函数,程序名为magicwin.u32,即dll库,程序已经被加壳,该壳用fi并不能检测出来,本文的目的是脱壳并找到程序的入口点,而不是找出该dll的注册码的计算部分。
工具:SoftICE 4.05,Procdump 1.6,peditor,W32Dasm
1. 运行peditor,打开magicwin.u32,观察入口点为1D001
2. 运行Authorware 5.2,选择倒入外部函数,load,弹出对话框后,找到magicwin.u32
3. Ctrl+D呼出SoftICE,bpx loadlibrarya,f5,选择打开magicwin.u32,这时会被SoftICE拦截,这时的magicwin.u32已经脱壳
4. code on,记下eip当前的机器码:8B F0,a eip,输入jmp eip(机器码EB FE),f5
5. 运行Procdump,在task中找到Authorware 5.exe,在其下面的module中找到magicwin.u32,鼠标右键dump,就会得到脱壳的文件,现在需要的工作之一就是修改入口点
6. 观察magicwin.u32被载入到05410000段,05410000+1D001=0542D001,即加壳的入口点,bpx 0542D001,f5
7. 随便选择一个要载入的函数或者选择“取消”,这时又会被拦回
8. f8几次就会来到入口点:05412B38,用peditor编辑脱壳后的magicwin.u32,改入口点为2B38
9. 一般地,到8也就结束了,重新修改资源即可得到完整的脱壳文件。
  但下面的是我的发现及体会
10. 用W32Dasm对magicwin.u32反汇编,在改入口点之前和之后有些不一样,在改之前反汇编的结果入口点是灰的,而改之后则有入口点,到底是什么原因哪?
观察程序的section,共有7个,如下(改入口点之前)
  Object01: .text    RVA: 00001000 Offset: 00000600 Size: 000044D0 Flags: 60000040
  Object02: .rdata  RVA: 00006000 Offset: 00004C00 Size: 00001180 Flags: C0000040
  Object03: .data    RVA: 00008000 Offset: 00005E00 Size: 00010C3C Flags: C0000040
  Object04: .rsrc    RVA: 00019000 Offset: 00016C00 Size: 00002E8C Flags: C0000040
  Object05: .reloc  RVA: 0001C000 Offset: 00019C00 Size: 0000062C Flags: C0000040
  Object06: .crypt  RVA: 0001D000 Offset: 0001A400 Size: 00001318 Flags: C0000040
  Object07: .data    RVA: 0001F000 Offset: 0001B800 Size: 00000000 Flags: C0000040
其中,第6个为壳的代码,section为一个中不中洋不洋的的名字,为了便于理解,用peditor改为.crypt,从这个表中可以知道,.text为代码部分,Flags为60000040,其他的均为C0000040,这就告诉W32Dasm,
只对.text中的代码进行反汇编,而壳的地址为1D000,故这段代码当然就不进行反汇编,因此,用peditor修改magicwin.u32,编辑.crypt段,将Flags由C0000040改为60000040,再用W32Dasm进行反汇编,哈哈,这回壳的代码出来了,入口点也有了,看一段该壳的反汇编结果
:1001D001 60                      pushad          <-- 壳的入口地址
:1001D002 E900000000              jmp 1001D007
:1001D007 E824040000              call 1001D430
:1001D00C EB00                    jmp 1001D00E
:1001D00E BB30394400              mov ebx, 00443930
:1001D013 03DD                    add ebx, ebp
:1001D015 2B9DD03F4400            sub ebx, dword ptr [ebp+00443FD0]
:1001D01B 83BDFC49440000          cmp dword ptr [ebp+004449FC], 00000000  <--是否已经解码,0则表示没有解码
:1001D022 899DFC494400            mov dword ptr [ebp+004449FC], ebx
:1001D028 0F8566030000            jne 1001D394    <-- 已经解码,则走
:
:
:
:1001D394 8B85AD394400            mov eax, dword ptr [ebp+004439AD]
:
:
:做一些准备工作
:
:
:1001D3B5 68382B4105              push 05412B38    <-- magicwin.u32真正的入口点
:1001D3BA C3                      ret
通过这个程序的脱壳过程,使我体会到,如果需要反汇编出某段代码,只要修改其Flags,这对于那些加过壳的软件可能会有帮助。在《论坛精华》的脱壳篇中,冰毒的文章《手动脱壳的基本技巧》有这样一段文字:“别人教我说, E0000020将使section成为可执行的,因此Softice将会中断于入口处.”也许就是这个意思。我将C0000040改为60000040可能实际上并不对,但我的目的是反汇编,只要能反汇编出代码就行了。
希望高手能批评指正,大家共同探讨。另外,我对脱壳后的重建还不是很熟,谁能帮我?

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功