- UID
- 31120
注册时间2007-5-1
阅读权限10
最后登录1970-1-1
周游历练
该用户从未签到
|
【破文标题】Armadillo 系列练习第二题
【破文作者】horizon
【作者邮箱】
【作者主页】http://hi.baidu.com/horizon
【破解工具】OD PEID LORDPE ImportREC
【破解平台】YLMF WINXP SP3
【软件名称】sol.exe
【软件大小】576k
【原版下载】https://www.chinapyg.com/viewthr ... &extra=page%3D1
【保护方式】标准双进程屏蔽调试器
【软件简介】系统自带纸牌游戏
【破解声明】学习交流
------------------------------------------------------------------------
【破解过程】OD载入,hideod- 01058000 > 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:01001000- 00401000 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 |00ADBC1C ASCII "kernel32.dll"
- 00079508 |00ADCEC4 ASCII "VirtualAlloc"
- 2.
- 000794FC /0007EC44
- 00079500 |00AC6E10 返回到 00AC6E10 来自 kernel32.GetModuleHandleA
- 00079504 |00ADBC1C ASCII "kernel32.dll"
- 00079508 |00ADCEB8 ASCII "VirtualFree"
- 3.
- 00079260 /00079500
- 00079264 |00AB5CE1 返回到 00AB5CE1 来自 kernel32.GetModuleHandleA
- 00079268 |000793B4 ASCII "kernel32.dll"
复制代码 ************************************************************
取消断点返回- 00AB5CE1 8B0D AC40AE00 MOV ECX,DWORD PTR DS:[AE40AC]
- 00AB5CE7 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
- 00AB5CEA A1 AC40AE00 MOV EAX,DWORD PTR DS:[AE40AC]
- 00AB5CEF 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
- 00AB5CF2 75 16 JNZ SHORT 00AB5D0A
- 00AB5CF4 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
- 00AB5CFA 50 PUSH EAX
- 00AB5CFB FF15 BC62AD00 CALL DWORD PTR DS:[AD62BC] ; kernel32.LoadLibraryA
- 00AB5D01 8B0D AC40AE00 MOV ECX,DWORD PTR DS:[AE40AC]
- 00AB5D07 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
- 00AB5D0A A1 AC40AE00 MOV EAX,DWORD PTR DS:[AE40AC]
- 00AB5D0F 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
- 00AB5D12 0F84 2F010000 JE 00AB5E47 //magic jump
- 00AB5D18 33C9 XOR ECX,ECX
- 00AB5D1A 8B07 MOV EAX,DWORD PTR DS:[EDI]
- 00AB5D1C 3918 CMP DWORD PTR DS:[EAX],EBX
- 00AB5D1E 74 06 JE SHORT 00AB5D26
复制代码 往下拉,找如此类似的序列(一个jnz,一个jmp,两个salc/Magic Jump)
也可以这样做:Ctrl+F在当前位置查找命令: salc- 00AB5E56 ^\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:[EDX]
- 00ACF691 8955 DC MOV DWORD PTR SS:[EBP-24],EDX
- 00ACF694 834D FC FF OR DWORD PTR SS:[EBP-4],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:[EBP-18]
- 00ACF6A1 834D FC FF OR DWORD PTR SS:[EBP-4],FFFFFF>
- 00ACF6A5 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8]
- 00ACF6A8 8B55 DC MOV EDX,DWORD PTR SS:[EBP-24]
- 00ACF6AB A1 E400AE00 MOV EAX,DWORD PTR DS:[AE00E4]
- 00ACF6B0 3190 88000000 XOR DWORD PTR DS:[EAX+88],EDX
- 00ACF6B6 A1 E400AE00 MOV EAX,DWORD PTR DS:[AE00E4]
- 00ACF6BB 3190 88000000 XOR DWORD PTR DS:[EAX+88],EDX
- 00ACF6C1 A1 E400AE00 MOV EAX,DWORD PTR DS:[AE00E4]
- 00ACF6C6 8B88 90000000 MOV ECX,DWORD PTR DS:[EAX+90]
- 00ACF6CC 3348 2C XOR ECX,DWORD PTR DS:[EAX+2C]
- 00ACF6CF 3348 18 XOR ECX,DWORD PTR DS:[EAX+18]
- 00ACF6D2 030D FC00AE00 ADD ECX,DWORD PTR DS:[AE00FC] ; sol.01000000
- 00ACF6D8 8B17 MOV EDX,DWORD PTR DS:[EDI]
- 00ACF6DA 85D2 TEST EDX,EDX
- 00ACF6DC 75 1B JNZ SHORT 00ACF6F9
- 00ACF6DE FF77 18 PUSH DWORD PTR DS:[EDI+18]
- 00ACF6E1 FF77 14 PUSH DWORD PTR DS:[EDI+14]
- 00ACF6E4 FF77 10 PUSH DWORD PTR DS:[EDI+10]
- 00ACF6E7 8B90 90000000 MOV EDX,DWORD PTR DS:[EAX+90]
- 00ACF6ED 3350 40 XOR EDX,DWORD PTR DS:[EAX+40]
- 00ACF6F0 3350 04 XOR EDX,DWORD PTR DS:[EAX+4]
- 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:[EDI+4]
- 00ACF701 FF77 08 PUSH DWORD PTR DS:[EDI+8]
- 00ACF704 6A 00 PUSH 0
- 00ACF706 FF77 0C PUSH DWORD PTR DS:[EDI+C]
- 00ACF709 8B90 90000000 MOV EDX,DWORD PTR DS:[EAX+90]
- 00ACF70F 3350 40 XOR EDX,DWORD PTR DS:[EAX+40]
- 00ACF712 3350 04 XOR EDX,DWORD PTR DS:[EAX+4]
- 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,EBX
复制代码 LordPE纠正大小Dump!打开Import 1.6,OEP填5f8f,全部剪掉修复,正常运行!
------------------------------------------------------------------------
【破解总结】一、双变单(使程序把自己当成子进程运行)bp OpenMutexA下断
二、避开Anti
he OutputDebugStringA
中断2次!
选中%s%之类的字符,点右键->二进制->使用00填充
三、Magic Jump,避开IAT加密
程序在下面会依据原先的代码进行解码,
以前下 硬件断点 操作没有修改原代码,所以解码正确。
而直接修改Magic Jump后改变了原先的代码,导致解码不正确而异常出错!
现在我们在解码以前恢复原先的代码,因此就不会再出错了!
------------------------------------------------------------------------
【版权声明】【版权声明】转载请注明作者并保持文章的完整, |
|