【文章标题】: 脱MoleBox加壳的EdrLib示例
【文章作者】: CCDebuger
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
  写这个是因为看到初级菜鸟的这个求助帖:
  
  http://bbs.pediy.com/showthread.php?t=44385
  
  把他提供的文件拿来做个示例。开个新帖是为了方便查找。这文章没什么技术含量,只是说明一些操作的步骤,方便初学者理解而已。加壳文件及脱壳后的文件还有这篇文章我都放在附件里,大家可以自己下载看。下面进入正题。
  
  主程序脱壳:
  
  1、BP VirtualProtect 中断两次后ALT+F9返回:
  

引用:
  0040EC6D    FF15 10B84100   CALL DWORD PTR DS:[41B810]               ; kernel32.VirtualProtect
  
0040EC73    8B15 E8B64100   MOV EDX,DWORD PTR DS:[41B6E8]            ; 返回到这。[0041B6E8]=003E1F00,数据窗口中看003E1F00的内容,就是OEP:004011C6
  
0040EC79    8B45 E8         MOV EAX,DWORD PTR SS:[EBP-18]
  
0040EC7C    0342 08         ADD EAX,DWORD PTR DS:[EDX+8]             
; [EDX+8]=0000444C,0000444C就是输入表的RVA。这里就可以dump主程序了
  
0040EC7F    8945 F4         MOV DWORD PTR SS:[EBP-C],EAX
  
0040EC82    C705 74B94100 0>MOV DWORD PTR DS:[41B974],0
  0040EC8C    6A 00           
PUSH 0
  0040EC8E    68 
B4AC4100     PUSH Packed.0041ACB4                     
; ASCII "EXECUTABLE"
  
0040EC93    8B0D 70B94100   MOV ECX,DWORD PTR DS:[41B970]            ; Packed.004000D8
  
0040EC99    51              PUSH ECX
  
0040EC9A    8B55 E8         MOV EDX,DWORD PTR SS:[EBP-18]
  
0040EC9D    52              PUSH EDX
  
0040EC9E    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
  
0040ECA1    50              PUSH EAX
  
0040ECA2    E8 E9FAFFFF     CALL Packed.0040E790
  
0040ECA7    83C4 14         ADD ESP,14
  0040ECAA    
E8 B30F0000     CALL Packed.0040FC62
  
0040ECAF    25 FF000000     AND EAX,0FF
  0040ECB4    85C0            
TEST EAX,EAX
  
0040ECB6    74 15           JE SHORT Packed.0040ECCD
  
0040ECB8    E8 B60F0000     CALL Packed.0040FC73
  
0040ECBD    25 FF000000     AND EAX,0FF
  0040ECC2    85C0            
TEST EAX,EAX
  
0040ECC4    74 02           JE SHORT Packed.0040ECC8
  
0040ECC6  EB F0           JMP SHORT Packed.0040ECB8
  
0040ECC8    E8 950F0000     CALL Packed.0040FC62
  
0040ECCD    68 14AD4100     PUSH Packed.0041AD14                     
; ASCII "imm32.dll"
  
0040ECD2    FF15 7CB74100   CALL DWORD PTR DS:[41B77C]               ; kernel32.GetModuleHandleA
  
  堆栈中可以看到这样的内容:
  
引用:
  0012FE44   00400220  Packed.00400220
  
0012FE48   00000001
  0012FE4C   00000000
  0012FE50   00000004
  0012FE54   00407784  
ASCII 
".data"
  
0012FE58   7C93056D  返回到 ntdll.7C93056D 自 ntdll.7C92EE02
  
0012FE5C   00400000  Packed.00400000
  
  2、在 0012FE54   00407784  ASCII ".data" 这句上右键“数据窗口中跟随”,可以看到未加壳前原程序各个区段的名称及属性。
  
  3、到上面所说的位置后不要关OD,保持原样,直接dump主程序按找到的内容参考修复。
  
  
  捆绑文件:
  
  1、回到OD中,搜索指令序列:
  
引用:
  ADD EAX,DWORD PTR DS:[ECX+CONST]
  MOV 
ECX,DWORD PTR SS:[EBP-CONST]
  CMP 
EAX,DWORD PTR DS:[ECX]
  
  会找到两个位置,我们在第二个位置定位:
  
引用:
  0041040E    0341 10         ADD EAX,DWORD PTR DS:[ECX+10]            ; 找到这里,根据下面的VirtualAlloc函数定位
  
00410411    8B8D 74FFFFFF   MOV ECX,DWORD PTR SS:[EBP-8C]
  
