手脱Armadillo.v5.02 CopyMemII+Debugerblocker
 

标题:手脱Armadillo.v5.02 CopyMemII+Debugerblocker
链接:http://www.unpack.cn/viewthread.php?tid=17713
贴者:cxh852456
日期:2007-9-21 22:40

  1.拿论坛破解的5.02版本加的壳,
  
  
  
  查壳PEID:Armadillo V5.00 -> Silicon Realms Toolworks   * Sign.By.fly *
  
  2。脱壳,
  载入后停在EP处,是模仿VC8的入口复制内容到剪贴板代码:
  004424F2 > $  E8 E3400000   CALL Project1.004465DA
  004424F7   .^ E9 16FEFFFF   JMP Project1.00442312
  004424FC   $  6A 0C         PUSH 0C
  004424FE   .  68 B0004700   PUSH Project1.004700B0
  00442503   .  E8 44150000   CALL Project1.00443A4C
  00442508   .  8B4D 08       MOV ECX,DWORD PTR SS:[EBP+8]
  0044250B   .  33FF          XOR EDI,EDI对CopyMemII不太了解的可以补习补习,高手跳过
  
  下断BP WaitForDebugEvent+5,运行,中断,看堆栈复制内容到剪贴板代码:
  0012DDA4  /0012F724
  0012DDA8  |00431A08  返回到 Project1.00431A08 来自 kernel32.WaitForDebugEvent
  0012DDAC  |0012ECDC  ---------------注意这里,在转存中跟随
  0012DDB0  |000003E8
  0012DDB4  |483502B8清除断点,重新下断BP WriteProcessMemory 运行,中断,看堆栈复制内容到剪贴板代码:
  0012DD18   00434C40  /CALL 到 WriteProcessMemory 来自 Project1.00434C3A
  0012DD1C   0000004C  |hProcess = 0000004C (窗口)
  0012DD20   00403000  |Address = 403000------------------------OEP所在段
  0012DD24   009D5C78  |Buffer = 009D5C78----------------------写入地址
  0012DD28   00001000  |BytesToWrite = 1000 (4096.)------------写入大小
  0012DD2C   0012DD64  \pBytesWritten = 0012DD64在看数据窗口复制内容到剪贴板代码:
  0012ECDC  00000001
  0012ECE0  00000B90
  0012ECE4  00000B9C
  0012ECE8  80000001
  0012ECEC  00000000
  0012ECF0  00000000
  0012ECF4  00403414  Project1.00403414-----------------------OEP
  0012ECF8  00000002
  0012ECFC  00000008
  0012ED00  00403414  Project1.00403414-----------------------OEP
  0012ED04  00403414  Project1.00403414-----------------------OEP
  0012ED08  AA1AFD64
  0012ED0C  00000000
  
  我门现在来找写入的地方,我们需要做个简单的计算
    00403414-403000=414
    414+009D5C78=9D608C
    
  我门到这里去看看,Ctrl+G:9D608C复制内容到剪贴板代码:
  009D608C  55 8B EC 83 C4 F0 B8 E4 33 40 00 E8 A4 FE FF FF  U嬱兡鸶?@.瑜?
  009D609C  6A 40 68 3C 34 40 00 68 48 34 40 00 6A 00 E8 45  j@h<4@.hH4@.j.鐴
  009D60AC  FF FF FF E8 C0 F9 FF FF C0 B6 CC EC B0 D7 D4 C6  枥?
  009D60BC  00 00 00 00 41 72 6D 61 64 69 6C 6C 6F 2E 76 35  ....Armadillo.v5
  009D60CC  2E 30 32 2E 50 75 62 6C 69 63 20 43 4F 50 59 4D  .02.Public COPYM
  009D60DC  45 4D 2D 49 49 2B 44 45 42 55 47 42 4C 4F 43 4B  EM-II+DEBUGBLOCK
  我门将头两个字节55 8b改为EB FE,其实55 8B就是OEP的头两个字节
  改完后我门一步一步走,回到壳代码,ALT+F9
  CTRL+F9,F8,来到这里复制内容到剪贴板代码:
  0043201A   .  8B15 F8134700 MOV EDX,DWORD PTR DS:[4713F8]
  00432020   .  8D04B2        LEA EAX,DWORD PTR DS:[EDX+ESI*4]
  00432023   .  50            PUSH EAX
  00432024   .  8B8D A0F5FFFF MOV ECX,DWORD PTR SS:[EBP-A60]
  0043202A   .  51            PUSH ECX
  0043202B   .  E8 A01A0000   CALL Project1.00433AD0---------------------关键CALL,ENTER进入
  00432030   .  83C4 0C       ADD ESP,0C--------------------------------返回到这里
  跟随后CTRL+R找相关调用,发现有两个地方调用拉这里,我门双击第二个CALL,将他NOP掉,做完这些再来下断
  BP WaitForDebugEvent+5,运行中断,反汇编中跟随复制内容到剪贴板代码:
  004319F0    DB7A F0         FSTP TBYTE PTR DS:[EDX-10]
  004319F3    A0 336168E8     MOV AL,BYTE PTR DS:[E8686133]
  004319F8    0300            ADD EAX,DWORD PTR DS:[EAX]
  004319FA    008B 95B0F5FF   ADD BYTE PTR DS:[EBX+FFF5B095],CL
  00431A00    FF52 FF         CALL DWORD PTR DS:[EDX-1]
  00431A03    15 DCA04600     ADC EAX,<&KERNEL32.WaitForDebugEvent>
  00431A08    85C0            TEST EAX,EAX--------------------------------这里新建EIP
  00431A0A    0F84 31200000   JE Project1.00433A41-----------------------开始PATCH,该为JMP 00401000
  00431A10    0FB645 D3       MOVZX EAX,BYTE PTR SS:[EBP-2D]
  00431A14    85C0            TEST EAX,EAX将WaitForDebugEvent NOP掉并在00431a08处新建EIP,00431A0A开始PATCH
  在00401000写入以下代码复制内容到剪贴板代码:
  00401000      8105 F4EC1200>ADD DWORD PTR DS:[12ECF4],1000
  0040100A      8105 00ED1200>ADD DWORD PTR DS:[12ED00],1000
  00401014      8105 04ED1200>ADD DWORD PTR DS:[12ED04],1000
  0040101E      813D 04ED1200>CMP DWORD PTR DS:[12ED04],Project1.00404000
  00401028    - 0F85 E1090300 JNZ Project1.00431A0F
  0040102E      68 A40F0000   PUSH 0FA4
  00401033      E8 5993457C   CALL kernel32.DebugActiveProcessStop
  然后回到12ed6c处复制内容到剪贴板代码:
    
  0012ECDC  00000001
  0012ECE0  00000B90
  0012ECE4  00000B9C
  0012ECE8  80000001
  0012ECEC  00000000
  0012ECF0  00000000
  0012ECF4  00403414  Project1.00403414-----------------------改为00400000
  0012ECF8  00000002
  0012ECFC  00000008
  0012ED00  00403414  Project1.00403414-----------------------改为00400000
  0012ED04  00403414  Project1.00403414-----------------------改为00400000
  0012ED08  AA1AFD64
  0012ED0C  00000000做完以上后,SHIFT+F9,中断,EAX=1说明一切正确,到这里已经完成了一半了,回到OD,挂接那个名字不是红色的那个进程
  F9,F12,将头两个字节该为55 8B复制内容到剪贴板代码:
  
  00403414    55              PUSH EBP----------------------oep
  00403415    8BEC            MOV EBP,ESP
  00403417    83C4 F0         ADD ESP,-10
  0040341A    B8 E4334000     MOV EAX,Project1.004033E4
  0040341F    E8 A4FEFFFF     CALL Project1.004032C8
  00403424    6A 40           PUSH 40
  00403426    68 3C344000     PUSH Project1.0040343C3。修复
  上面得到完整的代码,但IAT还是加密的,需要修复,再开个OD ,用ARM PROCESS DETACH载入
  DONE!
  Child process ID: 00000334
  Entry point: 004424F2
  Original bytes: E8E3
  直接挂接334,F9,F12,修改头两个字节为E8E3,停在复制内容到剪贴板代码:
  004424F2 >  E8 E3400000     call    004465DA
  004424F7  ^ E9 16FEFFFF     jmp     00442312
  004424FC    6A 0C           push    0C
  004424FE    68 B0004700     push    004700B0
  00442503    E8 44150000     call    00443A4C
  00442508    8B4D 08         mov     ecx, dword ptr [ebp+8]
  0044250B    33FF            xor     edi, edi
  0044250D    3BCF            cmp     ecx, edi
  现在可以想拖标准壳一样脱了,但这个只是为了找回正确的IAT,避开加密
  下断点 BP VirtualProtect+5 中断后清除断点
  下断点 BP CreateFileMappingA+5 中断后清除断点
  下断点 BP GetModuleHandleA+5 ,观察堆栈复制内容到剪贴板代码:
  00129474  /0012EB88
  00129478  |00CD5205  返回到 00CD5205 来自 kernel32.GetModuleHandleA
  0012947C  |00D00B98  ASCII "kernel32.dll"
  00129480  |00D01A64  ASCII "VirtualAlloc"
  00129484  |D8C0806A
  00129488  |7AA4EC1B
  复制内容到剪贴板代码:
  00129474  /0012EB88
  00129478  |00CD5223  返回到 00CD5223 来自 kernel32.GetModuleHandleA
  0012947C  |00D00B98  ASCII "kernel32.dll"
  00129480  |00D01A58  ASCII "VirtualFree"
  00129484  |D8C0806A
  00129488  |7AA4EC1B
  0012948C  |00000000
  复制内容到剪贴板代码:
  001291C0  /00129478
  001291C4  |00CB7E44  返回到 00CB7E44 来自 kernel32.GetModuleHandleA
  001291C8  |00129340  ASCII "kernel32.dll"---------------------------------该返回了
  001291CC  |00000000
  001291D0  |0046A378  Project1.0046A378
  001291D4  |00000001
  复制内容到剪贴板代码:
  00CB7E44    8B55 F4         mov     edx, dword ptr [ebp-C]
  00CB7E47    8B0D 4CDFD000   mov     ecx, dword ptr [D0DF4C]
  00CB7E4D    890491          mov     dword ptr [ecx+edx*4], eax
  00CB7E50    8B55 F4         mov     edx, dword ptr [ebp-C]
  00CB7E53    A1 4CDFD000     mov     eax, dword ptr [D0DF4C]
  00CB7E58    833C90 00       cmp     dword ptr [eax+edx*4], 0
  00CB7E5C    75 5C           jnz     short 00CB7EBA
  00CB7E5E    8B4D F8         mov     ecx, dword ptr [ebp-8]
  00CB7E61    8B51 08         mov     edx, dword ptr [ecx+8]
  00CB7E64    83E2 02         and     edx, 2
  00CB7E67    74 38           je      short 00CB7EA1
  00CB7E69    B8 17000000     mov     eax, 17
  00CB7E6E    C1E0 02         shl     eax, 2
  00CB7E71    8B0D 04BBD000   mov     ecx, dword ptr [D0BB04]          ; Project1.0046A378
  00CB7E77    8B15 04BBD000   mov     edx, dword ptr [D0BB04]          ; Project1.0046A378
  00CB7E7D    8B35 04BBD000   mov     esi, dword ptr [D0BB04]          ; Project1.0046A378
  00CB7E83    8B5E 08         mov     ebx, dword ptr [esi+8]
  00CB7E86    335A 64         xor     ebx, dword ptr [edx+64]
  00CB7E89    331C01          xor     ebx, dword ptr [ecx+eax]
  00CB7E8C    83E3 10         and     ebx, 10
  00CB7E8F    F7DB            neg     ebx
  00CB7E91    1BDB            sbb     ebx, ebx
  00CB7E93    F7DB            neg     ebx
  00CB7E95    0FB6C3          movzx   eax, bl
  00CB7E98    85C0            test    eax, eax
  00CB7E9A    75 05           jnz     short 00CB7EA1
  00CB7E9C  ^ E9 1BFFFFFF     jmp     00CB7DBC
  00CB7EA1    8D8D C8FEFFFF   lea     ecx, dword ptr [ebp-138]
  00CB7EA7    51              push    ecx
  00CB7EA8    FF15 D4E1CF00   call    dword ptr [CFE1D4]               ; kernel32.LoadLibraryA
  00CB7EAE    8B55 F4         mov     edx, dword ptr [ebp-C]
  00CB7EB1    8B0D 4CDFD000   mov     ecx, dword ptr [D0DF4C]
  00CB7EB7    890491          mov     dword ptr [ecx+edx*4], eax
  00CB7EBA    8B55 F4         mov     edx, dword ptr [ebp-C]
  00CB7EBD    A1 4CDFD000     mov     eax, dword ptr [D0DF4C]
  00CB7EC2    833C90 00       cmp     dword ptr [eax+edx*4], 0
  00CB7EC6    75 05           jnz     short 00CB7ECD--------------------------MAGIC JMP, NOP掉
  00CB7EC8  ^ E9 EFFEFFFF     jmp     00CB7DBC
  00CB7ECD    C785 BCFEFFFF 0>mov     dword ptr [ebp-144], 0
  00CB7ED7    C785 C0FEFFFF 0>mov     dword ptr [ebp-140], 0
  00CB7EE1    8B4D F8         mov     ecx, dword ptr [ebp-8]
  00CB7EE4    8B51 04         mov     edx, dword ptr [ecx+4]搜索二进制EB 03 D6 D6,找到下面复制内容到剪贴板代码:
  
  00CB8149   /EB 03           jmp     short 00CB814E
  00CB814B   |D6              salc
  00CB814C   |D6              salc
  00CB814D   |8F              ???                                      ; 未知命令
  在00CB8149处下个断点,运行,中断,撤消所有修改
  下断点BP CreateThread
  断下后返回,一路F8
  看到CALL ECX后进入就是OEP了,到达OEP后复制内容到剪贴板代码:
  00403414    9F              lahf
  00403415    1965 72         sbb     dword ptr [ebp+72], esp
  00403418    0E              push    cs
  00403419    6231            bound   esi, qword ptr [ecx]
  0040341B    15 F9D28919     adc     eax, 1989D2F9
  00403420    6E              outs    dx, byte ptr es:[edi]
  00403421    6C              ins     byte ptr es:[edi], dx
  00403422    76 0E           jbe     short 00403432
  00403424    A0 D2E1CDFE     mov     al, byte ptr [FECDE1D2]
  00403429    D289 9982A6C9   ror     byte ptr [ecx+C9A68299], cl
  0040342F    F1              int1
  OEP已经面目全非了,但不要紧,我门只需要真确的IAT
  回到先前的OD,来到IAT的其实位置,将前3个IAT的二进制复制下来
  在到第二个OD,大开内存,搜索刚才的二进制代码,找到复制内容到剪贴板代码:
  00406078  7C93188A  ntdll.RtlDeleteCriticalSection
  0040607C  7C9210ED  ntdll.RtlLeaveCriticalSection
  00406080  7C921005  ntdll.RtlEnterCriticalSection
  00406084  7C809FA1  kernel32.InitializeCriticalSection
  00406088  7C809B14  kernel32.VirtualFree
  0040608C  7C809A81  kernel32.VirtualAlloc
  00406090  7C80995D  kernel32.LocalFree
  00406094  7C8099BD  kernel32.LocalAlloc
  00406098  7C8114AB  kernel32.GetVersion
  0040609C  7C809737  kernel32.GetCurrentThreadId
  004060A0  7C80A405  kernel32.GetThreadLocale
  004060A4  7C801EEE  kernel32.GetStartupInfoA
  004060A8  7C80D47E  kernel32.GetLocaleInfoA
  004060AC  7C812C8D  kernel32.GetCommandLineA
  004060B0  7C80AA66  kernel32.FreeLibrary
  004060B4  7C81CAA2  kernel32.ExitProcess
  004060B8  7C810F9F  kernel32.WriteFile
  004060BC  7C862B8A  kernel32.UnhandledExceptionFilter
  004060C0  7C957A40  ntdll.RtlUnwind
  004060C4  7C81EAE1  kernel32.RaiseException
  004060C8  7C812CA9  kernel32.GetStdHandle
  004060CC  00CBA270
  004060D0  77D311B3  USER32.GetKeyboardType
  004060D4  77D504EA  USER32.MessageBoxA
  004060D8  00CBA270
  004060DC  77DA7883  ADVAPI32.RegQueryValueExA
  004060E0  77DA761B  ADVAPI32.RegOpenKeyExA
  004060E4  77DA6BF0  ADVAPI32.RegCloseKey
  004060E8  00CBA260
  004060EC  7C809BF5  kernel32.TlsSetValue
  004060F0  7C809750  kernel32.TlsGetValue
  004060F4  7C8099BD  kernel32.LocalAlloc
  004060F8  7C80B529  kernel32.GetModuleHandleA
  004060FC  00CBA250
  00406100  77D504EA  USER32.MessageBoxA得到了正确的IAT
  将全部正确的IAT二进制代码复制到先前的OD中,
  此时就可以关掉第2个OD了。
   
  好拉,现在可以DUMP了,LORDPE完全转存,IMPORT修复,运行,OK,附练习文件

  
--------------------------------------------------------------------------------
附件地址:http://www.unpack.cn/attachment.php?aid=11771
上一篇   下一篇