首页
社区
课程
招聘
Recover My Files V3.98.5061脱壳过程+去暗桩记录
发表于: 2006-9-26 12:13 4062

Recover My Files V3.98.5061脱壳过程+去暗桩记录

2006-9-26 12:13
4062
汉化绿色版\RecoverMyFiles.exe
★ 目标为Armadillo保护
★ 特征识别 = 40F018B8
保护系统级别为 (专业版)
◆所用到的保护模式有◆
标准保护 或 最小保护模式
使用策略代码衔接模式
【备份密钥设置】
仅使用主密钥,不备份密钥
【程序压缩设置】
较好/较慢地压缩方式
【其它保护设置】
Recover My Files V3.98.5061脱壳过程中的问题:
[软件]数据恢复Recover My Files V3.98.5061 汉化绿色版
[资源来自]:绿色下载站http://www.greendown.cn。

我用PEID查看该程序是Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks [Overlay]

然后我就按照帖子上教的办法来脱壳,该程序是单进程的,因此不用使程序把自己当成子进程运行,因此第一步跳过了

1,避开IAT加密

利用OD加载程序,程序在下面代码处:

00867333 R>/$  55          push ebp
00867334   |.  8BEC        mov ebp,esp
00867336   |.  6A FF       push -1
00867338   |.  68 501F8900 push RecoverM.00891F50
0086733D   |.  68 70708600 push RecoverM.00867070               ;  SE handler installation
00867342   |.  64:A1 00000>mov eax,dword ptr fs:[0]
00867348   |.  50          push eax
00867349   |.  64:8925 000>mov dword ptr fs:[0],esp
00867350   |.  83EC 58     sub esp,58
00867353   |.  53          push ebx
00867354   |.  56          push esi
00867355   |.  57          push edi
00867356   |.  8965 E8     mov dword ptr ss:[ebp-18],esp
00867359   |.  FF15 8CC188>call dword ptr ds:[<&KERNEL32.GetVer>;  KERNEL32.GetVersion
0086735F   |.  33D2        xor edx,edx
00867361   |.  8AD4        mov dl,ah

下断:He GetModuleHandleA,F9运行,程序中断在下面代码处,
77E6AB06 K>  55            push ebp
77E6AB07     8BEC          mov ebp,esp
77E6AB09     837D 08 00    cmp dword ptr ss:[ebp+8],0
77E6AB0D     0F84 31F50000 je KERNEL32.77E7A044
77E6AB13     FF75 08       push dword ptr ss:[ebp+8]
77E6AB16     E8 9EC8FFFF   call KERNEL32.77E673B9
77E6AB1B     85C0          test eax,eax
77E6AB1D     74 08         je short KERNEL32.77E6AB27
77E6AB1F     FF70 04       push dword ptr ds:[eax+4]
77E6AB22     E8 5B560000   call KERNEL32.GetModuleHandleW
77E6AB27     5D            pop ebp
77E6AB28     C2 0400       retn 4

注意查看堆栈:
当堆栈中出现
001294D0    011972E5  /CALL 到 GetModuleHandleA 来自 011972DF
001294D4    011ABC54  \pModule = "kernel32.dll"
001294D8    011ACF7C  ASCII "VirtualAlloc"

001294D0    01197302  /CALL 到 GetModuleHandleA 来自 011972FC
001294D4    011ABC54  \pModule = "kernel32.dll"
001294D8    011ACF70  ASCII "VirtualFree"

00129234    01185C5A  /CALL 到 GetModuleHandleA 来自 01185C54
00129238    00129384  \pModule = "kernel32.dll"

此时,取消断点,ALT+F9返回,程序返回到
01185C5A     8B0D 7C421B01 mov ecx,dword ptr ds:[11B427C]
01185C60     89040E        mov dword ptr ds:[esi+ecx],eax
01185C63     A1 7C421B01   mov eax,dword ptr ds:[11B427C]
01185C68     391C06        cmp dword ptr ds:[esi+eax],ebx
01185C6B     75 16         jnz short 01185C83
01185C6D     8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
01185C73     50            push eax
01185C74     FF15 BC621A01 call dword ptr ds:[11A62BC]          ; KERNEL32.LoadLibraryA
01185C7A     8B0D 7C421B01 mov ecx,dword ptr ds:[11B427C]
01185C80     89040E        mov dword ptr ds:[esi+ecx],eax
01185C83     A1 7C421B01   mov eax,dword ptr ds:[11B427C]
01185C88     391C06        cmp dword ptr ds:[esi+eax],ebx
01185C8B     0F84 2F010000 je 01185DC0                          ;这就是大家说的Magic Jump了
01185C91     33C9          xor ecx,ecx
01185C93     8B07          mov eax,dword ptr ds:[edi]
01185C95     3918          cmp dword ptr ds:[eax],ebx
01185C97     74 06         je short 01185C9F
01185C99     41            inc ecx
01185C9A     83C0 0C       add eax,0C
01185C9D   ^ EB F6         jmp short 01185C95
当程序运行到01185C8B     0F84 2F010000 je 01185DC0时,修改Z标志,使其强行跳转

程序跳转到下列代码处:
01185DC0     83C7 0C       add edi,0C
01185DC3     89BD 78FDFFFF mov dword ptr ss:[ebp-288],edi
01185DC9     83C6 04       add esi,4
01185DCC     395F FC       cmp dword ptr ds:[edi-4],ebx
01185DCF   ^ 0F85 49FEFFFF jnz 01185C1E
01185DD5     EB 03         jmp short 01185DDA
01185DD7     D6            salc
01185DD8     D6            salc

当看到jmp、salc、salc代码连在一起时,OK,这就是IAT解密已经完成的地方。
程序在下面会依据原先的代码进行解码,如没有修改原代码,则解码正确。而直接修改Magic Jump后改变了原先的代码,导致解码不
正确而异常出错!

2 寻找OEP
用内存断点大法直抵OEP

Alt+M 查看内存,在401000开始的段上 下内存访问断点,F9运行,程序中断在
0119FC14     8B12          mov edx,dword ptr ds:[edx]
0119FC16     8955 DC       mov dword ptr ss:[ebp-24],edx
0119FC19     834D FC FF    or dword ptr ss:[ebp-4],FFFFFFFF
0119FC1D     EB 11         jmp short 0119FC30
0119FC1F     6A 01         push 1
0119FC21     58            pop eax
0119FC22     C3            retn
0119FC23     8B65 E8       mov esp,dword ptr ss:[ebp-18]
0119FC26     834D FC FF    or dword ptr ss:[ebp-4],FFFFFFFF
0119FC2A     8B7D 08       mov edi,dword ptr ss:[ebp+8]
0119FC2D     8B55 DC       mov edx,dword ptr ss:[ebp-24]
0119FC30     A1 B4021B01   mov eax,dword ptr ds:[11B02B4]
0119FC35     3150 44       xor dword ptr ds:[eax+44],edx
0119FC38     A1 B4021B01   mov eax,dword ptr ds:[11B02B4]
0119FC3D     3150 44       xor dword ptr ds:[eax+44],edx
0119FC40     A1 B4021B01   mov eax,dword ptr ds:[11B02B4]
0119FC45     8B88 90000000 mov ecx,dword ptr ds:[eax+90]
0119FC4B     3348 3C       xor ecx,dword ptr ds:[eax+3C]
0119FC4E     3348 2C       xor ecx,dword ptr ds:[eax+2C]
0119FC51     030D CC021B01 add ecx,dword ptr ds:[11B02CC]       ; RecoverM.00400000
0119FC57     8B17          mov edx,dword ptr ds:[edi]
0119FC59     85D2          test edx,edx
0119FC5B     75 18         jnz short 0119FC75
0119FC5D     FF77 18       push dword ptr ds:[edi+18]
0119FC60     FF77 14       push dword ptr ds:[edi+14]
0119FC63     FF77 10       push dword ptr ds:[edi+10]
0119FC66     8B50 38       mov edx,dword ptr ds:[eax+38]
0119FC69     3350 2C       xor edx,dword ptr ds:[eax+2C]
0119FC6C     3350 24       xor edx,dword ptr ds:[eax+24]
0119FC6F     2BCA          sub ecx,edx
0119FC71     FFD1          call ecx
0119FC73     EB 1D         jmp short 0119FC92
0119FC75     83FA 01       cmp edx,1
0119FC78     75 1B         jnz short 0119FC95
0119FC7A     FF77 04       push dword ptr ds:[edi+4]
0119FC7D     FF77 08       push dword ptr ds:[edi+8]
0119FC80     6A 00         push 0
0119FC82     FF77 0C       push dword ptr ds:[edi+C]
0119FC85     8B50 38       mov edx,dword ptr ds:[eax+38]
0119FC88     3350 2C       xor edx,dword ptr ds:[eax+2C]
0119FC8B     3350 24       xor edx,dword ptr ds:[eax+24]
0119FC8E     2BCA          sub ecx,edx
0119FC90     FFD1          call ecx                            ;此处F7进入,F8 就运行了
0119FC92     8945 E4       mov dword ptr ss:[ebp-1C],eax
0119FC95     8B45 E4       mov eax,dword ptr ss:[ebp-1C]
0119FC98     8B4D F0       mov ecx,dword ptr ss:[ebp-10]
0119FC9B     64:890D 00000>mov dword ptr fs:[0],ecx
0119FCA2     5F            pop edi
0119FCA3     5E            pop esi
0119FCA4     5B            pop ebx
0119FCA5     C9            leave
0119FCA6     C3            retn

上述F7进入到
007DAC80     55            push ebp
007DAC81     8BEC          mov ebp,esp
007DAC83     B9 09000000   mov ecx,9
007DAC88     6A 00         push 0
007DAC8A     6A 00         push 0
007DAC8C     49            dec ecx
007DAC8D   ^ 75 F9         jnz short RecoverM.007DAC88
007DAC8F     B8 D09C7D00   mov eax,RecoverM.007D9CD0
007DAC94     E8 CFCAC2FF   call RecoverM.00407768
007DAC99     33C0          xor eax,eax
007DAC9B     55            push ebp
007DAC9C     68 CDB17D00   push RecoverM.007DB1CD
007DACA1     64:FF30       push dword ptr fs:[eax]
007DACA4     64:8920       mov dword ptr fs:[eax],esp
007DACA7     A1 58D07E00   mov eax,dword ptr ds:[7ED058]
007DACAC     8B00          mov eax,dword ptr ds:[eax]
007DACAE     E8 BD7ACDFF   call RecoverM.004B2770
007DACB3     A1 58D07E00   mov eax,dword ptr ds:[7ED058]
007DACB8     8B00          mov eax,dword ptr ds:[eax]
007DACBA     83C0 50       add eax,50
007DACBD     E8 2EA2C2FF   call RecoverM.00404EF0
007DACC2     A1 58D07E00   mov eax,dword ptr ds:[7ED058]
007DACC7     8B00          mov eax,dword ptr ds:[eax]
007DACC9     BA E4B17D00   mov edx,RecoverM.007DB1E4            ; ASCII "RecoverMyFiles"
007DACCE     E8 4175CDFF   call RecoverM.004B2214
007DACD3     A1 04CC7E00   mov eax,dword ptr ds:[7ECC04]
007DACD8     BA FCB17D00   mov edx,RecoverM.007DB1FC            ; ASCII "dd/mm/yyyy"
007DACDD     E8 62A2C2FF   call RecoverM.00404F44
007DACE2     A1 10C97E00   mov eax,dword ptr ds:[7EC910]
007DACE7     BA 10B27D00   mov edx,RecoverM.007DB210            ; ASCII "hh:nn"
007DACEC     E8 53A2C2FF   call RecoverM.00404F44
007DACF1     A1 9CCA7E00   mov eax,dword ptr ds:[7ECA9C]
007DACF6     C600 2F       mov byte ptr ds:[eax],2F
007DACF9     A1 CCC77E00   mov eax,dword ptr ds:[7EC7CC]
007DACFE     C600 3A       mov byte ptr ds:[eax],3A
007DAD01     B2 01         mov dl,1
007DAD03     A1 98DC4100   mov eax,dword ptr ds:[41DC98]
007DAD08     E8 9F92C2FF   call RecoverM.00403FAC
007DAD0D     8B15 C0C97E00 mov edx,dword ptr ds:[7EC9C0]        ; RecoverM.007EF344
007DAD13     8902          mov dword ptr ds:[edx],eax
007DAD15     A1 4CC87E00   mov eax,dword ptr ds:[7EC84C]
007DAD1A     C600 01       mov byte ptr ds:[eax],1
007DAD1D     8D55 E8       lea edx,dword ptr ss:[ebp-18]
007DAD20     A1 58D07E00   mov eax,dword ptr ds:[7ED058]
007DAD25     8B00          mov eax,dword ptr ds:[eax]
007DAD27     E8 C081CDFF   call RecoverM.004B2EEC
007DAD2C     8B45 E8       mov eax,dword ptr ss:[ebp-18]
007DAD2F     8D55 EC       lea edx,dword ptr ss:[ebp-14]
007DAD32     E8 C90DC3FF   call RecoverM.0040BB00
007DAD37     8B45 EC       mov eax,dword ptr ss:[ebp-14]
007DAD3A     E8 9DA6C2FF   call RecoverM.004053DC
007DAD3F     50            push eax
007DAD40     E8 EBCEC2FF   call RecoverM.00407C30               ; jmp to KERNEL32.GetDriveTypeA
007DAD45     83F8 05       cmp eax,5
007DAD48     A1 74CE7E00   mov eax,dword ptr ds:[7ECE74]
007DAD4D     0F9400        sete byte ptr ds:[eax]
007DAD50     A1 74CE7E00   mov eax,dword ptr ds:[7ECE74]
007DAD55     8038 00       cmp byte ptr ds:[eax],0
007DAD58     74 08         je short RecoverM.007DAD62
007DAD5A     A1 4CC87E00   mov eax,dword ptr ds:[7EC84C]
007DAD5F     C600 00       mov byte ptr ds:[eax],0
007DAD62     E8 697EC2FF   call RecoverM.00402BD0
007DAD67     83F8 03       cmp eax,3

这就应该是OEP吧
到达oep后,dump,存为dumped.exe,利用ImportREC修复IAT,在修复过程中,参考了dillodie_v1.6脱壳后的IAT,其中主要是将无效的time和GetCurrentProcess都CUT掉,然后将
RVA 3F231C ptr: 118A4AE修改为User32.MessageBoxA
RVA 3F2380 ptr: 118A914修改为advapi32.RegCreateKeyExA
RVA 3F291C ptr: 118A4AE修改为User32.MessageBoxA
RVA 3F29A4 ptr: 118A528修改为user32.GetWindowTextW
RVA 3F29A8 ptr: 118A4F2修改为user32.GetWindowTextA

3 Code Splicing的处理
打开内存影射,找到如下内存段
内存映射,项目 63
地址=03AC0000
大小=00020000 (131072.)
Owner=         03AC0000 (itself)
区段=
类型=Priv 00021020
访问=R E
初始访问=RWE

记下这个地址,打开lordpe,找到目标进程,选择区域脱壳(第三个选项),找到地址=03AC0000

然后把这部分dump出来,为Region03AC0000-03AD0000.dmp

用lordpe--点pe editor,打开dumped_.exe,点sections,右键,第三个选项,从磁盘导入section,选择

刚才的Region03AC0000-03AD0000.dmp,导入后,右键,选edit section header

修改virtual address为 03AC0000-00400000=036C0000,然后设置lordpe的选项,把rebuilder里面

的选项全部去掉,只保留LordPE的“Validate PE”选项,重建PE。

说明,我看了很多帖子都说无效指针直接cut就行了,但这次为了这个,折腾了我三天两夜,刚开始我总怀疑是Code Splicing没有搞定,后来才怀疑是这个原因了。 希望给我这样的菜鸟有一定的帮助。

Save函数暗桩的处理,利用资源编辑工具发现actSaveAsExecute 007BE560,定位到下面的代码:
007BE628    55              PUSH EBP
007BE629    8BEC            MOV EBP,ESP
007BE62B    83C4 F4         ADD ESP,-0C
007BE62E    56              PUSH ESI
007BE62F    33C9            XOR ECX,ECX
007BE631    894D F4         MOV DWORD PTR SS:[EBP-C],ECX
007BE634    8955 F8         MOV DWORD PTR SS:[EBP-8],EDX
007BE637    8945 FC         MOV DWORD PTR SS:[EBP-4],EAX
007BE63A    33C0            XOR EAX,EAX
007BE63C    55              PUSH EBP
007BE63D    68 E5E67B00     PUSH dumped_f.007BE6E5
007BE642    64:FF30         PUSH DWORD PTR FS:[EAX]
007BE645    64:8920         MOV DWORD PTR FS:[EAX],ESP
007BE648    E8 7BA40100     CALL dumped_f.007D8AC8
007BE64D    A1 BCCD7E00     MOV EAX,DWORD PTR DS:[7ECDBC]
007BE652    8038 00         CMP BYTE PTR DS:[EAX],0
007BE655    74 5E           JE SHORT dumped_f.007BE6B5               ; 关键跳转
007BE657    A1 B0C87E00     MOV EAX,DWORD PTR DS:[7EC8B0]
007BE65C    8B00            MOV EAX,DWORD PTR DS:[EAX]
007BE65E    E8 F96B0100     CALL dumped_f.007D525C
007BE663    84C0            TEST AL,AL
007BE665    74 2C           JE SHORT dumped_f.007BE693
007BE667    B2 01           MOV DL,1
007BE669    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
007BE66C    E8 53EBFFFF     CALL dumped_f.007BD1C4
007BE671    A1 90CD7E00     MOV EAX,DWORD PTR DS:[7ECD90]
007BE676    C600 00         MOV BYTE PTR DS:[EAX],0
007BE679    A1 DCC77E00     MOV EAX,DWORD PTR DS:[7EC7DC]
007BE67E    C600 00         MOV BYTE PTR DS:[EAX],0
007BE681    A1 8CD37E00     MOV EAX,DWORD PTR DS:[7ED38C]
007BE686    C600 00         MOV BYTE PTR DS:[EAX],0
007BE689    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
007BE68C    E8 17A2FFFF     CALL dumped_f.007B88A8
007BE691    EB 34           JMP SHORT dumped_f.007BE6C7
007BE693    6A 00           PUSH 0
007BE695    8D55 F4         LEA EDX,DWORD PTR SS:[EBP-C]
007BE698    B8 D8557B00     MOV EAX,dumped_f.007B55D8
007BE69D    E8 0E8EC4FF     CALL dumped_f.004074B0
007BE6A2    8B45 F4         MOV EAX,DWORD PTR SS:[EBP-C]
007BE6A5    66:8B0D F4E67B0>MOV CX,WORD PTR DS:[7BE6F4]
007BE6AC    B2 02           MOV DL,2
007BE6AE    E8 5D39C8FF     CALL dumped_f.00442010
007BE6B3    EB 12           JMP SHORT dumped_f.007BE6C7
007BE6B5    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
007BE6B8    8B80 E8030000   MOV EAX,DWORD PTR DS:[EAX+3E8]
007BE6BE    66:BE EFFF      MOV SI,0FFEF
007BE6C2    E8 115BC4FF     CALL dumped_f.004041D8
007BE6C7    8B45 FC         MOV EAX,DWORD PTR SS:[EBP-4]
007BE6CA    E8 D9A1FFFF     CALL dumped_f.007B88A8
007BE6CF    33C0            XOR EAX,EAX
007BE6D1    5A              POP EDX
007BE6D2    59              POP ECX
007BE6D3    59              POP ECX
007BE6D4    64:8910         MOV DWORD PTR FS:[EAX],EDX
007BE6D7    68 ECE67B00     PUSH dumped_f.007BE6EC
007BE6DC    8D45 F4         LEA EAX,DWORD PTR SS:[EBP-C]
007BE6DF    E8 0C68C4FF     CALL dumped_f.00404EF0
007BE6E4    C3              RETN
007BE6E5  ^ E9 8660C4FF     JMP dumped_f.00404770
007BE6EA  ^ EB F0           JMP SHORT dumped_f.007BE6DC
007BE6EC    5E              POP ESI
007BE6ED    8BE5            MOV ESP,EBP
007BE6EF    5D              POP EBP
007BE6F0    C3              RETN

只需要将007BE655    74 5E           JE SHORT dumped_f.007BE6B5               ; 关键跳转
NOP掉即可.

经过总结发现该程序将注册与否的标志存放在[7ECDBC]中,因此在7ECDBC处下内存断点,可以搞定所有显示没有注册的信息,
下面使得程序不显示Evaluation Version,而且各项功能都能使用

007DAEAA    A1 BCCD7E00     MOV EAX,DWORD PTR DS:[7ECDBC]
007DAEAF    C600 00         MOV BYTE PTR DS:[EAX],0              ;此处需要修改为MOV BYTE PTR DS:[EAX],1
007DAEB2    A1 48CC7E00     MOV EAX,DWORD PTR DS:[7ECC48]
007DAEB7    8038 00         CMP BYTE PTR DS:[EAX],0
007DAEBA    75 67           JNZ SHORT dumped_f.007DAF23          ; 是否第一次运行该程序

007D90BD    A1 BCCD7E00     MOV EAX,DWORD PTR DS:[7ECDBC]
007D90C2    8038 00         CMP BYTE PTR DS:[EAX],0
007D90C5    0F84 90000000   JE dumped_f.007D915B                 ; 爆破点1,由于前面修改为MOV BYTE PTR DS:[EAX],1此处不需要爆破了

007D9151    34 00           XOR AL,1                             ;此处需要修改为XOR AL,0
007D9153    8B15 BCCD7E00   MOV EDX,DWORD PTR DS:[7ECDBC]            ; dumped_f.007EF2F8
007D9159    8802            MOV BYTE PTR DS:[EDX],AL
007D915B    A1 BCCD7E00     MOV EAX,DWORD PTR DS:[7ECDBC]
007D9160    8038 00         CMP BYTE PTR DS:[EAX],0
007D9163    0F84 9E000000   JE dumped_f.007D9207                     ; 爆破点2

007D91FD    34 01           XOR AL,1
007D91FF    8B15 BCCD7E00   MOV EDX,DWORD PTR DS:[7ECDBC]            ; dumped_f.007EF2F8
007D9205    8802            MOV BYTE PTR DS:[EDX],AL
007D9207    A1 BCCD7E00     MOV EAX,DWORD PTR DS:[7ECDBC]
007D920C    8038 00         CMP BYTE PTR DS:[EAX],0
007D920F    0F84 A9000000   JE dumped_f.007D92BE                     ; 爆破点3,此处不需要修改

007D92B6    A1 BCCD7E00     MOV EAX,DWORD PTR DS:[7ECDBC]
007D92BB    0F9400          SETE BYTE PTR DS:[EAX]                   ;此处需要修改为SETNE BYTE PTR DS:[EAX]
007D92BE    A1 BCCD7E00     MOV EAX,DWORD PTR DS:[7ECDBC]
007D92C3    8038 00         CMP BYTE PTR DS:[EAX],0
007D92C6    0F85 EF000000   JNZ dumped_f.007D93BB                    ; 爆破点4

007BE845    A1 BCCD7E00     MOV EAX,DWORD PTR DS:[7ECDBC]
007BE84A    8038 00         CMP BYTE PTR DS:[EAX],0
007BE84D    75 2D           JNZ SHORT dumped_f.007BE87C              ; 爆破点5,此处由于前面修改了不需要爆破了

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
2
你可不可以帮我破一个外挂壳啊?
2006-9-26 16:53
0
雪    币: 2506
活跃值: (1000)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
3
最初由 海鹰 发布
你可不可以帮我破一个外挂壳啊?

在看雪论坛求破解是违规行为,你已违规一次了,请自重。
2006-9-26 17:05
0
游客
登录 | 注册 方可回帖
返回
//