|
第四步,DUMP出程序
标准的流程如下, 下bpx VirtualProtect去找OEP一旦softice中断了,检查softice是否在
Konvertor的领空,如果不在则按F5直到softice在Konvertor的领空中断.然后按F12辅之以F10跟踪过去一些指令,直到你看到一个"call EDI"指令,停在那儿,然后写下EDI的值.那就是OEP.
具体如下:
运行softice4.2.7, ctrl+D调出softice, BPX VirtualProtect.到中断124次时程序运行了,重新来一遍,当在123次出现中断在VirtualProtect时停下(好累啊,也好晕啊),BC *清除所有断点,然后按F10单步返回到主程序. 再耐心地用F10单步走,因为有一堆的JMP,JNZ,JO等,用不了多久的就可来到这:
001B:009815EA C705B01E9B0006000000MOV DWORD PTR [009B1EB0],00000006
001B:009815F4 FF1568C19A00 CALL [009AC168] ,这个CALL用F8跟进
在009815F4这个CALL用F8跟进,然后继续F10,几次后就来到这:
001B:0109EEDF 8B487C MOV ECX,[EAX+7C]
001B:0109EEE2 33486C XOR ECX,[EAX+6C]
001B:0109EEE5 3308 XOR ECX,[EAX]
001B:0109EEE7 2BF9 SUB EDI,ECX
001B:0109EEE9 FFD7 CALL EDI =====>EDI=004BA697
dump取内存中己脱壳的文件
0109EEE9 FFD7 CALL EDI
现在这一行,键入以下命令:
a eip (然后按回车)
jmp eip (然后按回车)
按下F5
这样将改变001B:0109EEE9行的代码. 你会注意到在键入"jmp eip"并按下回车后, 0109EEE9的指令现在是一个jmp.这将有效地使程序"暂停"(有点类似TRW2000的suspend命令). 按下F5使你回到window XP。运行LordPE,在进程列表中选择" Konvertor.exe"然后点击鼠标
右键选中"Dump (Full)",给脱壳的程序起名dump存盘.
知道了OEP那就bpm 004BA697
001B:0098737D 6A00 PUSH 00
001B:0098737F 8B4D0C MOV ECX,[EBP+0C]
001B:00987382 51 PUSH ECX
001B:00987383 8B5508 MOV EDX,[EBP+08]
001B:00987386 52 PUSH EDX
001B:00987387 E847030000 CALL 009876D3
001B:0098738C 83C40C ADD ESP,0C
001B:0098738F 25FF000000 AND EAX,000000FF
001B:00987394 85C0 TEST EAX,EAX
001B:00987396 7507 JNZ 0098739F
第五步, 修复输入表
一般步骤如下:
(1)找被脱壳的入口点(OEP);
(2)完全Dump目标文件;
(3)运行Import REConstructor和需要脱壳的应用程序;
(4)在Import REConstructor下拉列表框中选择应用程序进程;
(5)在左下角填上应用程序的真正入口点偏移(OEP);
(6)按"IAT AutoSearch"按钮,让其自动检测IAT位置,出现"Found address which may be in the Original IAT.Try ’Get Import’"对话框,这表示输入的OEP发挥作用了。
(7)按"Get Import"按钮,让其分析IAT结构得到基本信息;
(8)如发现某个DLL显示"valid :NO" ,按"Show Invalids"按钮将分析所有的无效信息,在Imported Function Found栏中点击鼠标右键,选择"Trace Level1 (Disasm)",再按"Show Invalids"按钮。如果成功,可以看到所有的DLL都为"valid:YES"字样;
(9)再次刷新"Show Invalids"按钮查看结果,如仍有无效的地址,继续手动用右键的Level 2或3修复;
(10)如还是出错,可以利用"Invalidate function(s)"、"Delete thunk(s)"、编辑Import表(双击函数)等功能手动修复。
(11)开始修复已脱壳的程序。选择Add new section (缺省是选上的) 来为Dump出来的文件加一个Section(虽然文件比较大,但避免了许多不必要的麻烦) 。
(12)按"Fix Dump"按钮,并选择刚在(2)步Dump出来的文件,在此不必要备份。如修复的文件名是"Dump.exe",它将创建一个"Dump_.exe",此外OEP也被修正。
(13)生成的文件可以跨平台运行。
在Import REConstructor v1.4.2+ 的 Attach to an Active Process 窗口中选取加壳程序的进程,有2个进程选上面的一个,然后在下方的oep处填入000BA697,点IAI AutoSearch,再点Get Imports,然后点 Auto Trace,然后点看还有多少地址是NO,剩下的事就是手动找这些函数了.
hying大哥说过 CreateEventW GetStringTypeA 如果发现这两个函数连续在一起的话,上面一个该改为GetStringTypeW 手工修复修入表后,程序应能运行了,好像也就不用注册了,因为注册部分在壳中,壳脱了注册也就不用了.这程序的输入表我是手工找到一部分,然后参照hying大哥给我的Konvertor 3.12A的输入表修复的.先用importREC试试,输入我们找到的正确的OEP: 004BA697,注意输入004BA697-00400000=000BA697有很多指针无效。
这里现不要bpx GetModuleHandleA,否则会被发现的,我想可能在unpack前程序会检测,所以要是能在程序开始unpack后再设断多好,怎么做呢,这样,先bpx SetProcessWorkingSetSize
断下来之后再bpx GetModuleHandleA按F12没几次就到了如下
001B:01085B86 FF15AC800A01 CALL [KERNEL32!GetModuleHandleA]
001B:01085B8C 394508 CMP [EBP+08],EAX
001B:01085B8F 7507 JNZ 01085B98
001B:01085B91 B968B40A01 MOV ECX,010AB468
001B:01085B96 EB52 JMP 01085BEA
001B:01085B98 393D68BA0A01 CMP [010ABA68],EDI
001B:01085B9E B968BA0A01 MOV ECX,010ABA68
001B:01085BA3 0F8491000000 JZ &nbs, p; 01085C3A ======>magic jump!
001B:01085BA9 8B35581C0B01 MOV ESI,[010B1C58]
001B:01085BAF A1085D0B01 MOV EAX,[010B5D08]
001B:01085BB4 F6410801 TEST BYTE PTR [ECX+08],01
001B:01085BB8 740E JZ 01085BC8
001B:01085BBA 8B507C MOV EDX,[EAX+7C]
001B:01085BBD 335070 XOR <, /SPAN>EDX,[EAX+70]
001B:01085BC0 33501C XOR EDX,[EAX+1C]
001B:01085BC3 F6C280 TEST DL,80
001B:01085BC6 7513 JNZ 01085BDB
001B:01085BC8 8B507C , , MOV EDX,[EAX+7C]
001B:01085BCB 335078 XOR EDX,[EAX+78]
001B:01085BCE 335068 XOR EDX,[EAX+68]
001B:01085BD1 335004 XOR EDX,[EAX+04]
001B:01085BD4 3316 XOR EDX,[ESI]
001B:01085BD6 395508 CMP [EBP+08],EDX
001B:01085BD9 740C JZ 01085BE7
001B:01085BDB 83C10C ADD ECX,0C
001B:01085BDE 83C604 ADD ESI,04
001B:01085BE1 3939 CMP [ECX],EDI
001B:01085BE3 75CF JNZ 01085BB4
这里面有几个跳转,其中最后一个01085BB4是往上跳的.我们看一个就可发现:
001B:01085BA3 0F8491000000 JZ 01085C3A,这个跳正好可跳出这个循环.只要改这个跳,就不会破坏引入表了. 再来, 注意刚回到那段代码时,就下a 01085BA3 将JZ 01085C3A改成JMP 01085C3A,清除所有断点,按F5运行,程序运行后打开importREC,选中程序(注意选择上面那个进程),入口填入OEP: 004BA697 ,-->RVA005AC000 SIZE00000214-->获得输入信息",如图

如果还有无效的大可放心的cut,因为它们本来就不是有用指针了.然后修复脱壳后的文件.OK,大功告成.脱壳后的程序,运行正常,圆满成功. 上一页 1 2 3 |