horizon_c 发表于 2008-5-2 15:21:21

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后改变了原先的代码,导致解码不正确而异常出错!
现在我们在解码以前恢复原先的代码,因此就不会再出错了!

------------------------------------------------------------------------
【版权声明】【版权声明】转载请注明作者并保持文章的完整,

flyskey 发表于 2008-5-2 15:26:00

不错 很详细 顶!~~
不过第2步 也就是这个不做也可以!
======================================================
二、避开Anti

he OutputDebugStringA
中断2次!
选中%s%之类的字符,点右键->二进制->使用00填充

删除此断点!

horizon_c 发表于 2008-5-2 15:41:11

为什么不做也可以?

tommy 发表于 2008-5-3 16:53:24

还不错,。。。。学习

playboyjin 发表于 2008-5-16 15:15:15

原帖由 horizon_c 于 2008-5-2 15:41 发表 https://www.chinapyg.com/images/common/back.gif
为什么不做也可以?


这是壳利用了OD的字符串漏洞,,,现在很多OD都己经修复 了此漏洞,所以可以不用做
页: [1]
查看完整版本: Armadillo 系列练习第二题