00410417    3B01            CMP EAX,DWORD PTR DS:[ECX]
  
00410419    0F86 A0020000   JBE Packed.004106BF
  
0041041F    83A5 58FFFFFF 0>AND DWORD PTR SS:[EBP-A8],0
  00410426    
C745 FC 0100000>MOV DWORD PTR SS:[EBP-4],1
  0041042D    6A 04           
PUSH 4
  0041042F    68 00100000     
PUSH 1000
  00410434    8B85 6CFFFFFF   
MOV EAX,DWORD PTR SS:[EBP-94]
  
0041043A    FF70 10         PUSH DWORD PTR DS:[EAX+10]
  
0041043D    6A 00           PUSH 0
  0041043F    
FF15 08B84100   CALL DWORD PTR DS:[41B808]               
; kernel32.VirtualAlloc
  
00410445    8985 58FFFFFF   MOV DWORD PTR SS:[EBP-A8],EAX
  
  在0041040E地址处设断点,F9断下:
  
引用:
  0041040E    0341 10         ADD EAX,DWORD PTR DS:[ECX+10]            ; 找到这里,根据下面的VirtualAlloc函数定位
  
00410411    8B8D 74FFFFFF   MOV ECX,DWORD PTR SS:[EBP-8C]
  
00410417    3B01            CMP EAX,DWORD PTR DS:[ECX]               
; [ECX]=0000442C,数据窗口中跟随,往上翻翻,这里就是完整的PE头
  
00410419    0F86 A0020000   JBE Packed.004106BF
  
0041041F    83A5 58FFFFFF 0>AND DWORD PTR SS:[EBP-A8],0
  00410426    
C745 FC 0100000>MOV DWORD PTR SS:[EBP-4],1
  0041042D    6A 04           
PUSH 4
  0041042F    68 00100000     
PUSH 1000
  00410434    8B85 6CFFFFFF   
MOV EAX,DWORD PTR SS:[EBP-94]
  
0041043A    FF70 10         PUSH DWORD PTR DS:[EAX+10]
  
0041043D    6A 00           PUSH 0
  0041043F    
FF15 08B84100   CALL DWORD PTR DS:[41B808]               
; kernel32.VirtualAlloc
  
  看一下信息窗口:
  
引用:
  DS:[003E2680]=0000442C
  
