飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 13051|回复: 7

[转贴] WinLicense 1.8.5.5 加壳之棋天大圣2.6高级版主程序脱壳。

[复制链接]

该用户从未签到

发表于 2007-5-17 09:50:08 | 显示全部楼层 |阅读模式
作者:8100303
转贴自:一蓑烟雨

名称:棋天大圣 2.6 高级版主程序
下载地址:自己找
加壳:WinLicense 1.8.5.5 sdk
工具:okdodo 的脚本,ollydbg 及相关插件,peid,lordpe,Imprec 1.6F,UltraEdit
说明:一点心得,不妥之处望批评指正
第一步:dump 并修复 IAT
运行脚本,停在这里:

[Copy to clipboard] [ - ]CODE:
004460B1    A1 08745500     mov     eax, dword ptr [557408]
004460B6    C1E8 08         shr     eax, 8
004460B9    25 FF000000     and     eax, 0FF
004460BE    A3 14745500     mov     dword ptr [557414], eax
004460C3    8B0D 08745500   mov     ecx, dword ptr [557408]
代码窗口向上看:

[Copy to clipboard] [ - ]CODE:
0044607B    CC              int3
0044607C    CC              int3
0044607D    CC              int3
0044607E    CC              int3
0044607F    CC              int3
00446080    D06F 99         shr     byte ptr [edi-67], 1
00446083    828F 4FDDFC10 4>or      byte ptr [edi+10FCDD4F], 44
0044608A    EC              in      al, dx
0044608B    73 62           jnb     short 004460EF
0044608D    BD E5851818     mov     ebp, 181885E5
00446092    35 BE1C7D56     xor     eax, 567D1CBE
00446097    6C              ins     byte ptr es:[edi], dx
00446098    DB1A            fistp   dword ptr [edx]
0044609A    B1 28           mov     cl, 28
0044609C    CA CC85         retf    85CC
0044609F    19AE 96061618   sbb     dword ptr [esi+18160696], ebp
004460A5    13E5            adc     esp, ebp
004460A7    9B              wait
004460A8    95              xchg    eax, ebp
004460A9    74 2C           je      short 004460D7
004460AB    898B 6614D982   mov     dword ptr [ebx+82D91466], ecx
004460B1    A1 08745500     mov     eax, dword ptr [557408]
004460B6    C1E8 08         shr     eax, 8
很明显。oep是 00446080 ,部分代码被抽掉。
用 lordpe 把程序 dump 出来,Imprec 1.6F 修复 IAT。
第二步修复 OEP
找一个没有加壳的程序,如果你没有我这个程序,有个 1.0 测试版可以参考。
我这个程序 OEP 如下:

