飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3424|回复: 4

Armadillo 系列练习第二题

[复制链接]

该用户从未签到

发表于 2008-5-2 15:21:21 | 显示全部楼层 |阅读模式
【破文标题】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
  1. 01058000 >  60              PUSHAD
  2. 01058001    E8 00000000     CALL sol.01058006
  3. 01058006    5D              POP EBP
  4. 01058007    50              PUSH EAX
  5. 01058008    51              PUSH ECX
复制代码
一、双变单(使程序把自己当成子进程运行)
bp OpenMutexA下断,shift+f9运行
************************************************************
堆栈:
  1. 0007F770   0102FDB8  /CALL 到 OpenMutexA 来自 sol.0102FDB2
  2. 0007F774   001F0001  |Access = 1F0001
  3. 0007F778   00000000  |Inheritable = FALSE
  4. 0007F77C   0007FDB0  \MutexName = "8A4::DACED4DFB3"                //记下堆栈数据7FDB0
复制代码
************************************************************

Ctrl+G:01001000
  1. 00401000      60               pushad
  2. 00401001      9C               pushfd
  3. 00401002      68 A0FD1200      push 7FDB0                        //对应上面对应的堆栈数据
  4. 00401007      33C0             xor eax,eax
  5. 00401009      50               push eax
  6. 0040100A      50               push eax
  7. 0040100B      E8 E694A677      call KERNEL32.CreateMutexA
  8. 00401010      9D               popfd
  9. 00401011      61               popad
  10. 00401012    - E9 8F9FA777      jmp KERNEL32.OpenMutexA
复制代码
右键--此外新建EIP--选是,删除断点

二、避开Anti

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

删除此断点!

三、Magic Jump,避开IAT加密
he GetModuleHandleA+5
************************************************************
  1. 1.
  2. 000794FC  /0007EC44
  3. 00079500  |00AC6DF3  返回到 00AC6DF3 来自 kernel32.GetModuleHandleA
  4. 00079504  |00ADBC1C  ASCII "kernel32.dll"
  5. 00079508  |00ADCEC4  ASCII "VirtualAlloc"

  6. 2.
  7. 000794FC  /0007EC44
  8. 00079500  |00AC6E10  返回到 00AC6E10 来自 kernel32.GetModuleHandleA
  9. 00079504  |00ADBC1C  ASCII "kernel32.dll"
  10. 00079508  |00ADCEB8  ASCII "VirtualFree"

  11. 3.
  12. 00079260  /00079500
  13. 00079264  |00AB5CE1  返回到 00AB5CE1 来自 kernel32.GetModuleHandleA
  14. 00079268  |000793B4  ASCII "kernel32.dll"
复制代码
************************************************************
取消断点返回
  1. 00AB5CE1    8B0D AC40AE00   MOV ECX,DWORD PTR DS:[AE40AC]
  2. 00AB5CE7    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
  3. 00AB5CEA    A1 AC40AE00     MOV EAX,DWORD PTR DS:[AE40AC]
  4. 00AB5CEF    391C06          CMP DWORD PTR DS:[ESI+EAX],EBX
  5. 00AB5CF2    75 16           JNZ SHORT 00AB5D0A
  6. 00AB5CF4    8D85 B4FEFFFF   LEA EAX,DWORD PTR SS:[EBP-14C]
  7. 00AB5CFA    50              PUSH EAX
  8. 00AB5CFB    FF15 BC62AD00   CALL DWORD PTR DS:[AD62BC]     ; kernel32.LoadLibraryA
  9. 00AB5D01    8B0D AC40AE00   MOV ECX,DWORD PTR DS:[AE40AC]
  10. 00AB5D07    89040E          MOV DWORD PTR DS:[ESI+ECX],EAX
  11. 00AB5D0A    A1 AC40AE00     MOV EAX,DWORD PTR DS:[AE40AC]
  12. 00AB5D0F    391C06          CMP DWORD PTR DS:[ESI+EAX],EBX
  13. 00AB5D12    0F84 2F010000   JE 00AB5E47                                //magic jump
  14. 00AB5D18    33C9            XOR ECX,ECX
  15. 00AB5D1A    8B07            MOV EAX,DWORD PTR DS:[EDI]
  16. 00AB5D1C    3918            CMP DWORD PTR DS:[EAX],EBX
  17. 00AB5D1E    74 06           JE SHORT 00AB5D26
复制代码
往下拉,找如此类似的序列(一个jnz,一个jmp,两个salc/Magic Jump)
也可以这样做:Ctrl+F在当前位置查找命令: salc
  1. 00AB5E56  ^\0F85 49FEFFFF   JNZ 00AB5CA5
  2. 00AB5E5C    EB 03           JMP SHORT 00AB5E61                        //F2下断,Shift+F9,断下!取消断点!
  3. 00AB5E5E    D6              SALC
  4. 00AB5E5F    D6              SALC
  5. 00AB5E60    8F              ???                            ; 未知命令
复制代码
重要:断下后,记得要撤消Magic Jump处的修改!

为何要这样做?程序在下面会依据原先的代码进行解码,
以前下 硬件断点 操作没有修改原代码,所以解码正确。
而直接修改Magic Jump后改变了原先的代码,导致解码不正确而异常出错!
现在我们在解码以前恢复原先的代码,因此就不会再出错了!