EAX=00004000
  
  你那里可能和我这有所不同,只要知道[003E2680]就是[ECX]就行了。数据窗口中跟随003E2680,往上翻翻,看到这样的内容:
  
  003E2520  C1 00 03 00 A6 01 08 00 4D 5A 90 00 03 00 00 00  ?.?.MZ?...
  003E2530  04 00 00 00 FF FF 00 00 B8 00 00 00 00 00 00 00  .....?......
  003E2540  40 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  @...............
  003E2550  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  003E2560  00 00 00 00 D8 00 00 00 0E 1F BA 0E 00 B4 09 CD  ....?..?.?
  003E2570  21 B8 01 4C CD 21 54 68 69 73 20 70 72 6F 67 72  !?L?This progr
  003E2580  61 6D 20 63 61 6E 6E 6F 74 20 62 65 20 72 75 6E  am cannot be run
  003E2590  20 69 6E 20 44 4F 53 20 6D 6F 64 65 2E 0D 0D 0A   in DOS mode....
  003E25A0  24 00 00 00 00 00 00 00 D4 CA 64 C8 90 AB 0A 9B  $.......允d?
  003E25B0  90 AB 0A 9B 90 AB 0A 9B 78 B4 01 9B 91 AB 0A 9B  .???
  003E25C0  13 B7 04 9B 99 AB 0A 9B F2 B4 19 9B 95 AB 0A 9B  ????
  003E25D0  90 AB 0B 9B A7 AB 0A 9B 78 B4 00 9B 87 AB 0A 9B  
  ???
  003E25E0  78 B4 0E 9B 91 AB 0A 9B 52 69 63 68 90 AB 0A 9B  x??ich.
  003E25F0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  003E2600  50 45 00 00 4C 01 04 00 47 08 C7 3D 00 00 00 00  PE..L.G?....
  003E2610  00 00 00 00 E0 00 0E 21 0B 01 06 00 00 00 00 00  ....?!
  .....
  003E2620  00 00 00 00 00 00 00 00 C9 11 00 00 00 10 00 00  ........?.....
  003E2630  00 40 00 00 00 00 40 00 00 10 00 00 00 10 00 00  .@....@.......
  003E2640  04 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00  ..............
  003E2650  00 70 00 00 00 06 00 00 00 00 00 00 02 00 00 00  .p............
  003E2660  00 00 10 00 00 10 00 00 00 00 10 00 00 10 00 00  ............
  003E2670  00 00 00 00 10 00 00 00 A0 48 00 00 6D 00 00 00  .........m...
  003E2680  2C 44 00 00 3C 00 00 00 00 00 00 00 00 00 00 00  ,D..<...........
  003E2690  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  003E26A0  00 60 00 00 B0 03 00 00 00 00 00 00 00 00 00 00  .`..?..........
  003E26B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  003E26C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  003E26D0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  003E26E0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  003E26F0  00 00 00 00 00 00 00 00 2E 74 65 78 74 00 00 00  .........text...
  003E2700  96 2B 00 00 00 10 00 00 00 30 00 00 00 10 00 00  ?......0.....
  003E2710  00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 60  ............ ..`
  003E2720  2E 72 64 61 74 61 00 00 0D 09 00 00 00 40 00 00  .rdata.......@..
  003E2730  00 10 00 00 00 40 00 00 00 00 00 00 00 00 00 00  ....@..........
  003E2740  00 00 00 00 40 00 00 40 2E 64 61 74 61 00 00 00  ....@..@.data...
  003E2750  E0 08 00 00 00 50 00 00 00 10 00 00 00 50 00 00  ?...P......P..
  003E2760  00 00 00 00 00 00 00 00 00 00 00 00 40 00 00 C0  ............@..
  003E2770  2E 72 65 6C 6F 63 00 00 9C 04 00 00 00 60 00 00  .reloc..?...`..
  003E2780  00 10 00 00 00 60 00 00 00 00 00 00 00 00 00 00  ....`..........
  003E2790  00 00 00 00 40 00 00 42 00 00 00 00 00 00 00 00  ....@..B........
  003E27A0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  003E27B0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  003E27C0  00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
  
  从那个 MZ 开始的地方dump,可以使用 PE Tools 的区域转存功能,在上面所贴代码的例子中区域转存的地址选 003E2528,大小选1000。这里保存的就是原始的PE头。
  
  2、现在删掉前面的断点,BP CreateFileA,会断下,看堆栈:
  
引用:
  0012FC34   0041AA98  ASCII "GetCurrentProcessId"
  
0012FC38   00410984  /CALL 到 CreateFileA 自 Packed.0041097E
  
0012FC3C   00972F70  |FileName 
"E:\TEMP\MBX@F44@3E2510.###"
  
0012FC40   40000000  |Access GENERIC_WRITE
  
0012FC44   00000000  |ShareMode 0
  0012FC48   00000000  
|pSecurity NULL
  
0012FC4C   00000002  |Mode CREATE_ALWAYS
  
0012FC50   00000000  |Attributes 0
  0012FC54   00000000  
\hTemplateFile NULL
  
0012FC58   003E20EC
  0012FC5C   00407B6E  
Packed.00407B6E
  
0012FC60   7FFDE000
  0012FC64   00010AE4  
UNICODE 
"TMP=E:\Temp"
  
0012FC68   0012FCEC
  0012FC6C   7C92EE18  
ntdll.7C92EE18
  
0012FC70   7C811419  kernel32.7C811419
  
0012FC74   00000000
  0012FC78   0012FC88
  0012FC7C   00000000
  0012FC80   004046C0  
ASCII 
"EdrLib.dll"
  
  这里就是创建EdrLib.dll,在0012FC3C那句上数据窗口中跟随,使用二进制编辑把“MBX@F44@3E2510.###”改成“EdrLib.dll”,多余的填0。
  
  3、完成后 BP GetModuleHandleA,断下后就可以dump这个EdrLib.dll了。
  
  4、用 PE Tools 的从文件中删除区段功能删掉dump出来的 EdrLib.dll 的最后一个区段“_BOX_”。
  
  5、用16进制工具打开dump出来的 EdrLib.dll,用原先保存的PE头从 EdrLib.dll 的偏移0处开始覆盖,保存。
  
  6、根据OD中看到的加载这个EdrLib.dll的基址,对dump出来的dll基址进行修正,否则可能重定位不正确。我这里根据OD中所看到的,基址填00A30000。
  
  7、再用PE工具看一下这个dll的各个区段,看看是否有偏移及大小不正确的错误,没有的话就OK了。对于这个示例程序,这里不需修正。
  
--------------------------------------------------------------------------------
【版权声明】: 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!