[Copy to clipboard] [ - ]CODE:
00435A80 >/$  55                  push    ebp
00435A81  |.  8BEC                mov     ebp, esp
00435A83  |.  6A FF               push    -1
00435A85  |.  68 08855100         push    00518508
00435A8A  |.  68 98AA4300         push    0043AA98                      ;  SE 处理程序安装
00435A8F  |.  64:A1 00000000      mov     eax, dword ptr fs:[0]
00435A95  |.  50                  push    eax
00435A96  |.  64:8925 00000000    mov     dword ptr fs:[0], esp
00435A9D  |.  83C4 A4             add     esp, -5C
00435AA0  |.  53                  push    ebx
00435AA1  |.  56                  push    esi
00435AA2  |.  57                  push    edi
00435AA3  |.  8965 E8             mov     dword ptr [ebp-18], esp
00435AA6  |.  FF15 E8A55000       call    dword ptr [<&KERNEL32.GetVers>;  kernel32.GetVersion
00435AAC  |.  A3 DC3F5400         mov     dword ptr [543FDC], eax
00435AB1  |.  A1 DC3F5400         mov     eax, dword ptr [543FDC]
00435AB6  |.  C1E8 08             shr     eax, 8
00435AB9  |.  25 FF000000         and     eax, 0FF
关键是两句push 语句和那个 GetVersion 函数 call。
看一下没有加壳的程序push 地址的数据:
第一句:

[Copy to clipboard] [ - ]CODE:
005184FC  00000000
00518500  00000000
00518504  3FF00000
00518508  FFFFFFFF
第二句:

[Copy to clipboard] [ - ]CODE:
0043AA98  /$  55            push    ebp                              ;  结构异常处理程序
0043AA99  |.  8BEC          mov     ebp, esp
0043AA9B  |.  83EC 08       sub     esp, 8
0043AA9E  |.  53            push    ebx
0043AA9F  |.  56            push    esi
0043AAA0  |.  57            push    edi
0043AAA1  |.  55            push    ebp
0043AAA2  |.  FC            cld
0043AAA3  |.  8B5D 0C       mov     ebx, dword ptr [ebp+C]
0043AAA6  |.  8B45 08       mov     eax, dword ptr [ebp+8]
0043AAA9  |.  F740 04 06000>test    dword ptr [eax+4], 6
结合相邻地址数据查找特征码,不同的程序是不同的,不过这个地址的数据都是 FFFFFFFF,:

[Copy to clipboard] [ - ]CODE:
00 00 00 00 00 00 00 00 00 00 F0 3F FF FF FF FF
第二句处地址数据基本是固定的,好像c++的都是这样,比较好找。查找特征码:

[Copy to clipboard] [ - ]CODE:
55 8B EC 83 EC 08 53 56 57 55 FC 8B 5D 0C 8B 45 08 F7 40 04 06 00 00 00
据说随便弄俩地址或者 NOP 掉也行。
IAT 区域找到所需函数地址:

[Copy to clipboard] [ - ]CODE:
0051B5E8 >7C8111DA  kernel32.GetVersion
最后修复如下:

[Copy to clipboard] [ - ]CODE:
00446080 >  55              push    ebp
00446081    8BEC            mov     ebp, esp
00446083    6A FF           push    -1
00446085    68 30925200     push    00529230
0044608A    68 08B34400     push    0044B308
0044608F    64:A1 00000000  mov     eax, dword ptr fs:[0]
00446095    50              push    eax
00446096    64:8925 0000000>mov     dword ptr fs:[0], esp
0044609D    83C4 A4         add     esp, -5C
004460A0    53              push    ebx
004460A1    56              push    esi
004460A2    57              push    edi
004460A3    8965 E8         mov     dword ptr [ebp-18], esp
004460A6    FF15 E8B55100   call    dword ptr [51B5E8]; kernel32.GetVersion
004460AC    A3 08745500     mov     dword ptr [557408], eax
第三步干掉SDK
保存后,程序不能运行,原因是运用了壳的 SDK ,这个程序仅仅是利用 SDK 获取机器码,载入脱壳后程序,在 WinLicen 区段下F2断点,运行,中断在下面:

[Copy to clipboard] [ - ]CODE:
00853C47    68 4D160000     push    164D
00853C4C    891C24          mov     dword ptr [esp], ebx
00853C4F    89E3            mov     ebx, esp
00853C51    81C3 04000000   add     ebx, 4
00853C57    83EB 04         sub     ebx, 4
00853C5A    871C24          xchg    dword ptr [esp], ebx
00853C5D    5C              pop     esp
看堆栈数据:

[Copy to clipboard] [ - ]CODE:
0012F700   0040C569  返回到 0123_.0040C569 来自 0123_.00426B10
0012F704   00551ACC  0123_.00551ACC
0012F708   0012F784
0012F70C   00410DBD  返回到 0123_.00410DBD 来自 0123_.0040C570
0012F710   00489C70  0123_.00489C70
0012F714   00489CAB  返回到 0123_.00489CAB
0012F718   0012FE94
0012F71C  /0012F748
0012F720  |77D18734  返回到 USER32.77D18734
找到返回的地方:

[Copy to clipboard] [ - ]CODE:
00489C8C    E8 52FBFFFF     call    004897E3
00489C91    83C4 08         add     esp, 8
00489C94    8945 FC         mov     dword ptr [ebp-4], eax
00489C97    837D FC 00      cmp     dword ptr [ebp-4], 0
00489C9B    74 10           je      short 00489CAD                 ;这里直接改jmp
00489C9D    8B4D FC         mov     ecx, dword ptr [ebp-4]
00489CA0    8B11            mov     edx, dword ptr [ecx]
00489CA2    8B4D FC         mov     ecx, dword ptr [ebp-4]
00489CA5    FF92 C4000000   call    dword ptr [edx+C4]
00489CAB    EB 09           jmp     short 00489CB6
00489CAD    B8 01000000     mov     eax, 1
00489CB2    EB 02           jmp     short 00489CB6
00489CB4    33C0            xor     eax, eax
00489CB6    8BE5            mov     esp, ebp
00489CB8    5D              pop     ebp
00489CB9    C2 1000         retn    10
那个跳转的作用是判断是否加壳,如果没有加壳则不调用SDK获取机器码,如果已经加壳,则调用SDK获取机器码。
第四步优化
简单优化一下,把 WinLicen 的俩个区段删除,c++程序4个区段,前面3个排列紧密,只要把最后一个区段单独出来即可实现文件大小优化,如果你非得把所有区段都弄出来,我也没意见。
第五步破解
略。
第六步感谢所有直接或间接提供帮助的朋友。
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2017-10-10 17:24
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2007-5-17 10:09:01 | 显示全部楼层
    楼主转贴也要先留意一下本论坛有没此文章哦
    PYG19周年生日快乐!
  • TA的每日心情
    慵懒
    2018-6-6 15:51
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2007-5-17 11:55:42 | 显示全部楼层
    欢迎转好文,2楼兄弟说得对,稍注意一下!
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-5-17 20:17:40 | 显示全部楼层
    下棋作弊的软件啊 不知道引擎库怎么样 脱壳脱的好
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2022-10-19 14:02
  • 签到天数: 240 天

    [LV.8]以坛为家I

    发表于 2007-12-30 15:25:31 | 显示全部楼层
    好东东多转些来也不为过哈
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-30 16:03:14 | 显示全部楼层
    原帖由 crackforchina 于 2007-12-30 15:25 发表
    好东东多转些来也不为过哈


    看情况crackforchina准备大搞themida???
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-1-8 23:10:03 | 显示全部楼层
    真正的好东西,不得不佩服
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2008-9-24 17:34:24 | 显示全部楼层
    学习一下,强者啊,顶.
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

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