|
![]() | 作者: yongmin [yongmin]
![]() |
登录 |
作者: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个排列紧密,只要把最后一个区段单独出来即可实现文件大小优化,如果你非得把所有区段都弄出来,我也没意见。 第五步破解 略。 |
地主 发表时间: 07-05-17 10:38 |
|
20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon
粤ICP备05087286号