Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks [Overlay]
发布网友
发布时间:2022-05-03 06:14
我来回答
共1个回答
热心网友
时间:2023-10-12 11:29
Armadillo 3.78 - 4.xx 是一种 加密方式
也就是 壳程序
下面来源于网上
-------------------------------------
v【加密保护】:Armadillo V4.2 -> Silicon Realms Toolworks
【调试环境】:WinXP、PEiD、ODbyDYK v1.10、LordPE、等
脱壳过程:OD载入程序,老规矩插件隐藏OD,忽略所有异常,再添加以下几个异常C0000005(ACCESS VIOLATION)、C000
001D(ILLEGAL INSTRUCTION)、C000001E(INVALID LOCK SEQUENCE)、C0000096(PRIVILEGED INSTRUCTION)
入口代码:
0105A000 N> 60 pushad
0105A001 E8 00000000 call NOTEPAD.0105A006
0105A006 5D pop ebp
0105A007 50 push eax
0105A008 51 push ecx
0105A009 0FCA bswap edx
0105A00B F7D2 not edx
0105A00D 9C pushfd
下bp OpenMutexA断点shift+F9运行,
77E62391 k> 55 push ebp---------中断在这里
77E62392 8BEC mov ebp,esp
77E62394 51 push ecx
77E62395 51 push ecx
77E62396 837D 10 00 cmp dword ptr ss:[ebp+10],0
77E6239A 56 push esi
77E6239B 0F84 C2E30100 je kernel32.77E80763
77E623A1 64:A1 18000000 mov eax,dword ptr fs:[18]
看堆栈
0006F710 0103229B /CALL 到 OpenMutexA 来自 NOTEPAD.01032295
0006F714 001F0001 |Access = 1F0001
0006F718 00000000 |Inheritable = FALSE
0006F71C 0006FDA0 \MutexName = "52C:A9EEE0AC4"------注意0006fda0,等下会用到
0006F720 00000004
0006F724 00000000
0006F728 010476B3 NOTEPAD.010476B3
Ctrl+G 01001000 键入以下代码:
为什么是Ctrl+G 01001000呢?很多教程里都是Ctrl+G 401000,在本例Ctrl+G 401000是无法写入调式
程序中的,而且401000处有代码(大家可以试一试),那么如何知道是用Ctrl+G 01001000的呢?个人认
为是根据载入口的代码来确定的,形式是入口代码地址的前3位+01000,如本例中的入口代码是:
0105A000 N> 60 pushad,取其地址中的前3位010,再加上01000,合起来就是01001000。这样一来
许多教程中的Ctrl+G 401000是入口代码地址为004xxxxx的形式,401000属于取其地址中的前3位010,再
加上01000中入口代码前3位为004的一个特例。
01001000 60 pushad
01001001 9C pushfd
01001002 68 A0FD0600 push 6FDA0 堆栈里看到的值
01001007 33C0 xor eax,eax
01001009 50 push eax
0100100A 50 push eax
0100100B E8 B5A6E576 call kernel32.CreateMutexA
01001010 9D popfd
01001011 61 popad
01001012 - E9 7A13E676 jmp kernel32.OpenMutexA
01001017 90 nop
在01001000处新建起源,右键-》此处新建EIP
F9运行,再次中断在OpenMutexA处,取消断点。
再次Ctrl+G 01001000
撤消刚才做的选择,右键-》撤消选择
接着下 bp GetMoleHandleA断点F9运行
77E5AD86 k> 837C24 04 00 cmp dword ptr ss:[esp+4],0----断在这里,取消断点
77E5AD8B 0F84 37010000 je kernel32.77E5AEC8----------在这里重新下断点
77E5AD91 FF7424 04 push dword ptr ss:[esp+4]
77E5AD95 E8 F8050000 call kernel32.77E5B392
77E5AD9A 85C0 test eax,eax
77E5AD9C 74 08 je short kernel32.77E5ADA6
77E5AD9E FF70 04 push dword ptr ds:[eax+4]
按F9运行,注意堆栈
许多高手都点明了返回的时机
0006900C 00A05A99 返回到 00A05A99 来自 kernel32.GetMoleHandleA
00069010 0006915C ASCII "kernel32.dll"
00069014 0006EA58
看到以上代码时就是返回的时机了,取消断点
CTRL+F9返回壳代码
00A05A99 8B0D 6C50A300 mov ecx,dword ptr ds:[A3506C]--------回到这里
00A05A9F 89040E mov dword ptr ds:[esi+ecx],eax
00A05AA2 A1 6C50A300 mov eax,dword ptr ds:[A3506C]
00A05AA7 391C06 cmp dword ptr ds:[esi+eax],ebx
00A05AAA 75 16 jnz short 00A05AC2
00A05AAC 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00A05AB2 50 push eax
00A05AB3 FF15 B862A200 call dword ptr ds:[A262B8]
00A05AB9 8B0D 6C50A300 mov ecx,dword ptr ds:[A3506C]
00A05ABF 89040E mov dword ptr ds:[esi+ecx],eax
00A05AC2 A1 6C50A300 mov eax,dword ptr ds:[A3506C]
00A05AC7 391C06 cmp dword ptr ds:[esi+eax],ebx
00A05ACA <> 0F84 2F010000 je 00A05BFF ------magic jump//修改为:JMP 00A05BFF
00A05AD0 33C9 xor ecx,ecx
00A05AD2 8B07 mov eax,dword ptr ds:[edi]
00A05AD4 3918 cmp dword ptr ds:[eax],ebx
00A05AD6 74 06 je short 00A05ADE
00A05AD8 41 inc ecx
00A05AD9 83C0 0C add eax,0C
00A05ADC ^ EB F6 jmp short 00A05AD4
将magic jump由 je 00A05BFF修改为JMP 00A05BFF后,
按ALT+M,不能马上在内存映像:
01001000 00007000 NOTEPAD .text Imag 01001002 R RWE 上下内存断点
否则将会出现以下情况:
77F60B6F 56 push esi
77F60B70 FF75 0C push dword ptr ss:[ebp+C]
77F60B73 8B75 08 mov esi,dword ptr ss:[ebp+8]
77F60B76 56 push esi
77F60B77 E8 AA000000 call ntdll.77F60C26
77F60B7C 84C0 test al,al
77F60B7E 0F85 EB6F0200 jnz ntdll.77F87B6F
77F60B84 53 push ebx
77F60B85 57 push edi
被调式程序无法处理异常。
看了KuNgBiM[DFCG]大大的“新手学脱壳 之 Armadillo 3.00a - 3.61 标准壳”后知道,
在将magic jump由 je 00A05BFF修改为JMP 00A05BFF后,Ctrl+F 在当前位置查找命令:
salc 在00A05C16处,当看到jmp、salc、salc代码连在一起时,呵呵,恭喜,
找到地方了,在salc上面的jmp处下断!--------- KuNgBiM[DFCG]大大的原话
00A05C14 /EB 03 jmp short 00A05C19-----在此下断
00A05C16 |D6 salc-------------------找到这里
00A05C17 |D6 salc
F9运行,断在00A05C14处,现在返回Magic Jump 处,改回原先修改的代码,在 00A05ACA 处
点右键->“撤销选择”即可。
撤消00A05C14处的断点,现在ALT+M在去
01001000 00007000 NOTEPAD .text Imag 01001002 R RWE 下内存断点
按F9两次运行后,直接中断在OEP处(一遍红色的海洋)
01006AE0 6A 70 push 70
01006AE2 68 88180001 push NOTEPAD.01001888
01006AE7 E8 BC010000 call NOTEPAD.01006CA8
01006AEC 33DB xor ebx,ebx
01006AEE 53 push ebx
01006AEF 8B3D 4C110001 mov edi,dword ptr ds:[100114C]
01006AF5 FFD7 call edi
01006AF7 66:8138 4D5A cmp word ptr ds:[eax],5A4D
01006AFC 75 1F jnz short NOTEPAD.01006B1D
01006AFE 8B48 3C mov ecx,dword ptr ds:[eax+3C]
01006B01 03C8 add ecx,eax
01006B03 8139 50450000 cmp dword ptr ds:[ecx],4550
01006B09 75 12 jnz short NOTEPAD.01006B1D
01006B0B 0FB741 18 movzx eax,word ptr ds:[ecx+18]
01006B0F 3D 0B010000 cmp eax,10B
01006B14 74 1F je short NOTEPAD.01006B35
用LORD PE将其mp出来,不关OD,用ImportREC 1.6,选择这个程序的进程,把OEP改为6ae0,
点IT AutoSearch,CUT掉无效函数。FixDump,正常运行!正常的NOTEPAD大小为65K,加壳后
为592K,而脱壳修复后则达到784K,所以有必要对修复后的程序进行减肥,可以参考飘云的
《Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks 脱壳分析 》,减肥后的NOTEPAD
大小为65.3K,与正常的大小差不多
热心网友
时间:2023-10-12 11:29
Armadillo 3.78 - 4.xx 是一种 加密方式
也就是 壳程序
下面来源于网上
-------------------------------------
v【加密保护】:Armadillo V4.2 -> Silicon Realms Toolworks
【调试环境】:WinXP、PEiD、ODbyDYK v1.10、LordPE、等
脱壳过程:OD载入程序,老规矩插件隐藏OD,忽略所有异常,再添加以下几个异常C0000005(ACCESS VIOLATION)、C000
001D(ILLEGAL INSTRUCTION)、C000001E(INVALID LOCK SEQUENCE)、C0000096(PRIVILEGED INSTRUCTION)
入口代码:
0105A000 N> 60 pushad
0105A001 E8 00000000 call NOTEPAD.0105A006
0105A006 5D pop ebp
0105A007 50 push eax
0105A008 51 push ecx
0105A009 0FCA bswap edx
0105A00B F7D2 not edx
0105A00D 9C pushfd
下bp OpenMutexA断点shift+F9运行,
77E62391 k> 55 push ebp---------中断在这里
77E62392 8BEC mov ebp,esp
77E62394 51 push ecx
77E62395 51 push ecx
77E62396 837D 10 00 cmp dword ptr ss:[ebp+10],0
77E6239A 56 push esi
77E6239B 0F84 C2E30100 je kernel32.77E80763
77E623A1 64:A1 18000000 mov eax,dword ptr fs:[18]
看堆栈
0006F710 0103229B /CALL 到 OpenMutexA 来自 NOTEPAD.01032295
0006F714 001F0001 |Access = 1F0001
0006F718 00000000 |Inheritable = FALSE
0006F71C 0006FDA0 \MutexName = "52C:A9EEE0AC4"------注意0006fda0,等下会用到
0006F720 00000004
0006F724 00000000
0006F728 010476B3 NOTEPAD.010476B3
Ctrl+G 01001000 键入以下代码:
为什么是Ctrl+G 01001000呢?很多教程里都是Ctrl+G 401000,在本例Ctrl+G 401000是无法写入调式
程序中的,而且401000处有代码(大家可以试一试),那么如何知道是用Ctrl+G 01001000的呢?个人认
为是根据载入口的代码来确定的,形式是入口代码地址的前3位+01000,如本例中的入口代码是:
0105A000 N> 60 pushad,取其地址中的前3位010,再加上01000,合起来就是01001000。这样一来
许多教程中的Ctrl+G 401000是入口代码地址为004xxxxx的形式,401000属于取其地址中的前3位010,再
加上01000中入口代码前3位为004的一个特例。
01001000 60 pushad
01001001 9C pushfd
01001002 68 A0FD0600 push 6FDA0 堆栈里看到的值
01001007 33C0 xor eax,eax
01001009 50 push eax
0100100A 50 push eax
0100100B E8 B5A6E576 call kernel32.CreateMutexA
01001010 9D popfd
01001011 61 popad
01001012 - E9 7A13E676 jmp kernel32.OpenMutexA
01001017 90 nop
在01001000处新建起源,右键-》此处新建EIP
F9运行,再次中断在OpenMutexA处,取消断点。
再次Ctrl+G 01001000
撤消刚才做的选择,右键-》撤消选择
接着下 bp GetMoleHandleA断点F9运行
77E5AD86 k> 837C24 04 00 cmp dword ptr ss:[esp+4],0----断在这里,取消断点
77E5AD8B 0F84 37010000 je kernel32.77E5AEC8----------在这里重新下断点
77E5AD91 FF7424 04 push dword ptr ss:[esp+4]
77E5AD95 E8 F8050000 call kernel32.77E5B392
77E5AD9A 85C0 test eax,eax
77E5AD9C 74 08 je short kernel32.77E5ADA6
77E5AD9E FF70 04 push dword ptr ds:[eax+4]
按F9运行,注意堆栈
许多高手都点明了返回的时机
0006900C 00A05A99 返回到 00A05A99 来自 kernel32.GetMoleHandleA
00069010 0006915C ASCII "kernel32.dll"
00069014 0006EA58
看到以上代码时就是返回的时机了,取消断点
CTRL+F9返回壳代码
00A05A99 8B0D 6C50A300 mov ecx,dword ptr ds:[A3506C]--------回到这里
00A05A9F 89040E mov dword ptr ds:[esi+ecx],eax
00A05AA2 A1 6C50A300 mov eax,dword ptr ds:[A3506C]
00A05AA7 391C06 cmp dword ptr ds:[esi+eax],ebx
00A05AAA 75 16 jnz short 00A05AC2
00A05AAC 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00A05AB2 50 push eax
00A05AB3 FF15 B862A200 call dword ptr ds:[A262B8]
00A05AB9 8B0D 6C50A300 mov ecx,dword ptr ds:[A3506C]
00A05ABF 89040E mov dword ptr ds:[esi+ecx],eax
00A05AC2 A1 6C50A300 mov eax,dword ptr ds:[A3506C]
00A05AC7 391C06 cmp dword ptr ds:[esi+eax],ebx
00A05ACA <> 0F84 2F010000 je 00A05BFF ------magic jump//修改为:JMP 00A05BFF
00A05AD0 33C9 xor ecx,ecx
00A05AD2 8B07 mov eax,dword ptr ds:[edi]
00A05AD4 3918 cmp dword ptr ds:[eax],ebx
00A05AD6 74 06 je short 00A05ADE
00A05AD8 41 inc ecx
00A05AD9 83C0 0C add eax,0C
00A05ADC ^ EB F6 jmp short 00A05AD4
将magic jump由 je 00A05BFF修改为JMP 00A05BFF后,
按ALT+M,不能马上在内存映像:
01001000 00007000 NOTEPAD .text Imag 01001002 R RWE 上下内存断点
否则将会出现以下情况:
77F60B6F 56 push esi
77F60B70 FF75 0C push dword ptr ss:[ebp+C]
77F60B73 8B75 08 mov esi,dword ptr ss:[ebp+8]
77F60B76 56 push esi
77F60B77 E8 AA000000 call ntdll.77F60C26
77F60B7C 84C0 test al,al
77F60B7E 0F85 EB6F0200 jnz ntdll.77F87B6F
77F60B84 53 push ebx
77F60B85 57 push edi
被调式程序无法处理异常。
看了KuNgBiM[DFCG]大大的“新手学脱壳 之 Armadillo 3.00a - 3.61 标准壳”后知道,
在将magic jump由 je 00A05BFF修改为JMP 00A05BFF后,Ctrl+F 在当前位置查找命令:
salc 在00A05C16处,当看到jmp、salc、salc代码连在一起时,呵呵,恭喜,
找到地方了,在salc上面的jmp处下断!--------- KuNgBiM[DFCG]大大的原话
00A05C14 /EB 03 jmp short 00A05C19-----在此下断
00A05C16 |D6 salc-------------------找到这里
00A05C17 |D6 salc
F9运行,断在00A05C14处,现在返回Magic Jump 处,改回原先修改的代码,在 00A05ACA 处
点右键->“撤销选择”即可。
撤消00A05C14处的断点,现在ALT+M在去
01001000 00007000 NOTEPAD .text Imag 01001002 R RWE 下内存断点
按F9两次运行后,直接中断在OEP处(一遍红色的海洋)
01006AE0 6A 70 push 70
01006AE2 68 88180001 push NOTEPAD.01001888
01006AE7 E8 BC010000 call NOTEPAD.01006CA8
01006AEC 33DB xor ebx,ebx
01006AEE 53 push ebx
01006AEF 8B3D 4C110001 mov edi,dword ptr ds:[100114C]
01006AF5 FFD7 call edi
01006AF7 66:8138 4D5A cmp word ptr ds:[eax],5A4D
01006AFC 75 1F jnz short NOTEPAD.01006B1D
01006AFE 8B48 3C mov ecx,dword ptr ds:[eax+3C]
01006B01 03C8 add ecx,eax
01006B03 8139 50450000 cmp dword ptr ds:[ecx],4550
01006B09 75 12 jnz short NOTEPAD.01006B1D
01006B0B 0FB741 18 movzx eax,word ptr ds:[ecx+18]
01006B0F 3D 0B010000 cmp eax,10B
01006B14 74 1F je short NOTEPAD.01006B35
用LORD PE将其mp出来,不关OD,用ImportREC 1.6,选择这个程序的进程,把OEP改为6ae0,
点IT AutoSearch,CUT掉无效函数。FixDump,正常运行!正常的NOTEPAD大小为65K,加壳后
为592K,而脱壳修复后则达到784K,所以有必要对修复后的程序进行减肥,可以参考飘云的
《Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks 脱壳分析 》,减肥后的NOTEPAD
大小为65.3K,与正常的大小差不多