欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  网络运营

Armadillo 3.78-4.xx双进程的简单脱法

程序员文章站 2022-06-28 08:31:28
文/图 浓咖啡上一期谈了《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操作中使用。
Armadillo 3.78-4.xx双进程的简单脱法
图1
打开OD,点击“文件->附加”,选ED0的CleanUp.exe进程进行附加,如图2所示。附加成功后,会停在这里:
  Armadillo 3.78-4.xx双进程的简单脱法

图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