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