125243102 发表于 2009-11-4 11:04:32

WinLicense 1.8.5.5 加壳之棋天大圣2.6高级版主程序脱壳

作者:8100303
转贴自:一蓑烟雨

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

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

[ - ]CODE:
0044607B   CC         int3
0044607C   CC         int3
0044607D   CC         int3
0044607E   CC         int3
0044607F   CC         int3
00446080   D06F 99       shr   byte ptr , 1
00446083   828F 4FDDFC10 4>or   byte ptr , 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:, dx
00446098   DB1A         fistp   dword ptr
0044609A   B1 28       mov   cl, 28
0044609C   CA CC85       retf   85CC
0044609F   19AE 96061618   sbb   dword ptr , 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 , ecx
004460B1   A1 08745500   mov   eax, dword ptr
004460B6   C1E8 08       shr   eax, 8
很明显。oep是 00446080 ,部分代码被抽掉。
用 lordpe 把程序 dump 出来,Imprec 1.6F 修复 IAT。
第二步修复 OEP
找一个没有加壳的程序,如果你没有我这个程序,有个 1.0 测试版可以参考。
我这个程序 OEP 如下:

[ - ]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:
00435A95 |. 50             push   eax
00435A96 |. 64:8925 00000000   mov   dword ptr fs:, 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 , esp
00435AA6 |. FF15 E8A55000   call   dword ptr [<&KERNEL32.GetVers>; kernel32.GetVersion
00435AAC |. A3 DC3F5400       mov   dword ptr , eax
00435AB1 |. A1 DC3F5400       mov   eax, dword ptr
00435AB6 |. C1E8 08         shr   eax, 8
00435AB9 |. 25 FF000000       and   eax, 0FF
关键是两句push 语句和那个 GetVersion 函数 call。
看一下没有加壳的程序push 地址的数据:
第一句:

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

[ - ]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
0043AAA6 |. 8B45 08   mov   eax, dword ptr
0043AAA9 |. F740 04 06000>test   dword ptr , 6
结合相邻地址数据查找特征码,不同的程序是不同的,不过这个地址的数据都是 FFFFFFFF,:

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

[ - ]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 区域找到所需函数地址:

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

[ - ]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:
00446095   50         push   eax
00446096   64:8925 0000000>mov   dword ptr fs:, 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 , esp
004460A6   FF15 E8B55100   call   dword ptr ; kernel32.GetVersion
004460AC   A3 08745500   mov   dword ptr , eax
第三步干掉SDK
保存后,程序不能运行,原因是运用了壳的 SDK ,这个程序仅仅是利用 SDK 获取机器码,载入脱壳后程序,在 WinLicen 区段下F2断点,运行,中断在下面:

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

[ - ]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
找到返回的地方:

[ - ]CODE:
00489C8C   E8 52FBFFFF   call   004897E3
00489C91   83C4 08       add   esp, 8
00489C94   8945 FC       mov   dword ptr , eax
00489C97   837D FC 00   cmp   dword ptr , 0
00489C9B   74 10       je   short 00489CAD         ;这里直接改jmp
00489C9D   8B4D FC       mov   ecx, dword ptr
00489CA0   8B11         mov   edx, dword ptr
00489CA2   8B4D FC       mov   ecx, dword ptr
00489CA5   FF92 C4000000   call   dword ptr
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个排列紧密,只要把最后一个区段单独出来即可实现文件大小优化,如果你非得把所有区段都弄出来,我也没意见。
第五步破解
页: [1]
查看完整版本: WinLicense 1.8.5.5 加壳之棋天大圣2.6高级版主程序脱壳