我的系统是win xp,此DLL为VC++写.
―――――――――――――――――――――――――――――――――
一、得到重定位表RVA和OEP
代码:--------------------------------------------------------------------------------
1004E1D0 807C24 08 01 cmp byte ptr ss:[esp+8],1 //进入OD后停在这
1004E1D5 0F85 86010000 jnz HDLL.1004E361
1004E1DB 60 pushad
--------------------------------------------------------------------------------
不用跟踪,Ctrl+S 在当前位置下搜索命令序列:
代码:--------------------------------------------------------------------------------
xchg ah,al
rol eax,10
xchg ah,al
add eax,esi
--------------------------------------------------------------------------------
找到在1004E346处,在其上mov al,byte ptr ds:[edi]的1004E337处下断,F9运行,断下
代码:--------------------------------------------------------------------------------
1004E337 8A07 mov al,byte ptr ds:[edi]
//EDI=1004B500-当前基址10040000=0000B500 //重定位表的RVA
1004E339 47 inc edi
1004E33A 09C0 or eax,eax
1004E33C 74 22 je short HDLL.1004E360
//重定位数据处理完毕则跳转
1004E33E 3C EF cmp al,0EF
1004E340 77 11 ja short HDLL.1004E353
1004E342 01C3 add ebx,eax
1004E344 8B03 mov eax,dword ptr ds:[ebx]
1004E346 86C4 xchg ah,al
1004E348 C1C0 10 rol eax,10
1004E34B 86C4 xchg ah,al
1004E34D 01F0 add eax,esi
1004E34F 8903 mov dword ptr ds:[ebx],eax
1004E351 ^ EB E2 jmp short HDLL.1004E335
--------------------------------------------------------------------------------
在1004E360处下断,F9运行,断下,重定位数据处理完毕
当我们在1004E360处中断下来时,EDI=1004D3D8,就是重定位表结束的地址
代码:--------------------------------------------------------------------------------
1004E360 61 popad //此时EDI=1004D3D8
1004E361 - E9 B527FCFF jmp HDLL.10010B1B
--------------------------------------------------------------------------------
代码:--------------------------------------------------------------------------------
10010B1B 55 push ebp //OEP
10010B1C 8BEC mov ebp,esp
10010B1E 53 push ebx
10010B1F 8B5D 08 mov ebx,dword ptr ss:[ebp+8]
10010B22 56 push esi
10010B23 8B75 0C mov esi,dword ptr ss:[ebp+C]
10010B26 57 push edi
10010B27 8B7D 10 mov edi,dword ptr ss:[ebp+10]
10010B2A 85F6 test esi,esi
10010B2C 75 09 jnz short HDLL.10010B37
--------------------------------------------------------------------------------
用LordPE选中Ollydbg的loaddll.exe的进程,在下面的列表里选择HDLL.dll,然后完整脱壳,得到dumped.dll。
―――――――――――――――――――――――――――――――――
二、输入表
随便从程序找一个API调用,如:
代码:--------------------------------------------------------------------------------
1000E628 FF15 44C20210 call dword ptr ds:[1002C244] ; kernel32.GlobalFree
--------------------------------------------------------------------------------
在转存中跟随1002C244,上下看到许多函数地址,很明显的可以找到IAT开始和结束的地址:
代码:--------------------------------------------------------------------------------
1002BFF4 00 00 00 00 00 00 00 00 00 00 00 00 E2 68 DB 77
1002C004 5B 66 DB 77 9A 22 DA 77 D8 17 DA 77 BB 28 DA 77
................
1002C5A4 D1 0A AC 7C 2B E1 AD 7C 17 0C AD 7C 38 CD B0 7C
1002C5B4 B4 D1 B0 7C D0 6D AE 7C 9D 48 AC 7C 00 00 00 00
1002C5C4 00 00 00 00 E5 3B 02 10 18 10 00 10 7F 15 00 10
--------------------------------------------------------------------------------
开始地址=1002C000
结束地址=1002C5C1
运行ImportREC,注意:去掉“使用来自磁盘的PE部首”的选项!
选中Ollydbg的loaddll.exe的进程,然后点“选取DLL”,选择EdrLib.dll,填入RVA=0000C000、大小=000005C1 ,点“Get Import”,
"无效"...晕了~~~找了半天原因...找不出???求助各位高手!!!
[课程]Linux pwn 探索篇!