首页
社区
课程
招聘
K.O.--→tElock 0.99
发表于: 2005-11-12 09:03 4998

K.O.--→tElock 0.99

2005-11-12 09:03
4998
【脱壳作者】 windycandy

【作者邮箱】 nickson@163.com

【使用工具】 PEiD、ODbyDYK v1.10、ImportREC1.6 Final

【脱壳平台】 Win XP

【软件名称】 MC++的crackme

【软件大小】 25.5K

【加壳方式】 tElock 0.99 -> tE!

【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)

--------------------------------------------------------------------------------

【脱壳内容】

[tElock 0.99 -> tE!]
signature = E9 5E DF FF FF 00 00 00
ep_only = true

脱壳过程

1.找OEP

OD载入程序,设置除了忽略kernel32异常之外,其他异常全部不忽略

(注:有些程序可以用2次内存断点来快速到达OEP,但是这种方法好象并不通用,
个人认为用二哥进阶教程脱tElock 0.98 -> tE!方法比较稳当)

入口代码:

0040A09D m>^\E9 5EDFFFFF     jmp mc++.00408000
0040A0A2     0000            add byte ptr ds:[eax],al
0040A0A4     0055 E6         add byte ptr ss:[ebp-1A],dl
0040A0A7     9D              popfd
0040A0A8     EC              in al,dx
0040A0A9     E5 A0           in eax,0A0
0040A0AB     0000            add byte ptr ds:[eax],al
0040A0AD     0000            add byte ptr ds:[eax],al

shift+f9运行,经过16次左右异常后到最后一次异常处

00409C74     FE03            inc byte ptr ds:[ebx]----------这里
00409C76   ^ EB E8           jmp short mc++.00409C60
00409C78     B8 9B14501B     mov eax,1B50149B
00409C7D     E8 0C000000     call mc++.00409C8E
00409C82     15 9D15501B     adc eax,1B50159D
00409C87     E9 09000000     jmp mc++.00409C95
00409C8C     33C1            xor eax,ecx
00409C8E     C1E8 C9         shr eax,0C9
00409C91     C3              retn
00409C92     48              dec eax
00409C93     33C1            xor eax,ecx
00409C95     1BC7            sbb eax,edi
00409C97     2BD2            sub edx,edx
00409C99     64:8F02         pop dword ptr fs:[edx]

看堆栈的值:

0012FF78   0012FFE0  指针到下一个 SEH 记录
0012FF7C   00409C66  SE 句柄-------------------注意这里
0012FF80   00000000
0012FF84   00000000
0012FF88   00006A24
0012FF8C   0012FFA0

在CPU窗口ctrl+G到:409C66

00409C66     8B6424 08       mov esp,dword ptr ss:[esp+8]-----到这里,F2下断
00409C6A     EB 0C           jmp short mc++.00409C78
00409C6C     33DB            xor ebx,ebx
00409C6E     64:FF33         push dword ptr fs:[ebx]

shift+F9断在409C66处,取消断点

将鼠标向上拖到代码的最顶上处

00408000     000400          add byte ptr ds:[eax+eax],al----------看这行的地址值
00408003     00DB            add bl,bl
00408005     CC              int3
00408006     B3 B7           mov bl,0B7
00408008     4D              dec ebp
00408009     5A              pop edx
0040800A     90              nop
0040800B     0003            add byte ptr ds:[ebx],al
0040800D     0000            add byte ptr ds:[eax],al

于是在命令行下:tc eip<408000,中断在OEP处

004013FB   /.  55            push ebp---------------断在这里
004013FC   |.  8BEC          mov ebp,esp
004013FE   |.  6A FF         push -1
00401400   |.  68 B8404000   push mc++.004040B8
00401405   |.  68 301F4000   push mc++.00401F30                    ;  SE 句柄安装
0040140A   |.  64:A1 0000000>mov eax,dword ptr fs:[0]
00401410   |.  50            push eax
00401411   |.  64:8925 00000>mov dword ptr fs:[0],esp
00401418   |.  83EC 58       sub esp,58
0040141B   |.  53            push ebx
0040141C   |.  56            push esi
0040141D   |.  57            push edi

2.获得IAT起始地址及修复

用OD插件将其dump出来,不关OD,打开ImportREC,OEP:13FB,自动搜索,得到无效指针(有些程序获得
到部分有效指针),这时无论是用ImportREC的level 1还是level 2、level 3及tElock插件都无法搜索到
有效的函数,IAT已经被加密了,注意RAV的值:00004000先记下(IAT起始地址)。下面开始我们的解密
IAT之旅:

ctrl+f2重新载入加壳程序,OD设置忽略所有异常,再添加以下几个异常C0000005(ACCESS VIOLATION)、
C000001D(ILLEGALINSTRUCTION)、C000001E(INVALID LOCK SEQUENCE)、C0000096(PRIVILEGED INSTRUCTION)

ctrl+g到:404000(IAT起始地址+基址)

