首页
社区
课程
招聘
[原创]PEX 0.99 -> bart/CrackPl加壳的记事本脱
发表于: 2005-2-21 00:50 5261

[原创]PEX 0.99 -> bart/CrackPl加壳的记事本脱

2005-2-21 00:50
5261
【破解作者】 clide2000[DFCG][OCN]
【作者邮箱】 54arma@sina.com
【使用工具】 OD;LoadPe;ImportREC
【破解平台】 Win9x/NT/2000/XP
【软件名称】 unpackme
【下载地址】 见附件,里面是unpackme与我脱好的dump文件
附件:unpackme29.rar
【软件简介】 一个PEX 0.99 -> bart/CrackPl加壳的记事本,在练习时发现他加密码了几个函数,用ImportREC无法直接修复,故把此笔记与大家

分享,高手莫笑.^_^
【软件大小】 37K
【加壳方式】 PEX 0.99 -> bart/CrackPl
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】

首先,OD加载,并忽略所有异常,启动IsDebugPresent
  0040C000 > /E9 F5000000       jmp unpackme.0040C0FA
  0040C005   |0D 0AC4C4C4       or eax, C4C4C40A
  0040C00A   |C4C4              les eax, esp                                          ; Illegal use of register
  0040C00C   |C4C4              les eax, esp                                          ; Illegal use of register
  0040C00E   |C4C4              les eax, esp                                          ; Illegal use of register
  0040C010   |C4C4              les eax, esp                                          ; Illegal use of register
  0040C012   |C4C4              les eax, esp                                          ; Illegal use of register
  0040C014   |C4C4              les eax, esp                                          ; Illegal use of register

一避过IAT的加密
  在命令行下 bp VirtualAlloc,F9运行,中断于此,然后F8单步执行
  77E5AC72 >  55                push ebp
  77E5AC73    8BEC              mov ebp, esp
  77E5AC75    FF75 14           push dword ptr ss:[ebp+14]
  77E5AC78    FF75 10           push dword ptr ss:[ebp+10]
  77E5AC7B    FF75 0C           push dword ptr ss:[ebp+C]
  77E5AC7E    FF75 08           push dword ptr ss:[ebp+8]
  77E5AC81    6A FF             push -1
  77E5AC83    E8 9CFFFFFF       call kernel32.VirtualAllocEx
  77E5AC88    5D                pop ebp
  77E5AC89    C2 1000           retn 10  ;当F8到这里时,注意EAX的值,里面放的是申请成功的内存地址

在我的机子上当时是这样的
  EAX 003A0000            ;注意,就是这里,记住这个值,一会要用的.即3a0000
  ECX 77E5AC6F kernel32.77E5AC6F
  EDX 7FFE0304
  EBX 0000B473
  ESP 0012FF80
  EBP 00009E34
  ESI 00000000
  EDI 00000000

下面,先下bc VirtualAlloc,清除之前的断点,然后下he 3A0000,即在申请成功的内存首地址处下硬件执行断点,F9运行
中断于:
  003A0000    95                xchg eax, ebp
  003A0001    E8 01000000       call 003A0007
  003A0006    C7                ???                                                   ; Unknown command
  003A0007    5D                pop ebp
  003A0008    81ED D0254000     sub ebp, 4025D0
  003A000E    8D95 212A4000     lea edx, dword ptr ss:[ebp+402A21]
  003A0014    6A 07             push 7
  003A0016    59                pop ecx
  003A0017    8B1A              mov ebx, dword ptr ds:[edx]
  003A0019    03DD              add ebx, ebp
  003A001B    0103              add dword ptr ds:[ebx], eax
  003A001D    83C2 04           add edx, 4
  003A0020  ^ E2 F5             loopd short 003A0017
  003A0022    81C6 73040000     add esi, 473

现在,先清楚上面下的硬件断点,然后下bp GetProcAddress,F9运行,会中断在
  77E5B332 >  55                push ebp
  77E5B333    8BEC              mov ebp, esp
  77E5B335    51                push ecx
  77E5B336    51                push ecx
  77E5B337    53                push ebx
  77E5B338    57                push edi
  77E5B339    8B7D 0C           mov edi, dword ptr ss:[ebp+C]
  77E5B33C    BB FFFF0000       mov ebx, 0FFFF
  77E5B341    3BFB              cmp edi, ebx
  77E5B343  ^ 0F86 894BFFFF     jbe kernel32.77E4FED2
  77E5B349    57                push edi

好了,77E5B332 >  55                push ebp
  77E5B333    8BEC              mov ebp, esp
  77E5B335    51                push ecx
  77E5B336    51                push ecx
  77E5B337    53                push ebx
  77E5B338    57                push edi
  77E5B339    8B7D 0C           mov edi, dword ptr ss:[ebp+C]
  77E5B33C    BB FFFF0000       mov ebx, 0FFFF
  77E5B341    3BFB              cmp edi, ebx
  77E5B343  ^ 0F86 894BFFFF     jbe kernel32.77E4FED2
  77E5B349    57                push edi

好了,77E5B332 >  55                push ebp
  77E5B333    8BEC              mov ebp, esp
  77E5B335    51                push ecx
  77E5B336    51                push ecx
  77E5B337    53                push ebx
  77E5B338    57                push edi
  77E5B339    8B7D 0C           mov edi, dword ptr ss:[ebp+C]
  77E5B33C    BB FFFF0000       mov ebx, 0FFFF
  77E5B341    3BFB              cmp edi, ebx
  77E5B343  ^ 0F86 894BFFFF     jbe kernel32.77E4FED2
  77E5B349    57                push edi

