飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 12667|回复: 14

[原创] Image To PDF v2.6.0 2005 脱壳+修复+算法分析

[复制链接]
  • TA的每日心情
    开心
    2024-8-15 13:22
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2010-1-7 16:36:58 | 显示全部楼层 |阅读模式
    到OEP:

    这里只介绍Aspack壳到OEP的三种方法:

    ASPack 2.12 -> Alexey Solodovnikov

    第一种方法:

    00537001 >  60              pushad                                   ; //壳的入口点!F8单步!
    00537002    E8 03000000     call    0053700A                         ; //在这里F8单步程序会运行起来(俗称:跑飞),所以我们F7跟进CALL!
    00537007  - E9 EB045D45     jmp     45B074F7
    0053700C    55              push    ebp
    0053700D    C3              retn
    0053700E    E8 01000000     call    00537014                         ; //在这里F8单步程序会运行起来(俗称:跑飞),所以我们F7跟进CALL!
    -----------------------------------------------------------------------------------------
    00537140  ^\EB EB           jmp     short 0053712D                   ; //不能让它往回跳!
    00537142    8B06            mov     eax, dword ptr [esi]             ; //在这里断点→运行到选定位置(F4)
    00537144    EB 00           jmp     short 00537146
    00537146    803E 1F         cmp     byte ptr [esi], 1F
    00537149  ^ 75 F3           jnz     short 0053713E                   ; //对于跳转没有实现的我们不必理会!
    0053714B    24 00           and     al, 0                            ; //跳转实现与否可以看箭头是什么颜色的(红色:实现,灰色:未实现)
    0053714D    C1C0 18         rol     eax, 18                          ; //也可以看信息窗口的提示!
    -----------------------------------------------------------------------------------------

    这种方法称为“单步法”,初学不要嫌麻烦,慢慢来,基础要扎实进步才快!

    ═════════════════════════════════════════════

    第二种方法:

    00537001 >  60              pushad                                   ; //壳的入口点!
    00537002    E8 03000000     call    0053700A
    00537007  - E9 EB045D45     jmp     45B074F7
    0053700C    55              push    ebp
    0053700D    C3              retn

    Ctrl+S:popad
    然后Ctrl+L查找下一处,直到:

    005373A9    8985 A8030000   mov     dword ptr [ebp+3A8], eax         ; //下面这就是Aspack壳的出口点的标志!
    005373AF    61              popad                                    ; //壳的出口点!Ctrl+L三次之后来到这里!
    005373B0    75 08           jnz     short 005373BA                   ; //这个跳转实现
    005373B2    B8 01000000     mov     eax, 1
    005373B7    C2 0C00         retn    0C
    005373BA    68 00000000     push    0
    005373BF    C3              retn                                     ; //在这里F2下断,然后F9运行到这里,再F8就会跳向程序OEP!

    由于Aspack壳比较简单,因为壳有入口点(pushad)和出口点(popad),利用壳的这个特点我们可以直接查找popad来找到壳的出口点,然后最后的retn就是返回到程序入口点(OEP)的,这种方法叫“一步到位法”,只适用于特别简单的压缩壳!

    ═════════════════════════════════════════════

    第三种方法:ESP定律法(堆栈平衡原理),在此感谢fly大侠!

    F8运行一步,寄存器ESP变红,在ESP上面点击右键,数据窗口中跟随,在第一行上面点击右键,断点,硬件访问,word,然后F9运行,断下来后取消硬件访问断点,F8单步到OEP;
    快速方法:F8,在命令行下hr esp断点,回车,F9运行,断下来后取消硬件访问断点,F8单步到OEP;

    Borland C++ 1999

    脱壳后程序能正常运行的话就说明脱壳成功了!

    下一个教程主讲脱壳修复,现在我们的目标是到达程序OEP就行了!

    三种方法演示完了,会了吗?

    由于附件太大,上传到千脑了,
    本部分动画教程下载:
    http://down.qiannao.com/space/fi ... 5-5230OEP.rar/.page
    -------------------------------------------------------------------------------------------------------

    ====脱壳+修复====

    手动查找IAT:

    具体看操作,我就不多打字了,

    004014A0   /EB 10           jmp     short 004014B2                   ; 程序OEP!
    004014A2   |66:623A         bound   di, dword ptr [edx]
    004014A5   |43              inc     ebx
    004014A6   |2B2B            sub     ebp, dword ptr [ebx]
    004014A8   |48              dec     eax
    004014A9   |4F              dec     edi
    004014AA   |4F              dec     edi
    004014AB   |4B              dec     ebx
    004014AC   |90              nop
    004014AD  -|E9 98904D00     jmp     008DA54A
    004014B2   \A1 8B904D00     mov     eax, dword ptr [4D908B]
    004014B7    C1E0 02         shl     eax, 2
    004014BA    A3 8F904D00     mov     dword ptr [4D908F], eax
    004014BF    52              push    edx
    004014C0    6A 00           push    0                                ; F7跟进下面的CALL
    004014C2    E8 4D620D00     call    004D7714                         ; jmp 到 kernel32.GetModuleHandleA

    头:004EE308  7C809BE7  kernel32.CloseHandle
    尾:004EEFF8  770F4950  oleaut32.VariantInit

    OEP= 004014A0-00400000=14A0
    RVA= 004EE308-00400000=EE308
    Size=004EEFF8-004EE308=CF0

    注意:这里的减法用十六进制!!!

    Borland C++ 1999

    脱壳后程序正常运行,脱壳成功!

    本部分动画教程下载:
    http://down.qiannao.com/space/fi ... 4fee-590d.rar/.page
    -------------------------------------------------------------------------------------------------------
    Image To PDF v2.6.0 2005算法分析

    下载地址:http://www.skycn.com/soft/14828.html

    这个软件下载的时候,天空上面写的是Image To PDF V3.0 版本的,分析完以后才发现是2.6版本的,⊙﹏⊙b汗!

    试炼信息:

    用户名:[email protected]
    注册码:1234567890abcdef

    点击OK弹出错误提示框:Series number error,please check it and try again.

    下消息框断点:bp MessageBoxA,断下来后,Alt+F9返回到关键位置,然后找到段首下断点开始分析:

    经分析调整假注册信息:
    ABCDEFGHIJKLMNOP
    再次调整:
    ABCDEFGHIBKLMNYP

    42H=B
    59H=Y
    B+Y=9B
    ==================================================================================================
    0040DC9A  |.  E8 89530600   call    00473028
    0040DC9F  |.  66:C747 10 08>mov     word ptr [edi+10], 8
    0040DCA5  |.  837D FC 00    cmp     dword ptr [ebp-4], 0             ;  //用户名与0比较
    0040DCA9  |.  8D4D B4       lea     ecx, dword ptr [ebp-4C]
    0040DCAC  |.  74 05         je      short 0040DCB3                   ;  //相等则跳
    0040DCAE  |.  8B55 FC       mov     edx, dword ptr [ebp-4]
    0040DCB1  |.  EB 03         jmp     short 0040DCB6
    0040DCB3  |>  8D56 1C       lea     edx, dword ptr [esi+1C]
    0040DCB6  |>  8BC3          mov     eax, ebx
    0040DCB8  |.  E8 DF030000   call    0040E09C
    0040DCBD  |.  837D F8 00    cmp     dword ptr [ebp-8], 0             ;  //假注册码与0比较
    0040DCC1  |.  74 05         je      short 0040DCC8                   ;  //相等则跳
    0040DCC3  |.  8B55 F8       mov     edx, dword ptr [ebp-8]
    0040DCC6  |.  EB 03         jmp     short 0040DCCB
    0040DCC8  |>  8D56 1D       lea     edx, dword ptr [esi+1D]
    0040DCCB  |>  8BC3          mov     eax, ebx
    0040DCCD  |.  E8 AA060000   call    0040E37C                         ;  //关键CALL
    0040DCD2  |.  84C0          test    al, al
    0040DCD4  |.  0F85 97000000 jnz     0040DD71                         ;  //关键跳转,F7跟进分析
    0040DCDA  |.  6A 10         push    10
    0040DCDC  |.  837D F8 00    cmp     dword ptr [ebp-8], 0
    0040DCE0  |.  74 05         je      short 0040DCE7
    0040DCE2  |.  8B4D F8       mov     ecx, dword ptr [ebp-8]
    0040DCE5  |.  EB 03         jmp     short 0040DCEA
    0040DCE7  |>  8D4E 1E       lea     ecx, dword ptr [esi+1E]
    0040DCEA  |>  51            push    ecx
    0040DCEB  |.  8D45 B4       lea     eax, dword ptr [ebp-4C]          ;  //注册码以明码出现!
    0040DCEE  |.  50            push    eax
    0040DCEF  |.  E8 BCDA0B00   call    004CB7B0                         ;  //关键CALL
    0040DCF4  |.  83C4 0C       add     esp, 0C
    0040DCF7  |.  85C0          test    eax, eax
    0040DCF9  |.  74 76         je      short 0040DD71                   ;  //关键跳转
    0040DCFB  |.  66:C747 10 2C>mov     word ptr [edi+10], 2C
    0040DD01  |.  8D56 1F       lea     edx, dword ptr [esi+1F]
    0040DD04  |.  8D45 F4       lea     eax, dword ptr [ebp-C]
    0040DD07  |.  E8 D88E0C00   call    004D6BE4
    0040DD0C  |.  FF47 1C       inc     dword ptr [edi+1C]
    0040DD0F  |.  8B10          mov     edx, dword ptr [eax]
    0040DD11  |.  8B83 14050000 mov     eax, dword ptr [ebx+514]
    0040DD17  |.  E8 3C530600   call    00473058
    0040DD1C  |.  FF4F 1C       dec     dword ptr [edi+1C]
    0040DD1F  |.  8D45 F4       lea     eax, dword ptr [ebp-C]
    0040DD22  |.  BA 02000000   mov     edx, 2
    0040DD27  |.  E8 18900C00   call    004D6D44
    0040DD2C  |.  6A 10         push    10
    0040DD2E  |.  8D4E 60       lea     ecx, dword ptr [esi+60]
    0040DD31  |.  51            push    ecx
    0040DD32  |.  8D46 2D       lea     eax, dword ptr [esi+2D]
    0040DD35  |.  50            push    eax
    0040DD36  |.  8BC3          mov     eax, ebx
    0040DD38  |.  E8 FFB90600   call    0047973C                         ;  //下面的CALL调用错误提示框
    0040DD3D  |.  50            push    eax                              ; |hOwner
    0040DD3E  |.  E8 8DA10C00   call    <jmp.&user32.MessageBoxA>        ; \MessageBoxA
    0040DD43  |.  FF4F 1C       dec     dword ptr [edi+1C]               ;  //返回到这里!
    ==================================================================================================
    跟进第一个关键CALL来到这里:

    0040E37C  /$  56            push    esi
    0040E37D  |.  8BF2          mov     esi, edx                         ;  //EDX=ESI
    0040E37F  |.  85F6          test    esi, esi                         ;  //比较ESI
    0040E381  |.  75 04         jnz     short 0040E387                   ;  //相等则跳
    0040E383  |.  33C0          xor     eax, eax
    0040E385  |.  5E            pop     esi
    0040E386  |.  C3            retn
    0040E387  |>  803E 00       cmp     byte ptr [esi], 0                ;  //假码第一位与0比较
    0040E38A  |.  75 04         jnz     short 0040E390                   ;  //不等则跳
    0040E38C  |.  33C0          xor     eax, eax
    0040E38E  |.  5E            pop     esi
    0040E38F  |.  C3            retn
    0040E390  |>  56            push    esi
    0040E391  |.  E8 12D20B00   call    004CB5A8
    0040E396  |.  59            pop     ecx                              ;  //假码位数放入EAX
    0040E397  |.  83F8 10       cmp     eax, 10                          ;  //比较注册码是不是10H(16位)
    0040E39A  |.  74 04         je      short 0040E3A0                   ;  //相等则跳
    0040E39C  |.  33C0          xor     eax, eax
    0040E39E  |.  5E            pop     esi
    0040E39F  |.  C3            retn
    0040E3A0  |>  33D2          xor     edx, edx                         ;  //EDX清零
    0040E3A2  |.  8BC6          mov     eax, esi                         ;  //ESI=EAX
    0040E3A4  |>  0FBE08        /movsx   ecx, byte ptr [eax]             ;  //逐位取假码转换成ASCII值放入ECX
    0040E3A7  |.  83F9 41       |cmp     ecx, 41                         ;  //ECX与41H(A)则跳转
    0040E3AA  |.  7C 05         |jl      short 0040E3B1
    0040E3AC  |.  83F9 5A       |cmp     ecx, 5A                         ;  //ECX与5AH(Z)则跳转
    0040E3AF  |.  7E 04         |jle     short 0040E3B5
    0040E3B1  |>  33C0          |xor     eax, eax                        ;  //EAX清零
    0040E3B3  |.  5E            |pop     esi
    0040E3B4  |.  C3            |retn
    0040E3B5  |>  42            |inc     edx                             ;  //EDX+1
    0040E3B6  |.  40            |inc     eax                             ;  //逐位验证假码
    0040E3B7  |.  83FA 10       |cmp     edx, 10                         ;  //EDX与10H比较
    0040E3BA  |.^ 7C E8         \jl      short 0040E3A4
    0040E3BC  |.  0FBE56 09     movsx   edx, byte ptr [esi+9]            ;  //注册码第10位=EDX
    0040E3C0  |.  0FBE4E 0E     movsx   ecx, byte ptr [esi+E]            ;  //注册码第15位=ECX
    0040E3C4  |.  03D1          add     edx, ecx                         ;  //ECX+EDX结果存入EDX
    0040E3C6  |.  81FA 9B000000 cmp     edx, 9B                          ;  //EDX与9BH相比较
    0040E3CC  |.  74 04         je      short 0040E3D2                   ;  //相等则跳
    0040E3CE  |.  33C0          xor     eax, eax                         ;  //EAX清零
    0040E3D0  |.  5E            pop     esi
    0040E3D1  |.  C3            retn
    0040E3D2  |>  B0 01         mov     al, 1                            ;  //al=1
    0040E3D4  |.  5E            pop     esi
    0040E3D5  \.  C3            retn
    ==================================================================================================
    算法总结:
    1.用户名不参加计算;
    2.注册码必须是10H(16)位;
    3.假码第一位不能为0;
    4.A≤注册码≤Z,按照ASCII表顺序;
    5.注册码第10位+注册码第15位=9B;

    一组可用注册码:
    E-mail:[email protected]
    Serial:ABCDEFGHIBKLMNYP

    注册信息保存在程序安装目录下的setup.ini里面,格式如下:
    [Public]
    SrcPath=
    [Register]
    [email protected]
    Serial=ABCDEFGHIBKLMNYP

    如果不是按照上面的算法分析的话,这里有一组通用注册码:55J8TNJVL9F1VP9K
    程序有两处跳转跳向注册成功,所以有两种方法!

    看来作者准备了两手哈……

    不会编程,没法写注册机,遗憾……

    [ 本帖最后由 樊盟 于 2010-1-7 17:12 编辑 ]
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-3 23:07
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2010-1-7 16:41:28 | 显示全部楼层
    不错,写得很详细,学习学习
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-8-15 13:22
  • 签到天数: 8 天

    [LV.3]偶尔看看II

     楼主| 发表于 2010-1-7 16:58:44 | 显示全部楼层

    回复 2# 月之精灵 的帖子

    谢谢月之精灵斑斑,小菜鸟会继续努力的!:loveliness:
    PYG19周年生日快乐!
  • TA的每日心情

    2017-6-17 16:59
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2010-1-7 17:00:44 | 显示全部楼层
    又有新的知识被吸收。。谢谢楼主哈
    PYG19周年生日快乐!
  • TA的每日心情

    2015-11-21 19:12
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2010-1-7 18:12:28 | 显示全部楼层
    牛人 适合我这样的新手 UP/:good
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2020-7-16 11:27
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    发表于 2010-1-7 21:30:57 | 显示全部楼层
    学习了,/:good
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2015-10-9 11:25
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2010-1-9 20:19:38 | 显示全部楼层
    学习了,谢谢
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-5-1 14:44
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2010-1-9 21:27:20 | 显示全部楼层
    很厉害!!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    前天 10:56
  • 签到天数: 1696 天

    [LV.Master]伴坛终老

    发表于 2010-1-9 22:14:40 | 显示全部楼层
    最新版通用注册码不行,楼主提供的可以。
    PYG19周年生日快乐!
  • TA的每日心情

    2016-6-2 20:34
  • 签到天数: 10 天

    [LV.3]偶尔看看II

    发表于 2010-1-10 00:45:44 | 显示全部楼层
    写得很细,应该花了不少时间,支持/:good
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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