此时,打开内存镜像,在01001000段下断,Shift+F9直达OEP!
  1. 00ACF68F    8B12            MOV EDX,DWORD PTR DS:[EDX]
  2. 00ACF691    8955 DC         MOV DWORD PTR SS:[EBP-24],EDX
  3. 00ACF694    834D FC FF      OR DWORD PTR SS:[EBP-4],FFFFFF>
  4. 00ACF698    EB 11           JMP SHORT 00ACF6AB
  5. 00ACF69A    6A 01           PUSH 1
  6. 00ACF69C    58              POP EAX
  7. 00ACF69D    C3              RETN
  8. 00ACF69E    8B65 E8         MOV ESP,DWORD PTR SS:[EBP-18]
  9. 00ACF6A1    834D FC FF      OR DWORD PTR SS:[EBP-4],FFFFFF>
  10. 00ACF6A5    8B7D 08         MOV EDI,DWORD PTR SS:[EBP+8]
  11. 00ACF6A8    8B55 DC         MOV EDX,DWORD PTR SS:[EBP-24]
  12. 00ACF6AB    A1 E400AE00     MOV EAX,DWORD PTR DS:[AE00E4]
  13. 00ACF6B0    3190 88000000   XOR DWORD PTR DS:[EAX+88],EDX
  14. 00ACF6B6    A1 E400AE00     MOV EAX,DWORD PTR DS:[AE00E4]
  15. 00ACF6BB    3190 88000000   XOR DWORD PTR DS:[EAX+88],EDX
  16. 00ACF6C1    A1 E400AE00     MOV EAX,DWORD PTR DS:[AE00E4]
  17. 00ACF6C6    8B88 90000000   MOV ECX,DWORD PTR DS:[EAX+90]
  18. 00ACF6CC    3348 2C         XOR ECX,DWORD PTR DS:[EAX+2C]
  19. 00ACF6CF    3348 18         XOR ECX,DWORD PTR DS:[EAX+18]
  20. 00ACF6D2    030D FC00AE00   ADD ECX,DWORD PTR DS:[AE00FC]  ; sol.01000000
  21. 00ACF6D8    8B17            MOV EDX,DWORD PTR DS:[EDI]
  22. 00ACF6DA    85D2            TEST EDX,EDX
  23. 00ACF6DC    75 1B           JNZ SHORT 00ACF6F9
  24. 00ACF6DE    FF77 18         PUSH DWORD PTR DS:[EDI+18]
  25. 00ACF6E1    FF77 14         PUSH DWORD PTR DS:[EDI+14]
  26. 00ACF6E4    FF77 10         PUSH DWORD PTR DS:[EDI+10]
  27. 00ACF6E7    8B90 90000000   MOV EDX,DWORD PTR DS:[EAX+90]
  28. 00ACF6ED    3350 40         XOR EDX,DWORD PTR DS:[EAX+40]
  29. 00ACF6F0    3350 04         XOR EDX,DWORD PTR DS:[EAX+4]
  30. 00ACF6F3    2BCA            SUB ECX,EDX
  31. 00ACF6F5    FFD1            CALL ECX
  32. 00ACF6F7    EB 20           JMP SHORT 00ACF719
  33. 00ACF6F9    83FA 01         CMP EDX,1
  34. 00ACF6FC    75 1E           JNZ SHORT 00ACF71C
  35. 00ACF6FE    FF77 04         PUSH DWORD PTR DS:[EDI+4]
  36. 00ACF701    FF77 08         PUSH DWORD PTR DS:[EDI+8]
  37. 00ACF704    6A 00           PUSH 0
  38. 00ACF706    FF77 0C         PUSH DWORD PTR DS:[EDI+C]
  39. 00ACF709    8B90 90000000   MOV EDX,DWORD PTR DS:[EAX+90]
  40. 00ACF70F    3350 40         XOR EDX,DWORD PTR DS:[EAX+40]
  41. 00ACF712    3350 04         XOR EDX,DWORD PTR DS:[EAX+4]
  42. 00ACF715    2BCA            SUB ECX,EDX
  43. 00ACF717    FFD1            CALL ECX                                        //F7进去!直接到达OEP!
复制代码
  1. 01005F85    6A 70           PUSH 70
  2. 01005F87    68 F8120001     PUSH sol.010012F8
  3. 01005F8C    E8 DF010000     CALL sol.01006170
  4. 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后改变了原先的代码,导致解码不正确而异常出错!
现在我们在解码以前恢复原先的代码,因此就不会再出错了!

------------------------------------------------------------------------
【版权声明】【版权声明】转载请注明作者并保持文章的完整,
PYG19周年生日快乐!

该用户从未签到

发表于 2008-5-2 15:26:00 | 显示全部楼层
不错 很详细 顶!~~
不过第2步 也就是这个不做也可以!
======================================================
二、避开Anti

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

删除此断点!
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2008-5-2 15:41:11 | 显示全部楼层
为什么不做也可以?
PYG19周年生日快乐!

该用户从未签到

发表于 2008-5-3 16:53:24 | 显示全部楼层
还不错,。。。。学习
PYG19周年生日快乐!
  • TA的每日心情
    无聊
    2017-8-31 14:43
  • 签到天数: 7 天

    [LV.3]偶尔看看II

    发表于 2008-5-16 15:15:15 | 显示全部楼层
    原帖由 horizon_c 于 2008-5-2 15:41 发表
    为什么不做也可以?



    这是壳利用了OD的字符串漏洞,,,现在很多OD都己经修复 了此漏洞,所以可以不用做
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表