汉化绿色版\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,此处由于前面修改了不需要爆破了
[课程]FART 脱壳王!加量不加价!FART作者讲授!