好了,77E5B332 >  55                push ebp
  77E5B333    8BEC              mov ebp, esp
  77E5B335    51                push ecx
  77E5B336    51                push ecx
  77E5B337    53                push ebx
  77E5B338    57                push edi
  77E5B339    8B7D 0C           mov edi, dword ptr ss:[ebp+C]
  77E5B33C    BB FFFF0000       mov ebx, 0FFFF
  77E5B341    3BFB              cmp edi, ebx
  77E5B343  ^ 0F86 894BFFFF     jbe kernel32.77E4FED2
  77E5B349    57                push edi

好了bc GetProcAddress,取消上面的断点,接着就Alt+M,在3A0000段上下内存访问断点,F9运行
这次会中断在
  003A00F2    85C0              test eax, eax                                         ; SHELL32.#584
  003A00F4    0F84 C5020000     je 003A03BF
  003A00FA    E8 01000000       call 003A0100
  003A00FF    6959 DF BD6C2940  imul ebx, dword ptr ds:[ecx-21], 40296CBD
  003A0106    00DF              add bh, bl
  003A0108    AD                lods dword ptr ds:[esi]
  003A0109    6C                ins byte ptr es:[edi], dx                             ; I/O command
  003A010A    2940 00           sub dword ptr ds:[eax], eax
  003A010D    EB 03             jmp short 003A0112
  003A010F    C7848B E88B0200 0>mov dword ptr ds:[ebx+ecx*4+28BE8], C703EB00

好了说了半天,终于要找到了
Ctrl+s,搜索以下这段代码.(和fly等大侠们学的,没事就爱用搜的^_^)
  add esp, 4
  mov ebx, 40C385
  lea ecx, dword ptr ss:[ebp+4025CB]
  add ebx, dword ptr ds:[ecx]
  cmp dword ptr ds:[ecx], 9B4
  jnb 003A02FF

哈哈,一下就找到这里了
  003A0221    83C4 04           add esp, 4
  003A0224    BB 85C34000       mov ebx, 40C385
  003A0229    8D8D CB254000     lea ecx, dword ptr ss:[ebp+4025CB]
  003A022F    0319              add ebx, dword ptr ds:[ecx]
  003A0231    8139 B4090000     cmp dword ptr ds:[ecx], 9B4
  003A0237    0F83 C2000000     jnb 003A02FF               ;Magic Jump,把这改成jmp,就可以跳过对IAT的加密了
  003A023D    53                push ebx
  003A023E    E8 01000000       call 003A0244

修改好以后,先取消之前的内存访问断点,最后Alt+M,在401000段上下内存访问断点,F9运行
一下子就到了OEP了
  004010CC      55              db 55                                                 ;  CHAR 'U'
  004010CD      8B              db 8B
  004010CE      EC              db EC
  004010CF      83              db 83
  004010D0      EC              db EC
  004010D1      44              db 44                                                 ;  CHAR 'D'
  004010D2      56              db 56                                                 ;  CHAR 'V'
  004010D3      FF              db FF
  004010D4      15              db 15
  004010D5      E0              db E0
  004010D6      63              db 63                                                 ;  CHAR 'c'
  004010D7      40              db 40                                                 ;  CHAR '@'

看起很乱吗,那是因为还没有分析呀,Ctrl+A,这之后再看看,是不是很熟悉了.
  004010CC  /.  55              push ebp
  004010CD  |.  8BEC            mov ebp, esp
  004010CF  |.  83EC 44         sub esp, 44
  004010D2  |.  56              push esi
  004010D3  |.  FF15 E0634000   call dword ptr ds:[4063E0]                            ;  unpackme.0040C5C0
  004010D9  |.  8BF0            mov esi, eax
  004010DB  |.  8A00            mov al, byte ptr ds:[eax]
  004010DD  |.  3C 22           cmp al, 22

二dump和修复
  现在就可以用LoadPe去dump文件,用ImportREC修复了
  用ImportREC抓取IAT时,oep填10cc(地球人都知道了,呵呵),点搜点,最后cut掉无用了垃圾内容,修复即可.

--------------------------------------------------------------------------------
【破解总结】

写的很乱,谢谢你看完这篇文章。没啥说的了,只是觉得如果能很好的运用VirtrualAlloc、GetProcAddress等API,就可以使脱壳变得轻松些。]
在此对csjwaman,jwh51,fly等经常帮助、指点我的兄弟表示感谢。
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 319
活跃值: (2439)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
2
支持一下!可是WIN2K SP4下无法运行。
2005-2-21 08:03
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
3
最初由 csjwaman 发布
支持一下!可是WIN2K SP4下无法运行。


果然如此,那这是为什么呢,我是在winxp_sp1下脱的壳,为什么总存在在其它平台下无法正常运行的问题,上次脱过一个aspr1.23Rc1的,也遇到了这种问题,在xp_sp1下已经将IAT修复了,为什么不能跨平台呢。还望各位指点。
2005-2-21 09:01
0
雪    币: 898
活跃值: (4039)
能力值: ( LV9,RANK:3410 )
在线值:
发帖
回帖
粉丝
4
试试:

去掉ImportREC“新建输入表”的几个选项设置
2005-2-21 09:27
0
雪    币: 225
活跃值: (146)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
支持一下啊。。。
2005-2-21 11:25
0
雪    币: 154
活跃值: (216)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
好贴正如美女,是要 顶 弟,我顶
2005-2-22 17:09
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
7
最初由 fly 发布
试试:

去掉ImportREC“新建输入表”的几个选项设置


多谢fly大侠指点,又学了一手
2005-2-22 22:54
0
游客
登录 | 注册 方可回帖
返回
//