WPE|52wpe|我爱WPE

 找回密码
 注册会员
搜索
  • 2266查看
  • 0回复

主题

好友

604

积分

高级会员

发表于 2009-11-4 11:04:32 |显示全部楼层
作者: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个排列紧密,只要把最后一个区段单独出来即可实现文件大小优化,如果你非得把所有区段都弄出来,我也没意见。
第五步破解

快速发帖

您需要登录后才可以回帖 登录 | 注册会员

手机版|Archiver|WPE|52wpe|我爱WPE ( 闽ICP备15009081号 )

GMT+8, 2024-5-4 11:35 , Processed in 0.054702 second(s), 16 queries .

返回顶部