飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5348|回复: 15

[原创] PECompact 2.X 脱壳后输入表修复+视频教程

[复制链接]
  • TA的每日心情
    慵懒
    2018-4-24 11:02
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-4-25 00:31:23 | 显示全部楼层 |阅读模式
    ----------------------------------------------------------------
    [ 破文标题 ] PECompact 2.X 脱壳后输入表修复
    [ 破文作者 ] zgmap
    [ 破解工具 ] OD,IR,LordPE
    [ 破解平台 ] Windows XP SP3
    [ 软件名称 ] Total Video Converter 3.21 汉化版
    [ 软件大小 ] RAR压缩11.3 MB
    [ 原版下载 ] http://down.huacolor.com/down/zgmap/totalvideoconverter.rar
    [ 保护方式 ] PECompact 2.X
    [ 软件简介 ] 视频转换工具
    [ 破解声明 ] 菜鸟学习阶段中,脱壳接触时间不长,也算不上脱文...
    [ 破解过程 ]------------------------------------------------
    这个软件的主程序主要是用了PECompact的插件来进行保护,一般的脱壳方式是不适用的,下面我将采用两种方法来进行脱壳处理:

    第一种方法是寻找magic jump,避开IAT加密:
    OD设置忽略所有异常,载入程序:

    00401000 >  B8 38AB7D00     MOV EAX,tvc.007DAB38
    00401005    50              PUSH EAX
    00401006    64:FF35 0000000>PUSH DWORD PTR FS:[0]
    0040100D    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
    00401014    33C0            XOR EAX,EAX
    00401016    8908            MOV DWORD PTR DS:[EAX],ECX
    00401018    50              PUSH EAX


    。。。。。。。。。。

    bp VirtualFree下断,F9一次,断在:

    7C809B84 >  8BFF            MOV EDI,EDI
    7C809B86    55              PUSH EBP
    7C809B87    8BEC            MOV EBP,ESP
    7C809B89    FF75 10         PUSH DWORD PTR SS:[EBP+10]
    7C809B8C    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
    7C809B8F    FF75 08         PUSH DWORD PTR SS:[EBP+8]
    7C809B92    6A FF           PUSH -1
    7C809B94    E8 09000000     CALL kernel32.VirtualFreeEx
    7C809B99    5D              POP EBP
    7C809B9A    C2 0C00         RETN 0C


    。。。。。。。。。。

    不取消断点,alt+F9返回:

    003A0A91    5F              POP EDI                                  ; 00D288EE
    003A0A92    8BC6            MOV EAX,ESI
    003A0A94    5E              POP ESI
    003A0A95    5D              POP EBP
    003A0A96    5B              POP EBX
    003A0A97    83C4 10         ADD ESP,10
    003A0A9A    C2 0C00         RETN 0C


    。。。。。。。。。。

    Ctrl+B查找二进制字符串:89 02
    来到:

    003A143D    50              PUSH EAX
    003A143E    FF75 FC         PUSH DWORD PTR SS:[EBP-4]
    003A1441    FF93 4D1F0010   CALL DWORD PTR DS:[EBX+10001F4D]           ;magic call,F2断下,F9一次运行断在此处,取消断点后F7进入
    003A1447    5A              POP EDX
    003A1448    85C0            TEST EAX,EAX
    003A144A  ^ 0F84 6FFFFFFF   JE 003A13BF
    003A1450    8906            MOV DWORD PTR DS:[ESI],EAX
    003A1452    8902            MOV DWORD PTR DS:[EDX],EAX
    003A1454    83C2 04         ADD EDX,4
    003A1457    83C6 04         ADD ESI,4
    003A145A  ^ EB AC           JMP SHORT 003A1408
    003A145C    33C0            XOR EAX,EAX
    003A145E    5E              POP ESI
    003A145F    5F              POP EDI
    003A1460    5B              POP EBX
    003A1461    C9              LEAVE
    003A1462    C2 1000         RETN 10


    。。。。。。。。。。

    F7进入后,来到:

    003A00F1    55              PUSH EBP
    003A00F2    8BEC            MOV EBP,ESP
    003A00F4    83C4 FC         ADD ESP,-4
    003A00F7    53              PUSH EBX
    003A00F8    57              PUSH EDI
    003A00F9    56              PUSH ESI
    003A00FA    E8 00000000     CALL 003A00FF
    003A00FF    5B              POP EBX
    003A0100    81EB 0C119400   SUB EBX,94110C
    003A0106    8B45 08         MOV EAX,DWORD PTR SS:[EBP+8]
    003A0109    40              INC EAX
    003A010A    75 18           JNZ SHORT 003A0124
    003A010C    8B75 0C         MOV ESI,DWORD PTR SS:[EBP+C]
    003A010F    81FE FFFF0000   CMP ESI,0FFFF
    003A0115    76 0D           JBE SHORT 003A0124
    003A0117    8D83 A0119400   LEA EAX,DWORD PTR DS:[EBX+9411A0]
    003A011D    5E              POP ESI
    003A011E    5F              POP EDI
    003A011F    5B              POP EBX
    003A0120    C9              LEAVE
    003A0121    C2 0C00         RETN 0C
    003A0124    FF75 10         PUSH DWORD PTR SS:[EBP+10]
    003A0127    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
    003A012A    FF75 08         PUSH DWORD PTR SS:[EBP+8]
    003A012D    FF93 29109400   CALL DWORD PTR DS:[EBX+941029]
    003A0133    3B83 41109400   CMP EAX,DWORD PTR DS:[EBX+941041]             ;对函数GetProAddress进行加密
    003A0139    75 06           JNZ SHORT 003A0141                            ;magic jump  改为jmp                                                      
    003A013B    8D83 55119400   LEA EAX,DWORD PTR DS:[EBX+941155]
    003A0141    5E              POP ESI
    003A0142    5F              POP EDI
    003A0143    5B              POP EBX
    003A0144    C9              LEAVE
    003A0145    C2 0C00         RETN 0C


    。。。。。。。。。。

    Ctrl+B查找二进制字符串75 06,注意要勾选整个块:

    003A0178    FF93 2D109400   CALL DWORD PTR DS:[EBX+94102D]
    003A017E    3B83 41109400   CMP EAX,DWORD PTR DS:[EBX+941041]
    003A0184    75 06           JNZ SHORT 003A018C                            ;这里改为jmp
    003A0186    8D83 55119400   LEA EAX,DWORD PTR DS:[EBX+941155]
    003A018C    5E              POP ESI
    003A018D    5F              POP EDI
    003A018E    5B              POP EBX
    003A018F    C9              LEAVE
    003A0190    C2 0400         RETN 4


    。。。。。。。。。。

    两处改完后F9运行,停在:

    7C809B84 >  8BFF            MOV EDI,EDI                              ; tvc.00400000
    7C809B86    55              PUSH EBP
    7C809B87    8BEC            MOV EBP,ESP
    7C809B89    FF75 10         PUSH DWORD PTR SS:[EBP+10]
    7C809B8C    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
    7C809B8F    FF75 08         PUSH DWORD PTR SS:[EBP+8]
    7C809B92    6A FF           PUSH -1
    7C809B94    E8 09000000     CALL kernel32.VirtualFreeEx
    7C809B99    5D              POP EBP
    7C809B9A    C2 0C00         RETN 0C


    。。。。。。。。。。

    取消断点,alt+F9返回:

    003A0DAF    8B46 0C         MOV EAX,DWORD PTR DS:[ESI+C]                  ;F8单步走
    003A0DB2    03C7            ADD EAX,EDI
    003A0DB4    5D              POP EBP
    003A0DB5    5E              POP ESI
    003A0DB6    5F              POP EDI
    003A0DB7    5B              POP EBX
    003A0DB8    C3              RETN


    。。。。。。。。。。

    007DABD8    8985 3F130010   MOV DWORD PTR SS:[EBP+1000133F],EAX      ; tvc.00491AEE
    007DABDE    8BF0            MOV ESI,EAX
    007DABE0    8B4B 14         MOV ECX,DWORD PTR DS:[EBX+14]
    007DABE3    5A              POP EDX
    007DABE4    EB 0C           JMP SHORT tvc.007DABF2
    007DABE6    03CA            ADD ECX,EDX
    007DABE8    68 00800000     PUSH 8000
    007DABED    6A 00           PUSH 0
    007DABEF    57              PUSH EDI
    007DABF0    FF11            CALL DWORD PTR DS:[ECX]
    007DABF2    8BC6            MOV EAX,ESI
    007DABF4    5A              POP EDX
    007DABF5    5E              POP ESI
    007DABF6    5F              POP EDI
    007DABF7    59              POP ECX
    007DABF8    5B              POP EBX
    007DABF9    5D              POP EBP
    007DABFA    FFE0            JMP EAX                                              ;跳向OEP


    。。。。。。。。。。

    00491AEE    55              PUSH EBP
    00491AEF    8BEC            MOV EBP,ESP
    00491AF1    6A FF           PUSH -1
    00491AF3    68 E8A84E00     PUSH tvc.004EA8E8
    00491AF8    68 E81A4900     PUSH tvc.00491AE8                                     ; JMP 到 msvcrt._except_handler3
    00491AFD    64:A1 00000000  MOV EAX,DWORD PTR FS:[0]
    00491B03    50              PUSH EAX
    00491B04    64:8925 0000000>MOV DWORD PTR FS:[0],ESP
    00491B0B    83EC 68         SUB ESP,68
    00491B0E    53              PUSH EBX


    。。。。。。。。。。

    剩下的就是用LordPE完整dump程序,IR修复,函数全部有效,修复后的程序可以运行




    第二种方法是采用普通脱壳方式来寻找OEP,主要讲一下如何找回无效函数:

    依然是OD设置忽略所有异常,载入程序,我们可以用ESP定律或者push   8000等方法都能来到OEP,这些我就不展开讲了
    到了OEP以后,LordPE dump,IR修复,发现有一个无效函数, 1、3级追踪是回不来的,cut掉以后发现程序无法运行,因为你把有用的函数给干掉了,只好手动修复,先看一下我们那个无效函数是什么:


    加基址后应该是4CA198,这个函数该如何去找?我们可以想个办法,先看一下有效的函数是如何出来的
    OD从新载入程序,先以这个无效函数的下面那个函数为例(也就是4CA19C)
    命令行输入:dd 4CA19C
    然后在数据窗口中右键下内存访问断点,F9运行,第13次后来到(要注意每次F9以后等待的时间长短不一,有时会有一点点卡):

    003A1450    8906            MOV DWORD PTR DS:[ESI],EAX               ; kernel32.LoadLibraryA
    003A1452    8902            MOV DWORD PTR DS:[EDX],EAX
    003A1454    83C2 04         ADD EDX,4
    003A1457    83C6 04         ADD ESI,4
    003A145A  ^ EB AC           JMP SHORT 003A1408
    003A145C    33C0            XOR EAX,EAX
    003A145E    5E              POP ESI
    003A145F    5F              POP EDI
    003A1460    5B              POP EBX
    003A1461    C9              LEAVE
    003A1462    C2 1000         RETN 10


    。。。。。。。。。。

    这时注意观察一下反汇编窗口和寄存器窗口,可以看出4CA19C的函数为kernel32.LoadLibraryA:


    。。。。。。。。。。

    我们用同样的方式去找4CA198这个无效函数,到了这里以后却显示不出来,原因就是4CA198这个函数经过magic call以后已经被加密
    接着上面到达的地址003A1450,我们F8单步走

    003A1450    8906        MOV DWORD PTR DS:[ESI],EAX                                         ;F8单步
    003A1452    8902        MOV DWORD PTR DS:[EDX],EAX
    003A1454    83C2 04     ADD EDX,4
    003A1457    83C6 04     ADD ESI,4
    003A145A  ^ EB AC       JMP SHORT 003A1408                                                ;这里回跳


    。。。。。。。。。。

    来到:
    003A1408    C783 C21A0010 00000000   MOV DWORD PTR DS:[EBX+10001AC2],0            ;继续F8向下看
    003A1412    8B02                     MOV EAX,DWORD PTR DS:[EDX]
    003A1414    85C0                     TEST EAX,EAX
    003A1416    74 44                    JE SHORT 003A145C
    003A1418    52                       PUSH EDX
    003A1419    8983 C21A0010            MOV DWORD PTR DS:[EBX+10001AC2],EAX
    003A141F    A9 00000080              TEST EAX,80000000
    003A1424    74 09                    JE SHORT 003A142F
    003A1426    25 FFFFFF7F              AND EAX,7FFFFFFF
    003A142B    6A 00                    PUSH 0
    003A142D    EB 0E                    JMP SHORT 003A143D
    003A142F    8B4D 08                  MOV ECX,DWORD PTR SS:[EBP+8]
    003A1432    0341 08                  ADD EAX,DWORD PTR DS:[ECX+8]
    003A1435    33C9                     XOR ECX,ECX
    003A1437    66:8B08                  MOV CX,WORD PTR DS:[EAX]
    003A143A    51                       PUSH ECX
    003A143B    40                       INC EAX
    003A143C    40                       INC EAX
    003A143D    50                       PUSH EAX                                 ;这里寄存器中出现4CA19C下面那个函数(也就是4CA1A0)的正确API
    003A143E    FF75 FC                  PUSH DWORD PTR SS:[EBP-4]
    003A1441    FF93 4D1F0010            CALL DWORD PTR DS:[EBX+10001F4D]
    003A1447    5A                       POP EDX
    003A1448    85C0                     TEST EAX,EAX
    003A144A  ^ 0F84 6FFFFFFF            JE 003A13BF
                

    。。。。。。。。。。

    如此循环,到了003A143D以后显示出正确的API,这样的话我们就可以通过dd 4CA194(也就是无效函数上面的函数地址)下内存访问断点来找出4CA198真正的函数是什么:



    。。。。。。。。。。

    用IR修复的时候将无效函数改为: GetProAddress,保存,软件运行一切OK!


    -----------------------------------------------------------------------------------------------------
    感谢您能看完...

    视频教程下载地址http://down.huacolor.com/down/zgmap/PECompact 2.X 脱壳后输入表修复.rar

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?加入我们

    x
    PYG19周年生日快乐!
  • TA的每日心情
    奋斗
    昨天 12:53
  • 签到天数: 51 天

    [LV.5]常住居民I

    发表于 2009-4-25 08:53:17 | 显示全部楼层
    一大早来就看见好东西,学习了
    PYG19周年生日快乐!
  • TA的每日心情
    难过
    2020-12-1 20:31
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-5-10 08:21:48 | 显示全部楼层
    哦,我现在还是新手先支持一下
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-5-12 12:22:40 | 显示全部楼层
    我想看IAT加密分析部分   这两个特征码处找到没什么难  想具体分析过程   /:017
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2016-4-15 13:51
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2009-5-12 23:47:35 | 显示全部楼层
    支持下,学习了。不过怎么下不了了啊?

    [ 本帖最后由 hggg 于 2009-5-12 23:48 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-8-8 22:15
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    发表于 2009-6-16 18:09:05 | 显示全部楼层
    还是视频好看点
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-6-17 22:11:23 | 显示全部楼层
    支持下,学习中........
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-11-27 13:59:41 | 显示全部楼层
    支持下,学习中........
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-11-30 16:02:27 | 显示全部楼层
    学习一下,谢谢分享
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2009-12-14 20:33:29 | 显示全部楼层
    来支持下,向你学习
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表