00404000     96              xchg eax,esi-------------到这里
00404001     DE64F4 07       fisub word ptr ss:[esp+esi*8+7]
00404005     CB              retf
00404006     92              xchg eax,edx
00404007     8910            mov dword ptr ds:[eax],edx
00404009     36:0962 47      or dword ptr ss:[edx+47],esp
0040400D     9C              pushfd

在404000下内存写入断点,shift+f9中断

0040914A     AA              stos byte ptr es:[edi]---------断在这里
0040914B     69D2 A5B0CD4B   imul edx,edx,4BCDB0A5
00409151     F9              stc
00409152     72 02           jb short mc++.00409156
00409154     CD20 D1C269DB   vxdjump DB69C2D1
0040915A     70 1F           jo short mc++.0040917B
0040915C     EE              out dx,al
0040915D     6A 03           push 3
0040915F     DA49 0F         fimul dword ptr ds:[ecx+F]
00409162     8F              ???                                   ; 未知命令
00409163     5B              pop ebx
00409164     FFFF            ???                                   ; 未知命令

再ctl+s找

pushad
sub eax, eax
inc eax
cmp dword ptr ds:[edi], 0
lea edi,dword ptr ds:[edi+4]

找到这里

004097E8     48              dec eax
004097E9     75 36           jnz short mc++.00409821
004097EB     60              pushad-------------------------这里
004097EC     2BC0            sub eax,eax
004097EE     40              inc eax
004097EF     833F 00         cmp dword ptr ds:[edi],0
004097F2     8D7F 04         lea edi,dword ptr ds:[edi+4]
004097F5   ^ 75 F7           jnz short mc++.004097EE
004097F7     48              dec eax
004097F8     74 1F           je short mc++.00409819
004097FA     8BD8            mov ebx,eax

向上找到如下代码处

004096EF     C3              retn
004096F0     8985 4B374000   mov dword ptr ss:[ebp+40374B],eax
004096F6     8D85 942E4000   lea eax,dword ptr ss:[ebp+402E94]
004096FC     60              pushad
004096FD     33C9            xor ecx,ecx
004096FF     2AF6            sub dh,dh
00409701     8A13            mov dl,byte ptr ds:[ebx]
00409703     F6C2 40         test dl,40
00409706     74 03           je short mc++.0040970B
00409708     80E2 5F         and dl,5F
0040970B     0AD2            or dl,dl
0040970D     74 1E           je short mc++.0040972D-----★magic jump/修改为:jmp 0040972D
0040970F     43              inc ebx
00409710     FEC6            inc dh
00409712     41              inc ecx
00409713     3A5408 FF       cmp dl,byte ptr ds:[eax+ecx-1]
00409717   ^ 74 E8           je short mc++.00409701
00409719     3A5408 08       cmp dl,byte ptr ds:[eax+ecx+8]
0040971D   ^ 74 E2           je short mc++.00409701
0040971F     3A5408 12       cmp dl,byte ptr ds:[eax+ecx+12]
00409723   ^ 74 DC           je short mc++.00409701
00409725     3A5408 1D       cmp dl,byte ptr ds:[eax+ecx+1D]
00409729   ^ 74 D6           je short mc++.00409701
0040972B   ^ EB D0           jmp short mc++.004096FD
0040972D     0AF6            or dh,dh
0040972F     895424 1C       mov dword ptr ss:[esp+1C],edx
00409733     61              popad

将magic jump修改后,alt+m在code段下内存访问断点

00400000    00001000 (4096.)   00400000          PE header   Imag  01001002   R   RWE

00401000    00003000 (12288.)  00400000   text   code        Imag 01001002    R   RWE----下内存访问断点

shift+f9到OEP,到这里所有的IAT已经解密完毕,可以进行修复了。不关OD,打开ImportREC,OEP:13FB,自动搜索,
现在看看找到了什么?得到所有的指针都含情脉脉,对你暗送秋天里的菠菜啊(赵本山经典语),所有效指针全部
有效,修复抓取文件,OK,修复后的程序正常运行!!!

附件包含(这里传不上,去DFCG找):本文、crackme及unpacked

--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 108
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
  有点麻烦了
2005-11-12 10:22
0
雪    币: 236
活跃值: (100)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
另外发现这个壳给XP的notepad加壳后不能运行,98的notepad也加不了壳,不知道是什么原因,如果你遇到或使用这个壳,或在提高及完善这个壳的功能,希望本文对你有所帮助。
2005-11-12 10:44
0
雪    币: 108
活跃值: (42)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 windycandy 发布
98的notepad也加不了壳,不知道是什么原因...


可以运行的哦附件:notepad_telock v1.0.rar
2005-11-12 11:13
0
雪    币: 184
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
可以运行的XPSP2记事本没问题啊.
2005-11-12 21:23
0
雪    币: 236
活跃值: (100)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
6
我的SP1啊
2005-11-15 11:54
0
雪    币: 82
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
能不能转来这?dfcg没下载权限。
2005-11-15 17:03
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
学习一下!
2005-11-15 22:20
0
游客
登录 | 注册 方可回帖
返回
//