| 
注册时间2007-11-2
阅读权限10
最后登录1970-1-1UID36468 周游历练 
 
 该用户从未签到 | 
 
| 【破解作者】 齐东野人 【作者邮箱】 论坛让留邮箱吗?
 【使用工具】 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并非难事
 --------------------------------------------------------------------------------
 【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
 | 
 |