Armadillo 系列练习第二题
【破文标题】Armadillo 系列练习第二题【破文作者】horizon
【作者邮箱】
【作者主页】http://hi.baidu.com/horizon
【破解工具】OD PEID LORDPE ImportREC
【破解平台】YLMF WINXP SP3
【软件名称】sol.exe
【软件大小】576k
【原版下载】https://www.chinapyg.com/viewthread.php?tid=29496&extra=page%3D1
【保护方式】标准双进程屏蔽调试器
【软件简介】系统自带纸牌游戏
【破解声明】学习交流
------------------------------------------------------------------------
【破解过程】OD载入,hideod01058000 >60 PUSHAD
01058001 E8 00000000 CALL sol.01058006
01058006 5D POP EBP
01058007 50 PUSH EAX
01058008 51 PUSH ECX一、双变单(使程序把自己当成子进程运行)
bp OpenMutexA下断,shift+f9运行
************************************************************
堆栈:0007F770 0102FDB8/CALL 到 OpenMutexA 来自 sol.0102FDB2
0007F774 001F0001|Access = 1F0001
0007F778 00000000|Inheritable = FALSE
0007F77C 0007FDB0\MutexName = "8A4::DACED4DFB3" //记下堆栈数据7FDB0************************************************************
Ctrl+G:0100100000401000 60 pushad
00401001 9C pushfd
00401002 68 A0FD1200 push 7FDB0 //对应上面对应的堆栈数据
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 E694A677 call KERNEL32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 8F9FA777 jmp KERNEL32.OpenMutexA右键--此外新建EIP--选是,删除断点
二、避开Anti
he OutputDebugStringA
中断2次!
选中%s%之类的字符,点右键->二进制->使用00填充
删除此断点!
三、Magic Jump,避开IAT加密
he GetModuleHandleA+5
************************************************************1.
000794FC/0007EC44
00079500|00AC6DF3返回到 00AC6DF3 来自 kernel32.GetModuleHandleA
00079504|00ADBC1CASCII "kernel32.dll"
00079508|00ADCEC4ASCII "VirtualAlloc"
2.
000794FC/0007EC44
00079500|00AC6E10返回到 00AC6E10 来自 kernel32.GetModuleHandleA
00079504|00ADBC1CASCII "kernel32.dll"
00079508|00ADCEB8ASCII "VirtualFree"
3.
00079260/00079500
00079264|00AB5CE1返回到 00AB5CE1 来自 kernel32.GetModuleHandleA
00079268|000793B4ASCII "kernel32.dll"************************************************************
取消断点返回00AB5CE1 8B0D AC40AE00 MOV ECX,DWORD PTR DS:
00AB5CE7 89040E MOV DWORD PTR DS:,EAX
00AB5CEA A1 AC40AE00 MOV EAX,DWORD PTR DS:
00AB5CEF 391C06 CMP DWORD PTR DS:,EBX
00AB5CF2 75 16 JNZ SHORT 00AB5D0A
00AB5CF4 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:
00AB5CFA 50 PUSH EAX
00AB5CFB FF15 BC62AD00 CALL DWORD PTR DS: ; kernel32.LoadLibraryA
00AB5D01 8B0D AC40AE00 MOV ECX,DWORD PTR DS:
00AB5D07 89040E MOV DWORD PTR DS:,EAX
00AB5D0A A1 AC40AE00 MOV EAX,DWORD PTR DS:
00AB5D0F 391C06 CMP DWORD PTR DS:,EBX
00AB5D12 0F84 2F010000 JE 00AB5E47 //magic jump
00AB5D18 33C9 XOR ECX,ECX
00AB5D1A 8B07 MOV EAX,DWORD PTR DS:
00AB5D1C 3918 CMP DWORD PTR DS:,EBX
00AB5D1E 74 06 JE SHORT 00AB5D26往下拉,找如此类似的序列(一个jnz,一个jmp,两个salc/Magic Jump)
也可以这样做:Ctrl+F在当前位置查找命令: salc00AB5E56^\0F85 49FEFFFF JNZ 00AB5CA5
00AB5E5C EB 03 JMP SHORT 00AB5E61 //F2下断,Shift+F9,断下!取消断点!
00AB5E5E D6 SALC
00AB5E5F D6 SALC
00AB5E60 8F ??? ; 未知命令重要:断下后,记得要撤消Magic Jump处的修改!
为何要这样做?程序在下面会依据原先的代码进行解码,
以前下 硬件断点 操作没有修改原代码,所以解码正确。
而直接修改Magic Jump后改变了原先的代码,导致解码不正确而异常出错!
现在我们在解码以前恢复原先的代码,因此就不会再出错了!
此时,打开内存镜像,在01001000段下断,Shift+F9直达OEP!00ACF68F 8B12 MOV EDX,DWORD PTR DS:
00ACF691 8955 DC MOV DWORD PTR SS:,EDX
00ACF694 834D FC FF OR DWORD PTR SS:,FFFFFF>
00ACF698 EB 11 JMP SHORT 00ACF6AB
00ACF69A 6A 01 PUSH 1
00ACF69C 58 POP EAX
00ACF69D C3 RETN
00ACF69E 8B65 E8 MOV ESP,DWORD PTR SS:
00ACF6A1 834D FC FF OR DWORD PTR SS:,FFFFFF>
00ACF6A5 8B7D 08 MOV EDI,DWORD PTR SS:
00ACF6A8 8B55 DC MOV EDX,DWORD PTR SS:
00ACF6AB A1 E400AE00 MOV EAX,DWORD PTR DS:
00ACF6B0 3190 88000000 XOR DWORD PTR DS:,EDX
00ACF6B6 A1 E400AE00 MOV EAX,DWORD PTR DS:
00ACF6BB 3190 88000000 XOR DWORD PTR DS:,EDX
00ACF6C1 A1 E400AE00 MOV EAX,DWORD PTR DS:
00ACF6C6 8B88 90000000 MOV ECX,DWORD PTR DS:
00ACF6CC 3348 2C XOR ECX,DWORD PTR DS:
00ACF6CF 3348 18 XOR ECX,DWORD PTR DS:
00ACF6D2 030D FC00AE00 ADD ECX,DWORD PTR DS:; sol.01000000
00ACF6D8 8B17 MOV EDX,DWORD PTR DS:
00ACF6DA 85D2 TEST EDX,EDX
00ACF6DC 75 1B JNZ SHORT 00ACF6F9
00ACF6DE FF77 18 PUSH DWORD PTR DS:
00ACF6E1 FF77 14 PUSH DWORD PTR DS:
00ACF6E4 FF77 10 PUSH DWORD PTR DS:
00ACF6E7 8B90 90000000 MOV EDX,DWORD PTR DS:
00ACF6ED 3350 40 XOR EDX,DWORD PTR DS:
00ACF6F0 3350 04 XOR EDX,DWORD PTR DS:
00ACF6F3 2BCA SUB ECX,EDX
00ACF6F5 FFD1 CALL ECX
00ACF6F7 EB 20 JMP SHORT 00ACF719
00ACF6F9 83FA 01 CMP EDX,1
00ACF6FC 75 1E JNZ SHORT 00ACF71C
00ACF6FE FF77 04 PUSH DWORD PTR DS:
00ACF701 FF77 08 PUSH DWORD PTR DS:
00ACF704 6A 00 PUSH 0
00ACF706 FF77 0C PUSH DWORD PTR DS:
00ACF709 8B90 90000000 MOV EDX,DWORD PTR DS:
00ACF70F 3350 40 XOR EDX,DWORD PTR DS:
00ACF712 3350 04 XOR EDX,DWORD PTR DS:
00ACF715 2BCA SUB ECX,EDX
00ACF717 FFD1 CALL ECX //F7进去!直接到达OEP!01005F85 6A 70 PUSH 70
01005F87 68 F8120001 PUSH sol.010012F8
01005F8C E8 DF010000 CALL sol.01006170
01005F91 33DB XOR EBX,EBXLordPE纠正大小Dump!打开Import 1.6,OEP填5f8f,全部剪掉修复,正常运行!
------------------------------------------------------------------------
【破解总结】一、双变单(使程序把自己当成子进程运行)bp OpenMutexA下断
二、避开Anti
he OutputDebugStringA
中断2次!
选中%s%之类的字符,点右键->二进制->使用00填充
三、Magic Jump,避开IAT加密
程序在下面会依据原先的代码进行解码,
以前下 硬件断点 操作没有修改原代码,所以解码正确。
而直接修改Magic Jump后改变了原先的代码,导致解码不正确而异常出错!
现在我们在解码以前恢复原先的代码,因此就不会再出错了!
------------------------------------------------------------------------
【版权声明】【版权声明】转载请注明作者并保持文章的完整, 不错 很详细 顶!~~
不过第2步 也就是这个不做也可以!
======================================================
二、避开Anti
he OutputDebugStringA
中断2次!
选中%s%之类的字符,点右键->二进制->使用00填充
删除此断点! 为什么不做也可以? 还不错,。。。。学习 原帖由 horizon_c 于 2008-5-2 15:41 发表 https://www.chinapyg.com/images/common/back.gif
为什么不做也可以?
这是壳利用了OD的字符串漏洞,,,现在很多OD都己经修复 了此漏洞,所以可以不用做
页:
[1]