Armadillo 3.78-4.xx双进程的简单脱法
程序员文章站
2022-03-19 11:27:25
文/图 浓咖啡上一期谈了《Armadillo保护壳单、双进程的简单脱法》http://www.2cto.com/Article/201011/78867.html,对于Armadillo(被称...
文/图 浓咖啡
上一期谈了《Armadillo保护壳单、双进程的简单脱法》http://www.2cto.com/Article/201011/78867.html,对于Armadillo(被称做穿山甲保护壳)这一种加密壳,用前人发明的ESP定律脱壳办法,是无法完成脱壳工作的,就上文所谈到的方法,也可以近乎理解为初级Armadillo壳(无其它保护模式)的“ESP”定律脱法。由此,已被界内高手制作成不同版本下的脱壳脚本,只要将脱壳程序载入OD后,运行恰当的脱壳脚本,就会自动到达程序的OEP,之后用工具Dump和修复一下,就可以完成脱壳工作了。目前,Armadillo加壳版本还在不断的更新,原始的方法可能就不奏效了,所以我继续给大家介绍Armadillo 3.78-4.xx双进程的一种简单脱法。
脱壳前的信息收集
我们的目标软件是Disk CleanUp 2000 5.1,一款国外的系统工具软件。由于是英文版,使用起来多少有些不便,计划汉化它,但有壳保护资源,那就要先脱壳,才能汉化了。用PEiD查看,结果采用Armadillo 3.78-4.xx->Silicon Realms Toolworks加壳。再用Armadillo Find Protected V1.4进行细节查看,发现目标经Armadillo保护,保护系统授权等级为标准版,程序所使用保护模式为屏蔽调试器;备份密钥设置为不固定的备份密钥;程序压缩设置为较好/较慢的压缩方式。运行目标程序,用LordPE查看其进程,发现有2个CleanUp.exe进程。
现在,我们已经把它的底摸透了,原来是:Armadillo 3.78-4.xx;保护系统授权等级(标准版);双进程。OK,准备动工吧!
在OD中寻找OEP
Armadillo 3.78-4.xx的程序,在OD中入口的形态如下。
00457000 > 60 pushad ;入口
00457001 E8 00000000 call 00457006
00457006 5D pop ebp
00457007 50 push eax
00457008 51 push ecx
00457009 0FCA bswap edx
0045700B F7D2 not edx
0045700D 9C pushfd
0045700E F7D2 not edx
00457010 0FCA bswap edx
00457012 EB 0F jmp short 00457023
00457014 B9 EB0FB8EB mov ecx, EBB80FEB
00457019 07 pop es
0045701A B9 EB0F90EB mov ecx, EB900FEB
0045701F 08FD or ch, bh
00457021 EB 0B jmp short 0045702E
00457023 F2: prefix repne:
00457024 ^ EB F5 jmp short 0045701B
00457026 ^ EB F6 jmp short 0045701E
00457028 F2: prefix repne:
00457029 EB 08 jmp short 00457033
0045702B FD std
0045702C ^ EB E9 jmp short 00457017
0045702E F3: prefix rep:
0045702F ^ EB E4 jmp short 00457015
00457031 FC cld
00457032 - E9 9D0FC98B jmp 8C0E7FD4
00457037 CA F7D1 retf 0D1F7
这次我给大家介绍一款辅助工具ArmaFP.exe,以完成这次寻找OEP的工作。它可用于子、父进程分离,捕获子进程。将Detach选项打钩,载入目标程序CleanUp.exe,会发现每次的子进程会不一样!如图1所示。记住这里的 ED0和60E8,会在接下来的OD操作中使用。
图1
打开OD,点击“文件->附加”,选ED0的CleanUp.exe进程进行附加,如图2所示。附加成功后,会停在这里:
图2
7C94A3E2 C3 retn
7C94A3E3 90 nop
7C94A3E4 8BFF mov edi, edi
7C94A3E6 > CC int3
7C94A3E7 C3 retn
然后执行返回(Alt +F9),来到这里:
00457000 >- EB FE jmp short <模块入口点> ;入口
00457002 0000 add byte ptr [eax], al
00457004 0000 add byte ptr [eax], al
00457006 5D pop ebp
00457007 50 push eax
00457008 51 push ecx
00457009 0FCA bswap edx
0045700B F7D2 not edx
0045700D 9C pushfd
0045700E F7D2 not edx
00457010 0FCA bswap edx
00457012 EB 0F jmp short 00457023
00457014 B9 EB0FB8EB mov ecx, EBB80FEB
在00457002这行代码处,进行二进制编辑 60E8,代码就会变成如下形式:
00457000 > 60 pushad ;入口
00457001 E8 00000000 call 00457006
00457006 5D pop ebp
00457007 50 push eax
00457008 51 push ecx
00457009 0FCA bswap edx
0045700B F7D2 not edx
0045700D 9C pushfd
0045700E F7D2 not edx
00457010 0FCA bswap edx
00457012 EB 0F jmp short 00457023
00457014 B9 EB0FB8EB mov ecx, EBB80FEB
接下来要做的,就是用“初级Armadillo壳(无其它保护模式)的ESP定律脱法”。点击Ctrl+G,输入GetModuleHandleA,来到如下代码处:
7C82474A > 8BFF mov edi, edi
7C82474C 55 push ebp
7C82474D 8BEC mov ebp, esp
7C82474F 837D 08 00 cmp dword ptr [ebp+8], 0
7C824753 74 18 je short 7C82476D ;下F2断点
7C824755 FF75 08 push dword ptr [ebp+8]
7C824758 E8 C2040000 call 7C824C1F
7C82475D 85C0 test eax, eax
7C82475F 74 08 je short 7C824769
7C824761 FF70 04 push dword ptr [eax+4]
7C824764 E8 CD090000 call GetModuleHandleW
7C824769 5D pop ebp
7C82476A C2 0400 retn 4
在7C824753 处下F2断点,然后按SHIFT+F9,查看堆栈。SHIFT + F9一次,堆栈结果如下:
0012FF0C 0012FF98
0012FF10 00451ED8 ;返回到CleanUp.00451ED8,来自kernel32.GetModuleHandleA
0012FF14 00000000
0012FF18 00000000
0012FF1C 001424B3
0012FF20 0000000A
0012FF24 00000004
0012FF28 7C882964 kernel32.7C882964
SHIFT+F9两次,堆栈结果:
0012CF10 /0012CF48
0012CF14 |773D8089 ;返回到773D8089,来自kernel32.GetModuleHandleA
0012CF18 |77372E84 ASCII "kernel32.dll"
0012CF1C |773E0598
0012CF20 |00000000
0012CF24 |77370000
0012CF28 |7C965109 ;返回到ntdll.7C965109,来自ntdll.7C958256
0012CF2C |7C82B227 ;返回到kernel32.7C82B227,来自ntdll.RtlCreateHeap
SHIFT+F9三次,堆栈结果:
0012CF54 /0012CF74
0012CF58 |773D52D6 ;返回到773D52D6,来自kernel32.GetModuleHandleA
0012CF5C |77372E84 ASCII "kernel32.dll"
0012CF60 |7C823EC7 kernel32.GetProcessHeap
0012CF64 |00144458
0012CF68 |773D47C6
上一期谈了《Armadillo保护壳单、双进程的简单脱法》http://www.2cto.com/Article/201011/78867.html,对于Armadillo(被称做穿山甲保护壳)这一种加密壳,用前人发明的ESP定律脱壳办法,是无法完成脱壳工作的,就上文所谈到的方法,也可以近乎理解为初级Armadillo壳(无其它保护模式)的“ESP”定律脱法。由此,已被界内高手制作成不同版本下的脱壳脚本,只要将脱壳程序载入OD后,运行恰当的脱壳脚本,就会自动到达程序的OEP,之后用工具Dump和修复一下,就可以完成脱壳工作了。目前,Armadillo加壳版本还在不断的更新,原始的方法可能就不奏效了,所以我继续给大家介绍Armadillo 3.78-4.xx双进程的一种简单脱法。
脱壳前的信息收集
我们的目标软件是Disk CleanUp 2000 5.1,一款国外的系统工具软件。由于是英文版,使用起来多少有些不便,计划汉化它,但有壳保护资源,那就要先脱壳,才能汉化了。用PEiD查看,结果采用Armadillo 3.78-4.xx->Silicon Realms Toolworks加壳。再用Armadillo Find Protected V1.4进行细节查看,发现目标经Armadillo保护,保护系统授权等级为标准版,程序所使用保护模式为屏蔽调试器;备份密钥设置为不固定的备份密钥;程序压缩设置为较好/较慢的压缩方式。运行目标程序,用LordPE查看其进程,发现有2个CleanUp.exe进程。
现在,我们已经把它的底摸透了,原来是:Armadillo 3.78-4.xx;保护系统授权等级(标准版);双进程。OK,准备动工吧!
在OD中寻找OEP
Armadillo 3.78-4.xx的程序,在OD中入口的形态如下。
00457000 > 60 pushad ;入口
00457001 E8 00000000 call 00457006
00457006 5D pop ebp
00457007 50 push eax
00457008 51 push ecx
00457009 0FCA bswap edx
0045700B F7D2 not edx
0045700D 9C pushfd
0045700E F7D2 not edx
00457010 0FCA bswap edx
00457012 EB 0F jmp short 00457023
00457014 B9 EB0FB8EB mov ecx, EBB80FEB
00457019 07 pop es
0045701A B9 EB0F90EB mov ecx, EB900FEB
0045701F 08FD or ch, bh
00457021 EB 0B jmp short 0045702E
00457023 F2: prefix repne:
00457024 ^ EB F5 jmp short 0045701B
00457026 ^ EB F6 jmp short 0045701E
00457028 F2: prefix repne:
00457029 EB 08 jmp short 00457033
0045702B FD std
0045702C ^ EB E9 jmp short 00457017
0045702E F3: prefix rep:
0045702F ^ EB E4 jmp short 00457015
00457031 FC cld
00457032 - E9 9D0FC98B jmp 8C0E7FD4
00457037 CA F7D1 retf 0D1F7
这次我给大家介绍一款辅助工具ArmaFP.exe,以完成这次寻找OEP的工作。它可用于子、父进程分离,捕获子进程。将Detach选项打钩,载入目标程序CleanUp.exe,会发现每次的子进程会不一样!如图1所示。记住这里的 ED0和60E8,会在接下来的OD操作中使用。
图1
打开OD,点击“文件->附加”,选ED0的CleanUp.exe进程进行附加,如图2所示。附加成功后,会停在这里:
图2
7C94A3E2 C3 retn
7C94A3E3 90 nop
7C94A3E4 8BFF mov edi, edi
7C94A3E6 > CC int3
7C94A3E7 C3 retn
然后执行返回(Alt +F9),来到这里:
00457000 >- EB FE jmp short <模块入口点> ;入口
00457002 0000 add byte ptr [eax], al
00457004 0000 add byte ptr [eax], al
00457006 5D pop ebp
00457007 50 push eax
00457008 51 push ecx
00457009 0FCA bswap edx
0045700B F7D2 not edx
0045700D 9C pushfd
0045700E F7D2 not edx
00457010 0FCA bswap edx
00457012 EB 0F jmp short 00457023
00457014 B9 EB0FB8EB mov ecx, EBB80FEB
在00457002这行代码处,进行二进制编辑 60E8,代码就会变成如下形式:
00457000 > 60 pushad ;入口
00457001 E8 00000000 call 00457006
00457006 5D pop ebp
00457007 50 push eax
00457008 51 push ecx
00457009 0FCA bswap edx
0045700B F7D2 not edx
0045700D 9C pushfd
0045700E F7D2 not edx
00457010 0FCA bswap edx
00457012 EB 0F jmp short 00457023
00457014 B9 EB0FB8EB mov ecx, EBB80FEB
接下来要做的,就是用“初级Armadillo壳(无其它保护模式)的ESP定律脱法”。点击Ctrl+G,输入GetModuleHandleA,来到如下代码处:
7C82474A > 8BFF mov edi, edi
7C82474C 55 push ebp
7C82474D 8BEC mov ebp, esp
7C82474F 837D 08 00 cmp dword ptr [ebp+8], 0
7C824753 74 18 je short 7C82476D ;下F2断点
7C824755 FF75 08 push dword ptr [ebp+8]
7C824758 E8 C2040000 call 7C824C1F
7C82475D 85C0 test eax, eax
7C82475F 74 08 je short 7C824769
7C824761 FF70 04 push dword ptr [eax+4]
7C824764 E8 CD090000 call GetModuleHandleW
7C824769 5D pop ebp
7C82476A C2 0400 retn 4
在7C824753 处下F2断点,然后按SHIFT+F9,查看堆栈。SHIFT + F9一次,堆栈结果如下:
0012FF0C 0012FF98
0012FF10 00451ED8 ;返回到CleanUp.00451ED8,来自kernel32.GetModuleHandleA
0012FF14 00000000
0012FF18 00000000
0012FF1C 001424B3
0012FF20 0000000A
0012FF24 00000004
0012FF28 7C882964 kernel32.7C882964
SHIFT+F9两次,堆栈结果:
0012CF10 /0012CF48
0012CF14 |773D8089 ;返回到773D8089,来自kernel32.GetModuleHandleA
0012CF18 |77372E84 ASCII "kernel32.dll"
0012CF1C |773E0598
0012CF20 |00000000
0012CF24 |77370000
0012CF28 |7C965109 ;返回到ntdll.7C965109,来自ntdll.7C958256
0012CF2C |7C82B227 ;返回到kernel32.7C82B227,来自ntdll.RtlCreateHeap
SHIFT+F9三次,堆栈结果:
0012CF54 /0012CF74
0012CF58 |773D52D6 ;返回到773D52D6,来自kernel32.GetModuleHandleA
0012CF5C |77372E84 ASCII "kernel32.dll"
0012CF60 |7C823EC7 kernel32.GetProcessHeap
0012CF64 |00144458
0012CF68 |773D47C6