飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3531|回复: 2

[原创] 脱加telock的98记事本及寻找magic jmp方法

[复制链接]

该用户从未签到

发表于 2008-2-25 01:56:00 | 显示全部楼层 |阅读模式
破解作者】 齐东野人
【作者邮箱】 论坛让留邮箱吗?
【使用工具】 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:[4063E4]
004010D9    8BF0            MOV ESI,EAX
004010DB    8A00            MOV AL,BYTE PTR DS:[EAX]


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

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

004063E4  009402AA
004063E8  009402BB
004063EC  009402CB
004063F0  009402F1

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

004063E4  7C812F1D      kernel32.GetCommandLineA
004063E8  7C80FE82      kernel32.GlobalUnlock
004063EC  7C8353CE      kernel32._lread
004063F0  7C80FF19      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:[EBX]
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:[EAX+ECX-1]
0040D330  ^ 74 E8           JE SHORT tElock.0040D31A
0040D332    3A5408 08       CMP DL,BYTE PTR DS:[EAX+ECX+8]
0040D336  ^ 74 E2           JE SHORT tElock.0040D31A
0040D338    3A5408 12       CMP DL,BYTE PTR DS:[EAX+ECX+12]
0040D33C  ^ 74 DC           JE SHORT tElock.0040D31A
0040D33E    3A5408 1D       CMP DL,BYTE PTR DS:[EAX+ECX+1D]
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:[ESP+1C],EDX
0040D34C    61                         POPAD
0040D34D    C685 D7CC4000 00           MOV BYTE PTR SS:[EBP+40CCD7],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:[4063E4]                   ;

kernel32.GetCommandLineA

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

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


找magic jmp的方法有点取巧,但仔细分析相应部分的代码,找到magic jmp并非难事
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
PYG19周年生日快乐!
  • TA的每日心情
    擦汗
    2019-3-20 20:06
  • 签到天数: 258 天

    [LV.8]以坛为家I

    发表于 2008-2-25 19:19:55 | 显示全部楼层
    学习技术,支持!~~~
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2019-2-17 18:27
  • 签到天数: 33 天

    [LV.5]常住居民I

    发表于 2008-2-25 20:43:49 | 显示全部楼层
    学习了,telock0.99 的插件就可以修复了,


    省事,但学不到技术

    [ 本帖最后由 yingfeng 于 2008-2-25 20:45 编辑 ]
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表