齐东野人 发表于 2008-2-25 01:56:00

脱加telock的98记事本及寻找magic jmp方法

【破解作者】 齐东野人
【作者邮箱】 论坛让留邮箱吗?
【使用工具】 OD,LordPE,ImportREC
【破解平台】 XP
【软件名称】 网上找到的加telock的98记事本
【加壳方式】 telock
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】


新手学脱壳,一点心得,高手飘过。文章参考了Unpack2007精华集中fly脱telock主程序的脱文,在fly文章的基础上,讲了寻找telock 程序magic jmp
的小技巧。

找OEP
内存镜像法:按ALT+M,打开内存镜象,找到程序的第一个.rsrc.按F2下断点,然后按SHIFT+F9运行到断

点,接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的.CODE(也就是00401000处),按

F2下断点!然后按SHIFT+F9,直接到达程序OEP 004010cc,loadPE dump出程序,ImportREC修复,无论哪

种方法修复,ImportREC总是死掉。得想办法得的完整的iat表

004010CC    55            PUSH EBP
004010CD    8BEC            MOV EBP,ESP
004010CF    83EC 44         SUB ESP,44
004010D2    56            PUSH ESI
004010D3    FF15 E4634000   CALL DWORD PTR DS:
004010D9    8BF0            MOV ESI,EAX
004010DB    8A00            MOV AL,BYTE PTR DS:


IAT被处理了,记事本的第一个CALL DWORD PTR DS: 应该是GetCommandlineA

查看一下内存4063E4附近的值,为

004063E4009402AA
004063E8009402BB
004063EC009402CB
004063F0009402F1

找一个没加壳的记事本看看,应该是7c812f1d左右的值

004063E47C812F1D      kernel32.GetCommandLineA
004063E87C80FE82      kernel32.GlobalUnlock
004063EC7C8353CE      kernel32._lread
004063F07C80FF19      kernel32.GlobalLock


找majic jmp,防止iat被修改

既然004063e4被修改,下硬件断点 hw 004063e4找出修改的地方
重新开始,执行,程序报crc错误,调试器被发现了......
幸亏程序开始有个异常,消除断点,过了异常后恢复硬件断点

重新开始,运行,异常,shift+f7单步过,alt+f9回用户领空,hw 004063e4断点后继续运行,同时观

察其值,

连续中断5次后,发现在0040D4E5处内存004063e4的值被修改成前面的009402AA了,此时的ecx就是我们

关注的值。

往上翻,找到这段程序的开头0040D315,开始分析
0040D315    60            PUSHAD                //eax-edx为dll中函数地址,0ebx中为dll名字
0040D316    33C9            XOR ECX,ECX
0040D318    2AF6            SUB DH,DH

此处的小循环验证dll的名字,取出每个字母按位比较
0040D31A    8A13            MOV DL,BYTE PTR DS:
0040D31C    F6C2 40         TEST DL,40
0040D31F    74 03         JE SHORT tElock.0040D324
0040D321    80E2 5F         AND DL,5F
0040D324    0AD2            OR DL,DL
0040D326    74 1E         JE SHORT tElock.0040D346                 //此处跳出循环
0040D328    43            INC EBX
0040D329    FEC6            INC DH
0040D32B    41            INC ECX
0040D32C    3A5408 FF       CMP DL,BYTE PTR DS:
0040D330^ 74 E8         JE SHORT tElock.0040D31A
0040D332    3A5408 08       CMP DL,BYTE PTR DS:
0040D336^ 74 E2         JE SHORT tElock.0040D31A
0040D338    3A5408 12       CMP DL,BYTE PTR DS:
0040D33C^ 74 DC         JE SHORT tElock.0040D31A
0040D33E    3A5408 1D       CMP DL,BYTE PTR DS:
0040D342^ 74 D6         JE SHORT tElock.0040D31A
0040D344^ EB D0         JMP SHORT tElock.0040D316
0040D346    0AF6                     OR DH,DH
0040D348    895424 1C                  MOV DWORD PTR SS:,EDX
0040D34C    61                         POPAD
0040D34D    C685 D7CC4000 00         MOV BYTE PTR SS:,0
0040D354    74 24                      JE SHORT tElock.0040D37A         //注意此处就是

magic jmp,下面通过观察程序的流程简单证明为何这就是magic jmp

记住这段程序开头0040D315,重新启动od,重复上面步骤,利用异常绕过crc验证,Gtrl+G前往

0040D315,下断点f9运行,顺利断下,看一下寄存器
eax值EAX 0040D586 ASCII "GDI32.DLLUSER32.DLLSHELL32.DLLKERNEL32.DLL"
ECX 7C801BF6 kernel32.7C801BF6
EDX 00140608
EBX 00406592 ASCII "SHELL32.dll"

Eax与ebx的值启发我们找对地方了。eax的值启发我们程序只处理GDI32.DLL USER32.DLL SHELL32.DLL

KERNEL32.DLL

f9运行,并跟踪下面程序的流程,并且注意ebx的值
发现前4轮ebx 为user32.dll,kernel32.dll,gdi32.dll,shell32.dll时,0040D354的跳转并不能实现;

而当第五轮ebx为comdlg32.dll时,0040D354的跳转实现。

猜测0040D354为magic jmp,取消所有断点,重新前面步骤绕过crc验证,返回用户领空后,Ctrl+G来到

0040D354处,修改je为jmp,然后两次内存断点法脱壳,按ALT+M,打开内存镜象,找到程序的第一

个.rsrc.按F2下断点,然后按SHIFT+F9运行到断点,接着再按ALT+M,打开内存镜象,找到程序的第一个

.rsrc.上面的.CODE(也就是00401000处),按F2下断点!然后按SHIFT+F9,直接到达程序OEP

004010cc

此时ollydbg中内容如下

004010CC    55                         PUSH EBP
004010CD    8BEC                     MOV EBP,ESP
004010CF    83EC 44                  SUB ESP,44
004010D2    56                         PUSH ESI
004010D3    FF15 E4634000            CALL DWORD PTR DS:                   ;

kernel32.GetCommandLineA

IAT完整的回来了,证明0040D354处为majic jmp 判断正确

loadPE dump出程序,ImportREC修复,脱壳后程序正常运行
--------------------------------------------------------------------------------
【破解总结】


找magic jmp的方法有点取巧,但仔细分析相应部分的代码,找到magic jmp并非难事
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

yyjpcx 发表于 2008-2-25 19:19:55

学习技术,支持!~~~

yingfeng 发表于 2008-2-25 20:43:49

学习了,telock0.99 的插件就可以修复了,


省事,但学不到技术

[ 本帖最后由 yingfeng 于 2008-2-25 20:45 编辑 ]
页: [1]
查看完整版本: 脱加telock的98记事本及寻找magic jmp方法