1.peid查壳
Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks(可能查看的不准)
2.FI查壳
Armadillo 4.00 {glue} SRT .text1
3. 使用ArmadilloFindProtected查看穿山甲加密属性:(以下属性可能查看的不准)
!- Protected Armadillo(穿山甲保护)
<Protection Options>(穿山甲属性)
Debug-Blocker(屏蔽调试器双进程)
CopyMem-II(保护方式,不确定是否正确)
Enable Memory-Patching Protections
<Backup Key Options>
Fixed Backup Keys(固定备份钥匙)
<Compression Options>
Best/Slowest Compression(最好,最慢压缩方式)
启动程序,出现提示框:
This program requires a security key. If you have one, select OK to enter it. After entering
a valid key, you will not be prompted again.(此程序需要一个KEY,如果你有一个KEY,选择OK输入
输入一个正确的KEY后,你将不需要从新输入)
点OK出现提示框:
Hardware fingerprint: 23B4-20AB(我的机器码)
Name:
Key:
此程序没有试用限制,直接KEY保护
注意:(发现需要KEY以后如果没有别人机器上的一个有效KEY,就放弃了,我这里有一个KEY)
然后在 Windows 任务管理器或LordPE里查看是双进程的。
4.老规矩设置Ollydbg忽略所有异常,用IsDebug 1.4插件去掉Ollydbg的调试器标志
OD 载入,发现Windows 任务管理器或LordPE里查看是单进程,这是屏蔽了调试器双进程。
Armadillo4.X版本判断:
下断点 HE OutputDebugStringA
Shift+F9运行,中断下来。看堆栈:
0012BCC0 004D2A68 /CALL 到 OutputDebugStringA 来自 加密.004D2A65
0012BCC4 003A0A08 \String = "%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%
s%s%s%s%s%s%s%s%s%s%s%s%s%s%s"
出现这个说明这个壳我们还是以 FI 查出的结果为准
清除断点,从新载入。
004E0D93 >/$ 55 PUSH EBP(载入停在这里)
004E0D94 |. 8BEC MOV EBP,ESP
004E0D96 |. 6A FF PUSH -1
1 分离父子进程
下断点BP OpenMutexA
F9运行中断后,看堆栈:
0012D7AC 004CC9B8 /CALL 到 OpenMutexA 来自 动画.004CC9B2
0012D7B0 001F0001 |Access = 1F0001
0012D7B4 00000000 |Inheritable = FALSE
0012D7B8 0012DDEC \MutexName = "74C::DA60960C50"
注意这个地址:0012DDEC
在CPU窗口中 Ctrl+G:401000 键入以下代码:
00401000 60 PUSHAD
00401001 9C PUSHFD
00401002 68 ECDD1200 PUSH 12DDEC ; ASCII
"74C::DA60960C50"
00401007 33C0 XOR EAX,EAX
00401009 50 PUSH EAX
0040100A 50 PUSH EAX
0040100B E8 D9BCA177 CALL kernel32.CreateMutexA
00401010 9D POPFD
00401011 61 POPAD
00401012 - E9 548EA177 JMP kernel32.OpenMutexA
二进制:60 9C 68 EC DD 12 00 33 C0 50 50 E8 D9 BC A1 77 9D 61 E9 54 8E A1 77
在 401000 处点鼠标右键 "此处为新 EIP",F9运行,再次中断在OpenMutexA处,此时Ctrl+G:401000 撤
销刚才的修改的代码,使代码还原。OK,父进程分离完毕!清除 OpenMutexA 断点.
2.运行程序,出现提示框:
This program requires a security key. If you have one, select OK to enter it. After entering
a valid key, you will not be prompted again
我们返回OD,下断点:HE GetDlgItem 接着在提示框点OK中断在OD
然后删除断点alt+f9返回:
返回后单步向走
02892D1F 50 PUSH EAX(返回点)
02892D20 68 15040000 PUSH 415
02892D25 57 PUSH EDI
02892D26 FFD6 CALL ESI
02892D28 50 PUSH EAX
02892D29 68 07040000 PUSH 407
02892D2E 57 PUSH EDI
02892D2F FFD6 CALL ESI
02892D31 50 PUSH EAX
02892D32 E8 C37AFFFF CALL 0288A7FA
02892D37 8B0D 14ED8A02 MOV ECX,DWORD PTR DS:[28AED14]
02892D3D 83C4 0C ADD ESP,0C
02892D40 E8 FD53FEFF CALL 02878142
02892D45 33DB XOR EBX,EBX
02892D47 84C0 TEST AL,AL
02892D49 75 36 JNZ SHORT 02892D81
02892D4B 381D 78908A02 CMP BYTE PTR DS:[28A9078],BL
02892D51 74 2E JE SHORT 02892D81
02892D53 8B0D 14ED8A02 MOV ECX,DWORD PTR DS:[28AED14]
02892D59 894D 08 MOV DWORD PTR SS:[EBP+8],ECX
02892D5C E8 E153FEFF CALL 02878142
02892D61 84C0 TEST AL,AL
02892D63 74 07 JE SHORT 02892D6C
02892D65 A1 44608A02 MOV EAX,DWORD PTR DS:[28A6044]
02892D6A EB 06 JMP SHORT 02892D72
02892D6C 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
02892D6F 83C0 08 ADD EAX,8
02892D72 50 PUSH EAX
02892D73 68 07040000 PUSH 407
02892D78 57 PUSH EDI
02892D79 FFD6 CALL ESI
02892D7B 50 PUSH EAX
02892D7C E8 04E80000 CALL 028A1585
02892D81 395D 14 CMP DWORD PTR SS:[EBP+14],EBX
02892D84 0F84 B7000000 JE 02892E41
02892D8A 53 PUSH EBX
02892D8B B9 D8C88A02 MOV ECX,28AC8D8
02892D90 E8 8E51FEFF CALL 02877F23 (F7进入)
02892D95 53 PUSH EBX
02892D96 B9 D8C88A02 MOV ECX,28AC8D8
02892D9B 8945 08 MOV DWORD PTR SS:[EBP+8],EAX
02892D9E E8 9751FEFF CALL 02877F3A
02892DA3 837D 14 01 CMP DWORD PTR SS:[EBP+14],1
02892DA7 75 27 JNZ SHORT 02892DD0
02892DA9 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
02892DAC 8BC8 MOV ECX,EAX
02892DAE 81E1 FFFF0000 AND ECX,0FFFF
02892DB4 C1E8 10 SHR EAX,10
02892DB7 51 PUSH ECX
02892DB8 50 PUSH EAX
02892DB9 8D85 00FFFFFF LEA EAX,DWORD PTR SS:[EBP-100]
02892DBF 68 B8668A02 PUSH 28A66B8 ; ASCII "%04X-%04X"
02892D90 E8 8E51FEFF CALL 02877F23 (F7进入)以后代码:
02877F23 8B81 58060000 MOV EAX,DWORD PTR DS:[ECX+658]
02877F29 8B5424 04 MOV EDX,DWORD PTR SS:[ESP+4]
02877F2D 8B4490 18 MOV EAX,DWORD PTR DS:[EAX+EDX*4+18]
02877F31 3381 58200000 XOR EAX,DWORD PTR DS:[ECX+2058](F8到这里,寄存器EAX显示我的机器
码23B420AB)
02877F37 C2 0400 RETN 4
拷贝这两句代码:
02877F31 3381 58200000 XOR EAX,DWORD PTR DS:[ECX+2058]
02877F37 C2 0400 RETN 4
然后开始打补丁:
在02877F31此代码位置输入:
jmp 00401000
然后进入00401000处,开始写补丁文件,进行机器码欺骗:
00401000 3381 58200000 XOR EAX,DWORD PTR DS:[ECX+2058]
00401006 3D AB20B423 CMP EAX,23B420AB(我的机器码)
0040100B 75 04 JNZ SHORT 动画.00401011
0040100D B8 682664DC MOV EAX,DC642668(别人的机器码)
00401012 C2 0400 RETN 4
二进制:33 81 58 20 00 00 3D AB 20 B4 23 75 04 B8 68 26 64 DC C2 04 00
然后我直接运行出现输入注册码提示框,输入别人的NAME和KEY以后,提示:
key is valid,and has been stored
然后我关闭OD,打开程序提示:
The security key for this program currently stored on your system does not appear to be
valid for this version of the program select yes to enter a new key,or no to revert to the
default setting(if any).
接着我从新做到这一步采用欺骗成功以后直接脱壳下了断点he GetModuleHandleA+5这个断点
接着运行程序,出现输入注册码提示框,输入别人的NAME和KEY以后,点OK返回OD,一直F9直到提示:
key is valid,and has been stored
点OK
这个时候我运行程序发现程序提示:
The security key for this program currently stored on your system does not appear to be
valid for this version of the program select yes to enter a new key,or no to revert to the
default setting(if any).
还是一样的,然后我返回OD,推载显示:
001277F8 02834F9E 返回到 02834F9E 来自 kernel32.GetModuleHandleA
001277FC 00127948 ASCII "kernel32.dll"
删除断点返回
ALT+F9返回,出现红色代码
02834F9E 8B0D AC0D8602 MOV ECX,DWORD PTR DS:[2860DAC]
02834FA4 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
02834FA7 A1 AC0D8602 MOV EAX,DWORD PTR DS:[2860DAC]
02834FAC 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
02834FAF 75 16 JNZ SHORT 02834FC7
02834FB1 8D85 B4FEFFFF LEA EAX,DWORD PTR SS:[EBP-14C]
02834FB7 50 PUSH EAX
02834FB8 FF15 B4328502 CALL DWORD PTR DS:[28532B4] ; kernel32.LoadLibraryA
02834FBE 8B0D AC0D8602 MOV ECX,DWORD PTR DS:[2860DAC]
02834FC4 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
02834FC7 A1 AC0D8602 MOV EAX,DWORD PTR DS:[2860DAC]
02834FCC 391C06 CMP DWORD PTR DS:[ESI+EAX],EBX
02834FCF 0F84 2F010000 JE 02835104 (magic JMP)
02834FD5 33C9 XOR ECX,ECX
02834FD7 8B07 MOV EAX,DWORD PTR DS:[EDI]
02834FD9 3918 CMP DWORD PTR DS:[EAX],EBX
02834FDB 74 06 JE SHORT 02834FE3
02834FDD 41 INC ECX
02834FDE 83C0 0C ADD EAX,0C
02834FE1 ^ EB F6 JMP SHORT 02834FD9
02834FE3 8BD9 MOV EBX,ECX
02834FE5 C1E3 02 SHL EBX,2
02834FE8 53 PUSH EBX
02834FE9 E8 A4DA0100 CALL 02852A92 ; JMP 到 msvcrt.??
2@YAPAXI@Z
02834FEE 8B0D A40D8602 MOV ECX,DWORD PTR DS:[2860DA4]
02834FF4 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
02834FF7 53 PUSH EBX
02834FF8 E8 95DA0100 CALL 02852A92 ; JMP 到 msvcrt.??
2@YAPAXI@Z
02834FFD 59 POP ECX
02834FFE 59 POP ECX
02834FFF 8B0D A80D8602 MOV ECX,DWORD PTR DS:[2860DA8]
02835005 89040E MOV DWORD PTR DS:[ESI+ECX],EAX
02834FCF 0F84 2F010000 JE 02835104 (magic JMP)
我们找到了(magic JMP)
第一种方法:
JE改成JMP
然后继续下断点 bp GetCurrentThreadId
按F9运行中断后,看堆栈:
00127138 73441E36 /CALL 到 GetCurrentThreadId 来自 73441E30
00127118 7344353F /CALL 到 GetCurrentThreadId 来自 73443539
第三次以后死在这里:
02847FEE 0BB2 FAEAFAEB OR ESI,DWORD PTR DS:[EDX+EBFAEAFA]
02847FF4 0E PUSH CS
02847FF5 ^ 7C 8B JL SHORT 02847F82
02847FF7 B7 89 MOV BH,89
02847FF9 1D 8C9DF342 SBB EAX,42F39D8C
02847FFE FC CLD
02847FFF 45 INC EBP
02848000 5F POP EDI
02848001 66:83EE B3 SUB SI,0FFB3
02848005 196490 74 SBB DWORD PTR DS:[EAX+EDX*4+74],ESP
02848009 A7 CMPSD
0284800A BD 18CF9F78 MOV EBP,789FCF18
0284800F ^ 72 CD JB SHORT 02847FDE
02848011 65:B9 900D6DB6 MOV ECX,B66D0D90 ; 多余的前缀
02848017 2F DAS
第二种方法:
为了避免后面有检效JE改成jmp跟随进去:
02835104 83C7 0C ADD EDI,0C
02835107 89BD 78FDFFFF MOV DWORD PTR SS:[EBP-288],EDI
0283510D 83C6 04 ADD ESI,4
02835110 395F FC CMP DWORD PTR DS:[EDI-4],EBX
02835113 ^ 0F85 49FEFFFF JNZ 02834F62
02835119 EB 03 JMP SHORT 0283511E
02835119 EB 03 JMP SHORT 0283511E 下断点,SHIFT+F9运行,取消断点,
把代码02834FCF处的 JMP改回JE
ALT+M打开内存静像在00401000下内存访问断点,运行后死在:
02847FEE 0BB2 FAEAFAEB OR ESI,DWORD PTR DS:[EDX+EBFAEAFA]
02847FF4 0E PUSH CS
02847FF5 ^ 7C 8B JL SHORT 02847F82
02847FF7 B7 89 MOV BH,89
02847FF9 1D 8C9DF342 SBB EAX,42F39D8C
02847FFE FC CLD
02847FFF 45 INC EBP
02848000 5F POP EDI
02848001 66:83EE B3 SUB SI,0FFB3
02848005 196490 74 SBB DWORD PTR DS:[EAX+EDX*4+74],ESP
02848009 A7 CMPSD
0284800A BD 18CF9F78 MOV EBP,789FCF18
0284800F ^ 72 CD JB SHORT 02847FDE
02848011 65:B9 900D6DB6 MOV ECX,B66D0D90 ; 多余的前缀
02848017 2F DAS
希望大家帮忙分析一下是什么原因,是不是因为CopyMem-II保护方式的原因,如果是CopyMem-II保护模式
而且是带固定KEY保护的,那么如何搞定啊,我看过FLY大哥脱魔法转换的文章,可是那个软件有试用限制
的,而我这个没有试用限制了,如果是先搞定KEY,程序是无法运行的,而且此加密屏蔽了调试器双进程
更加无法去解密子进程了,不知道如何是好了,希望解密朋友帮忙分析下,回个帖子
先谢谢大家了
小弟在这里先谢谢大家看此贴了,如果有帮助我的可以去:
http://www.188.com
用户名字:unpack
密码:unpack
在邮件相里有此加密动画,可以下载
或是有热心朋友帮助可以联系我:
QQ:78414633
EMAIL:2982055@163.com
非常感谢此论坛的工作人员让我发帖以便得到大家的帮助
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!