安全中国首页 > 文章中心 > 脱壳技术
 
安全中国网友投稿专用上传FTP空间:
Ftp服务器:www.anqn.com
Ftp端口:21
用户名:anqn
密 码:anqn.com
 

Armadillo v3.01标准加壳方式的脱壳--Konvertor V3.30(图)

更新时间:2008-5-13 0:16:53
责任编辑:果果龙
热 点:

第四步,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 

 
相关文章
一日一文章
 
一日一软件
一日一动画