原创:Armadillo 3.78 -> Silicon Realms Toolworks
软件名称:暂隐去,原因大家明白。
下载地址:
加壳方式:Armadillo 3.78 -> Silicon Realms Toolworks
破解工具:OllyDbg v1.10原版,ImportREC 1.6 Final,LordPE
脱壳作者:computer
老规矩忽略所有异常,在添加以下几个:这个在OD调试设置-异常 里面设置。
C0000005(ACCESS VIOLATION)
C000001D(ILLEGAL INSTRUCTION)
C000001E(INVALID LOCK SEQUENCE)
C0000096(PRIVILEGED INSTRUCTION)
用OD载入,先下BP OpenMutexA断点shift+F9运行
7C80EC1B > 8BFF MOV EDI,EDI 断在这里。
7C80EC1D 55 PUSH EBP
7C80EC1E 8BEC MOV EBP,ESP
7C80EC20 51 PUSH ECX
7C80EC21 51 PUSH ECX
7C80EC22 837D 10 00 CMP DWORD PTR SS:[EBP+10],0
7C80EC26 56 PUSH ESI
7C80EC27 0F84 7A500300 JE kernel32.7C843CA7
7C80EC2D 64:A1 18000000 MOV EAX,DWORD PTR FS:[18]
7C80EC33 FF75 10 PUSH DWORD PTR SS:[EBP+10]
7C80EC36 8DB0 F80B0000 LEA ESI,DWORD PTR DS:[EAX+BF8]
7C80EC3C 8D45 F8 LEA EAX,DWORD PTR SS:[EBP-8]
7C80EC3F 50 PUSH EAX
7C80EC40 FF15 8C10807C CALL DWORD PTR DS:[<&ntdll.RtlInitAnsiSt>; ntdll.RtlInitAnsiString
看到堆栈
0012D778 0046ABBD /CALL 到 OpenMutexA
0012D77C 001F0001 |Access = 1F0001
0012D780 00000000 |Inheritable = FALSE
0012D784 0012DDB8 \MutexName = "A84::DAB632EF5A"
0012D788 0012FF04
0012D78C 00000000
0012D790 0047ED5D ykyManua.0047ED5D
Ctrl+G 401000 键入以下代码
00401000 60 pushad
00401001 9C pushfd
00401002 68 B4FB1200 push 0012DDB8 ★ 这里一定要注意,是写堆栈里看到的值
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 B4B2A577 call kernel32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 E9 33F7A577 jmp kernel32.OpenMutexA
在401000处新建起源,右键-》此处新建EIP
F9运行,再次中断在OpenMutexA处,取消断点。
再次Ctrl+G 401000
撤消刚才做的选择,右键-》撤消选择 或者改成和ADD BYTE PTR DS:[EAX],AL就可以了。
2、下GetModuleHandleA断点F9运行
7C80B529 k> 8BFF mov edi,edi 断在这里,取消断点,断点重新设在下面
7C80B52B 55 push ebp
7C80B52C 8BEC mov ebp,esp
7C80B52E 837D 08 00 cmp dword ptr ss:[ebp+8],0
7C80B532 74 18 je short kernel32.7C80B54C 在这里下断后再按F9运行堆栈里内容为下面★2
按F9,注意堆栈里内容
0012CE48 5D175394 /CALL 到 GetModuleHandleA 来自 5D17538E
0012CE4C 5D1753E0 \pModule = "kernel32.dll"
0012CE50 5D1E2B38
0012CE54 00000000
0012CE58 5D170000
0012CE5C 7C812972 返回到 kernel32.7C812972 来自 ntdll.RtlCreateHeap
★2
0012CE44 /0012CE7C
0012CE48 |5D175394 返回到 5D175394 来自 kernel32.GetModuleHandleA
0012CE4C |5D1753E0 ASCII "kernel32.dll"
0012CE50 |5D1E2B38
0012CE54 |00000000
0012CE58 |5D170000
0012CE5C |7C812972 返回到 kernel32.7C812972 来自 ntdll.RtlCreateHeap
F9运行堆栈里内容为下面
0012CF04 /0012CF20
0012CF08 |77F45BD8 返回到 SHLWAPI.77F45BD8 来自 kernel32.GetModuleHandleA
0012CF0C |77F4501C ASCII "KERNEL32.DLL"
0012CF10 |00000001
0012CF14 |77F40000 SHLWAPI.77F40000
0012CF18 |00000000
0012CF1C |0000B6D2
0012CF20 ]0012CF34
F9运行堆栈里内容为下面
0012D718 0012D780
0012D71C 00469D13 ykyManua.00469D13
0012D720 00000000
0012D724 0000FFFF
0012D728 00B26C62
0012D72C 004D6BCC ykyManua.004D6BCC
0012D730 00000000
0012D734 004B5000 ASCII "PDATA000"
0012D738 00495500 ASCII "rdinal %d"
F9运行堆栈里内容为下面
00128CE0 /0012CF48
00128CE4 |00B404D2 返回到 00B404D2 来自 kernel32.GetModuleHandleA
00128CE8 |00B52D40 ASCII "kernel32.dll"
00128CEC |00B53F30 ASCII "VirtualAlloc"
00128CF0 |00000001
00128CF4 |00374B10
00128CF8 |00000000
F9运行堆栈里内容为下面
00128CE0 /0012CF48
00128CE4 |00B404EF 返回到 00B404EF 来自 kernel32.GetModuleHandleA
00128CE8 |00B52D40 ASCII "kernel32.dll"
00128CEC |00B53F24 ASCII "VirtualFree"
00128CF0 |00000001
00128CF4 |00374B10
00128CF8 |00000000
F9运行堆栈里内容为下面
00128A58 /00128CE4
00128A5C |00B29900 返回到 00B29900 来自 kernel32.GetModuleHandleA 看到这里就是返回时机了,记住00B29900
00128A60 |00128B98 ASCII "kernel32.dll"
00128A64 |00000000
00128A68 |CF480000
00128A6C |2B050012
00128A70 |80000000
此时,取消断点,ALT+F9执行到用户代码
00B29900 8B0D 0881B500 MOV ECX,DWORD PTR DS:[B58108]
00B29906 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00B29909 A1 0881B500 MOV EAX,DWORD PTR DS:[B58108]
00B2990E 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00B29911 75 16 JNZ SHORT 00B29929
00B29913 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
00B29919 50 PUSH EAX
00B2991A FF15 D4D0B400 CALL DWORD PTR DS:[B4D0D4] ; kernel32.LoadLibraryA
00B29920 8B0D 0881B500 MOV ECX,DWORD PTR DS:[B58108]
00B29926 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
00B29929 A1 0881B500 MOV EAX,DWORD PTR DS:[B58108]
00B2992E 393C06 CMP DWORD PTR DS:[ESI+EAX],EDI
00B29931 0F84 AD000000 JE 00B299E4 改此处为JMP
00B29937 33C9 XOR ECX,ECX
00B29939 8B03 MOV EAX,DWORD PTR DS:[EBX]
00B2993B 3938 CMP DWORD PTR DS:[EAX],EDI
00B2993D 74 06 JE SHORT 00B29945
00B2993F 41 INC ECX
00B29940 83C0 0C ADD EAX,0C
00B29943 ^EB F6 JMP SHORT 00B2993B
第三、下BP GetCurrentThreadId断点 按F9运行
注意看堆栈
0012831C 73391E36 /CALL 到 GetCurrentThreadId 来自 73391E30
00128320 00000001
00128324 73391C1A 返回到 73391C1A 来自 73391DE2
00128328 73391B60 返回到 73391B60 来自 73391B8C
0012832C 73390000
00128330 00000001
F9运行堆栈里内容为下面
001282FC 7339353F /CALL 到 GetCurrentThreadId 来自 73393539
00128300 00000000
00128304 734A0470
00128308 734A04D8
0012830C /00128324
00128310 |73393519 返回到 73393519 来自 73393525
00128314 |734A0470
00128318 |73393188 返回到 73393188 来自 73393511
F9运行堆栈里内容为下面
00128558 73DC9AD7 /CALL 到 GetCurrentThreadId 来自 73DC9AD1
0012855C 00000000
00128560 73E08100
00128564 73D30000
00128568 73E106B0
0012856C 001286D0 指针到下一个 SEH 记录
00128570 73DD05B4 SE 句柄
00128574 00000000
F9运行堆栈里内容为下面
00126EE8 77DAE5D5 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE5CF
00126EEC /00126F08
00126EF0 |77DAE5AB 返回到 ADVAPI32.77DAE5AB 来自 ADVAPI32.77DAE5CA
00126EF4 |77E16100 ADVAPI32.77E16100
00126EF8 |00000142
00126EFC |00126F40
00126F00 |001270E4
00126F04 |77E16100 ADVAPI32.77E16100
F9运行堆栈里内容为下面
00126D18 77DAE900 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE8FA
00126D1C 00126F34
00126D20 00126F40
00126D24 77E16104 ADVAPI32.77E16104
00126D28 0014EAA0
00126D2C 00000000
00126D30 00000000
F9运行堆栈里内容为下面
00126CD8 77DAEAB0 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAEAAA
00126CDC 00000000
00126CE0 0014EEC0
00126CE4 77E16100 ADVAPI32.77E16100
00126CE8 0014EEE8
00126CEC 0014F018
F9运行堆栈里内容为下面
00126EE8 77DAE5D5 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE5CF
00126EEC /00126F08
00126EF0 |77DAE5AB 返回到 ADVAPI32.77DAE5AB 来自 ADVAPI32.77DAE5CA
00126EF4 |77E16100 ADVAPI32.77E16100
00126EF8 |00000142
00126EFC |00126F40
00126F00 |001270E4
F9运行堆栈里内容为下面
00126F08 77DAE80D /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE807
00126F0C 8000001A
00126F10 77E16100 ADVAPI32.77E16100
00126F14 /00126F38
00126F18 |77DAE82F 返回到 ADVAPI32.77DAE82F 来自 ADVAPI32.77DAD288
00126F1C |77E16100 ADVAPI32.77E16100
00126F20 |00000142
出现错误提示,按确定,再SHIFT+F9
00128398 73DC9AD7 /CALL 到 GetCurrentThreadId 来自 MFC42.73DC9AD1
0012839C 014B2650 ykyCompu.014B2650
001283A0 01447F58 ykyCompu.01447F58
001283A4 013E0000 ykyCompu.013E0000
001283A8 01447F58 ykyCompu.01447F58
001283AC 00128588 指针到下一个 SEH 记录
001283B0 73DD05B4 SE 句柄
F9运行堆栈里内容为下面
00126EE8 77DAE5D5 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE5CF
00126EEC /00126F08
00126EF0 |77DAE5AB 返回到 ADVAPI32.77DAE5AB 来自 ADVAPI32.77DAE5CA
00126EF4 |77E16100 ADVAPI32.77E16100
00126EF8 |00000156
00126EFC |00126F40
F9运行堆栈里内容为下面
00126D18 77DAE900 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE8FA
00126D1C 00126F34
00126D20 00126F40
00126D24 77E16104 ADVAPI32.77E16104
00126D28 00150FE0
00126D2C 00000000
F9运行堆栈里内容为下面
00126CD8 77DAEAB0 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAEAAA
00126CDC 00000000
00126CE0 00151400
00126CE4 77E16100 ADVAPI32.77E16100
00126CE8 00151428
F9运行堆栈里内容为下面
00126EE8 77DAE5D5 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE5CF
00126EEC /00126F08
00126EF0 |77DAE5AB 返回到 ADVAPI32.77DAE5AB 来自 ADVAPI32.77DAE5CA
00126EF4 |77E16100 ADVAPI32.77E16100
00126EF8 |00000156
00126EFC |00126F40
F9运行堆栈里内容为下面
00126F08 77DAE80D /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE807
00126F0C 8000001A
00126F10 77E16100 ADVAPI32.77E16100
00126F14 /00126F38
00126F18 |77DAE82F 返回到 ADVAPI32.77DAE82F 来自 ADVAPI32.77DAD288
00126F1C |77E16100 ADVAPI32.77E16100
出现错误提示,按确定,再SHIFT+F9
00128398 73DC9AD7 /CALL 到 GetCurrentThreadId 来自 MFC42.73DC9AD1
0012839C 01632650 SpringDl.01632650
001283A0 015DCF18 SpringDl.015DCF18
001283A4 015C0000 SpringDl.015C0000
001283A8 015DCF18 SpringDl.015DCF18
001283AC 00128588 指针到下一个 SEH 记录
001283B0 73DD05B4 SE 句柄
F9运行堆栈里内容为下面
00126EE8 77DAE5D5 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE5CF
00126EEC /00126F08
00126EF0 |77DAE5AB 返回到 ADVAPI32.77DAE5AB 来自 ADVAPI32.77DAE5CA
00126EF4 |77E16100 ADVAPI32.77E16100
00126EF8 |0000016A
F9运行堆栈里内容为下面
00126D18 77DAE900 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE8FA
00126D1C 00126F34
00126D20 00126F40
00126D24 77E16104 ADVAPI32.77E16104
00126D28 00153530
F9运行堆栈里内容为下面
00126CD8 77DAEAB0 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAEAAA
00126CDC 00000000
00126CE0 00153950
00126CE4 77E16100 ADVAPI32.77E16100
00126CE8 00153978
00126CEC 00153AA8
F9运行堆栈里内容为下面
00126EE8 77DAE5D5 /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE5CF
00126EEC /00126F08
00126EF0 |77DAE5AB 返回到 ADVAPI32.77DAE5AB 来自 ADVAPI32.77DAE5CA
00126EF4 |77E16100 ADVAPI32.77E16100
00126EF8 |0000016A
F9运行堆栈里内容为下面
00126F08 77DAE80D /CALL 到 GetCurrentThreadId 来自 ADVAPI32.77DAE807
00126F0C 8000001A
00126F10 77E16100 ADVAPI32.77E16100
00126F14 /00126F38
00126F18 |77DAE82F 返回到 ADVAPI32.77DAE82F 来自 ADVAPI32.77DAD288
00126F1C |77E16100 ADVAPI32.77E16100
00126F20 |0000016A
00126F24 |00000001
出现错误提示,按确定,再SHIFT+F9
00128398 73DC9AD7 /CALL 到 GetCurrentThreadId 来自 MFC42.73DC9AD1
0012839C 017D9650 QueryCal.017D9650
001283A0 017777B0 QueryCal.017777B0
001283A4 01720000 QueryCal.01720000
001283A8 017777B0 QueryCal.017777B0
001283AC 00128588 指针到下一个 SEH 记录
001283B0 73DD05B4 SE 句柄
F9运行堆栈里内容为下面
0012D770 00B4893A /CALL 到 GetCurrentThreadId 来自 00B48934
0012D774 0012FF04
0012D778 00000000
0012D77C 0047ED5D ykyManua.0047ED5D
0012D780 0046B256 ykyManua.0046B256
0012D784 0049B2C0 ykyManua.0049B2C0
0012D788 0012FF04
0012D78C 00000000
0012D790 0047ED5D ykyManua.0047ED5D
F9运行堆栈里内容为下面
0012D760 00B29C29 /CALL 到 GetCurrentThreadId 来自 00B29C23 看到了吧,和上面记的那个地址相近了,就到这里吧
0012D764 00000000
0012D768 0000016C
0012D76C 0012DEE0
0012D770 00B48944 返回到 00B48944 来自 00B29BF0
0012D774 0012FF04
0012D778 00000000
0012D77C 0047ED5D ykyManua.0047ED5D
取消断点ALT+F9返回这里: 已经没有技巧了,慢慢跟吧。直到00B489CD
00B29C29 50 PUSH EAX
00B29C2A FF75 FC PUSH DWORD PTR SS:[EBP-4]
00B29C2D E8 05000000 CALL 00B29C37
00B29C32 83C4 0C ADD ESP,0C
00B29C35 C9 LEAVE
00B29C36 C3 RETN
00B29C37 6A 14 PUSH 14
00B29C39 E8 AC240200 CALL 00B4C0EA ; JMP to msvcrt.??2@YAPAXI@Z
00B29C3E 85C0 TEST EAX,EAX
00B29C40 59 POP ECX
00B29C41 74 13 JE SHORT 00B29C56
00B29C43 FF7424 0C PUSH DWORD PTR SS:[ESP+C]
00B29C47 8BC8 MOV ECX,EAX
00B29C49 FF7424 0C PUSH DWORD PTR SS:[ESP+C]
00B29C4D FF7424 0C PUSH DWORD PTR SS:[ESP+C]
00B29C51 E8 CDFEFFFF CALL 00B29B23
00B489AF FF76 04 PUSH DWORD PTR DS:[ESI+4]
00B489B2 FF76 08 PUSH DWORD PTR DS:[ESI+8]
00B489B5 6A 00 PUSH 0
00B489B7 E8 85FAFEFF CALL 00B38441
00B489BC 50 PUSH EAX
00B489BD A1 78C5B500 MOV EAX,DWORD PTR DS:[B5C578]
00B489C2 8B48 44 MOV ECX,DWORD PTR DS:[EAX+44]
00B489C5 3348 40 XOR ECX,DWORD PTR DS:[EAX+40]
00B489C8 3348 34 XOR ECX,DWORD PTR DS:[EAX+34]
00B489CB 2BF9 SUB EDI,ECX
00B489CD FFD7 CALL EDI 这里,直接F7跟进吧。
00B489CF 8BD8 MOV EBX,EAX
00B489D1 5F POP EDI
00B489D2 8BC3 MOV EAX,EBX
00B489D4 5E POP ESI
00B489D5 5B POP EBX
00B489D6 C3 RETN
00B489D7 837C24 08 01 CMP DWORD PTR SS:[ESP+8],1
00B489DC 75 14 JNZ SHORT 00B489F2
00B489DE 68 A8C1B500 PUSH 0B5C1A8
00B489E3 FF15 9CD2B400 CALL DWORD PTR DS:[B4D29C] ; kernel32.InitializeCriticalSection
00B489E9 8B4424 04 MOV EAX,DWORD PTR SS:[ESP+4]
00B489ED A3 70C5B500 MOV DWORD PTR DS:[B5C570],EAX
00B489F2 6A 01 PUSH 1
F7跟进后到这里,一片红云,OK了。还等 什么,lordPE,全部DUMP。这还没有完。看下面。
0044949E 55 PUSH EBP 44949E-400000=4949E 这就是OPE入口了。
0044949F 8BEC MOV EBP,ESP
004494A1 6A FF PUSH -1
004494A3 68 D8E44400 PUSH ykyManua.0044E4D8
004494A8 68 FC954400 PUSH ykyManua.004495FC ; JMP to msvcrt._except_handler3
004494AD 64:A1 00000000 MOV EAX,DWORD PTR FS:[0]
004494B3 50 PUSH EAX
004494B4 64:8925 00000000 MOV DWORD PTR FS:[0],ESP
004494BB 83EC 68 SUB ESP,68
注意此时不要关OD,直接打开ImprotREC,选择我们要脱的进程。然后输入OEP,4949E。自动搜索IAT-》获取输入表,有一个假指针-》点显示无效函数-》右键-》剪切指针-》修复抓取文件。呵呵~~成功
用PEID查,还有Armadillo 1.xx - 2.xx的壳,用FI查就没有了,运行,没有问题,一切OK.
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)