【作者声明】:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
        
【调试环境】: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

  • 标 题: 我补充一下OEP的查找
  • 作 者:DiKeN
  • 时 间:2005-11-25 12:58

//在SetEnvironmentVariableA设置断点, 
//断下后,返回到用户空间,
//然后查找特征代码
//find eip,#68????????6A01#
//find eip,#FF15????????#
//(参见下面脚本)
//在FF 15 XX XX XX XX位置即为DllMain调用处
//
//下面是脚本部分片断

bp fnSetEnvironmentVariableA
run
bc fnSetEnvironmentVariableA
rtu
log eip
/*
//DLL入口
008E0B98  |. 68 80C49100    PUSH _M2Serve.0091C480
008E0B9D  |. 6A 01          PUSH 1
008E0B9F  |. 8B0D 28C29100  MOV ECX,DWORD PTR DS:[91C228]            ;  _M2Serve.00870000
008E0BA5  |. 51             PUSH ECX
008E0BA6  |. FF15 5CC29100  CALL DWORD PTR DS:[91C25C]
*/
find eip,#68????????6A01#
find eip,#FF15????????#
mov OEP,$RESULT
log OEP