【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg1.10C、PEiD、LordPE、ImportREC
设置Ollydbg忽略所有的异常选项。老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。
下断:HE GetModuleHandleA,Shift+F9运行,注意看堆栈:
0006BD14 00AA799B /CALL 到 GetModuleHandleA 来自 00AA7995
0006BD18 0006BE50 \pModule = "kernel32.dll"//返回
00AA799B 8B0D E011AD00 mov ecx,dword ptr ds:[AD11E0]
00AA79A1 89040E mov dword ptr ds:[esi+ecx],eax
00AA79A4 A1 E011AD00 mov eax,dword ptr ds:[AD11E0]
00AA79A9 393C06 cmp dword ptr ds:[esi+eax],edi
00AA79AC 75 16 jnz short 00AA79C4
00AA79AE 8D85 B4FEFFFF lea eax,dword ptr ss:[ebp-14C]
00AA79B4 50 push eax
00AA79B5 FF15 CC80AC00 call dword ptr ds:[AC80CC] ; kernel32.LoadLibraryA
00AA79BB 8B0D E011AD00 mov ecx,dword ptr ds:[AD11E0]
00AA79C1 89040E mov dword ptr ds:[esi+ecx],eax
00AA79C4 A1 E011AD00 mov eax,dword ptr ds:[AD11E0]
00AA79C9 393C06 cmp dword ptr ds:[esi+eax],edi
00AA79CC /0F84 AD000000 je 00AA7A7F//修改JMP
00AA79D2 |33C9 xor ecx,ecx
Shift+F9运行,注意看堆栈:
0006BFA0 00AC134F /CALL 到 GetModuleHandleA 来自 00AC1349
0006BFA4 00000000 \pModule = NULL//返回 时机
取消断点 ,现在我利用这个时机来搞定重定位表!
我们Alt+M打开内存查看窗口,看到这个DLL的各个区段:
内存映射,项目 32
地址=00870000
大小=00001000 (4096.)
物主=M2Server 00870000 (自身)
区段=
包含=PE header//内存访问 断点
类型=Imag 01001002
访问=R
初始访问=RWE
00AC2337 C705 DCDBAC00 E>mov dword ptr ds:[ACDBDC],0ACE4E4
00AC2341 A1 9C55AD00 mov eax,dword ptr ds:[AD559C]
00AC2346 8B00 mov eax,dword ptr ds:[eax]
00AC2348 8985 48ECFFFF mov dword ptr ss:[ebp-13B8],eax
00AC234E A1 9C55AD00 mov eax,dword ptr ds:[AD559C]
00AC2353 83C0 04 add eax,4
00AC2356 A3 9C55AD00 mov dword ptr ds:[AD559C],eax
00AC235B A1 9C55AD00 mov eax,dword ptr ds:[AD559C]
00AC2360 8B00 mov eax,dword ptr ds:[eax]
00AC2362 8985 7CECFFFF mov dword ptr ss:[ebp-1384],eax
00AC2368 A1 9C55AD00 mov eax,dword ptr ds:[AD559C]
00AC236D 83C0 04 add eax,4
00AC2370 A3 9C55AD00 mov dword ptr ds:[AD559C],eax
00AC2375 83BD 48ECFFFF 0>cmp dword ptr ss:[ebp-13B8],0
00AC237C 74 6F je short 00AC23ED
00AC237E 83BD 7CECFFFF 0>cmp dword ptr ss:[ebp-1384],0
00AC2385 74 66 je short 00AC23ED
00AC2387 8B85 0CEBFFFF mov eax,dword ptr ss:[ebp-14F4]
00AC238D 8B8D 1CEBFFFF mov ecx,dword ptr ss:[ebp-14E4]
00AC2393 3B48 34 cmp ecx,dword ptr ds:[eax+34] ; LOADDLL.00400000
下硬件执行断点:HE 00AC2346,Ctrl+F2重新载入这个DLL,Shift+F9运行,程序中断在00AC2346处
00AC2346 8B00 mov eax,dword ptr ds:[eax]
00AC2348 8985 48ECFFFF mov dword ptr ss:[ebp-13B8],eax
eax=00062000 就是重定位表的RVA!
00AC234E A1 9C55AD00 mov eax,dword ptr ds:[AD559C]
00AC2353 83C0 04 add eax,4
00AC2356 A3 9C55AD00 mov dword ptr ds:[AD559C],eax
00AC235B A1 9C55AD00 mov eax,dword ptr ds:[AD559C]
00AC2360 8B00 mov eax,dword ptr ds:[eax]
00AC2362 8985 7CECFFFF mov dword ptr ss:[ebp-1384],eax
eax=00005F44 就是重定位表的大小!
00AC2368 A1 9C55AD00 mov eax,dword ptr ds:[AD559C]
00AC236D 83C0 04 add eax,4
00AC2370 A3 9C55AD00 mov dword ptr ds:[AD559C],eax
00AC2375 83BD 48ECFFFF 0>cmp dword ptr ss:[ebp-13B8],0
00AC237C 74 6F je short 00AC23ED
00AC237E 83BD 7CECFFFF 0>cmp dword ptr ss:[ebp-1384],0
00AC2385 74 66 je short 00AC23ED
00AC2387 8B85 0CEBFFFF mov eax,dword ptr ss:[ebp-14F4]
00AC238D 8B8D 1CEBFFFF mov ecx,dword ptr ss:[ebp-14E4]
00AC2393 3B48 34 cmp ecx,dword ptr ds:[eax+34]
00AC2396 74 55 je short 00AC23ED //如与映像基址不符则重定位处理 修改为JMP
现在我们Alt+M打开内存查看窗口,看到这个DLL的给个区段
内存映射,项目 33
地址=00871000
大小=0005A000 (368640.)
物主=M2Server 00870000
区段=CODE//内存访问 断点
类型=Imag 01001002
访问=R
初始访问=RWE
F9 运行
008CAFA4 55 push ebp
008CAFA5 8BEC mov ebp,esp
008CAFA7 83C4 C4 add esp,-3C
008CAFAA B8 C4AD8C00 mov eax,M2Server.008CADC4
008CAFAF E8 1CB8FAFF call M2Server.008767D0
008CAFB4 74 03 je short M2Server.008CAFB9
008CAFB6 75 01 jnz short M2Server.008CAFB9
008CAFB8 E8 B8D4D889 call 8A658475
008CAFBD 000D A4AF0500 add byte ptr ds:[5AFA4],cl
008CAFC3 0089 02740375 add byte ptr ds:[ecx+75037402],cl
008CAFC9 01E8 add eax,ebp
008CAFCB E8 5492FAFF call M2Server.00874224
用LordPE选中Ollydbg的loaddll.exe的进程,在下面的列表里选择M2SERVER.dll,然后完整脱壳,得到dumped.dll。
因为已经修改了Magic Jump,所以现在可以得到完整的输入表
ALT+M 下断点 ?GetModuleHandleA HEX :77E5AD86 CTRL+B 86ADE577 右建长型地址
008CE10C 00000000
008CE110 00000000
008CE114 00000000
008CE118 77F525CA ntdll.RtlDeleteCriticalSection//开始地址
008CE11C 77F75690 ntdll.RtlLeaveCriticalSection
008CE120 77F755DE ntdll.RtlEnterCriticalSection
008CE124 77E5A745 kernel32.InitializeCriticalSection
008CE128 77E615CB kernel32.VirtualFree
。。。。
008CE784 7731A457 COMCTL32.ImageList_GetImageCount
008CE788 7731513D COMCTL32.ImageList_Destroy
008CE78C 7731ADE3 COMCTL32.ImageList_Create
008CE790 00AA8910 /。结束地址
但是现在直接用ImportREC选取M2SERVER.dll,填入RVA=008CE118-400000=4CE118、大小=不去计算我写1000 OEP= 008CAFA4-870000=5CAFA4 得到输入表,CUT掉垃圾指针 保存树文件
打开树文件 修改 4c为O5 保存 导入树文件 就可以FixDump啦!
用LordPE修正dumped_.dll的重定位表RVA=62000、大小=5F44,保存之。
夜凉如水 [BCG] [DCT]=DA CAN TA
2005-11-23 18:35
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)