<< 2009年9月11号 Category: 黑客技术文章 2009年10月21日 >>
脱一个壳玩玩    [ 2009-09-18 3:19:56 PM | Author: kyo327 | From: Original ]
这次不用ImportREC 重建输入表,自己手工建一个试试。
目标在附件里。
这个壳OEP比较好找。直接用OD的sfx就到了。
oep:47148b
当然断GetVersion 也可以。
//////////////////////////////////
最常规的
0047A034 <> 60 pushad
0047A035 9C pushfd
0047A036 E8 8E000000 call CrackMe.0047A0C9 ; 来到这里 esp定律 命令行下hr esp
0047A03B C3 retn

F9运行来到这里:
0037087A E8 980D0000 call 00371617 ; f7走一下
0037087F 51 push ecx
00370880 E9 600C0000 jmp 003714E5

00371617 8D6424 04 lea esp,dword ptr ss:[esp+4] ; 这里
0037161B 61 popad
0037161C ^ E9 E7F9FFFF jmp 00371008 ; 这里继续F7

00371008 - FFE0 jmp eax ; 跳向oep
、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

到OEP后知道iat被加密了 是这样的

00475000 003E2264
00475004 003E21A0
00475008 003E2137
0047500C 003E2328
00475010 003E215F
00475014 00000000
00475018 003E624C
0047501C 003E47DB
00475020 003E5C30
00475024 003E7088
00475028 003E50A2
0047502C 003E465C
00475030 003E2D4C
00475034 003E32E7
00475038 003E73C7
0047503C 003E6274
00475040 003E5814
00475044 003E7207
00475048 003E524D
0047504C 003E53F8
00475050 003E5061
///////////////////////////////////////////
重新来,在475000处下内存写入断点。可以到这里:
/*7C921DE6*/ REP MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI] //这里
/*7C921DE8*/ JMP DWORD PTR DS:[EDX*4+7C921F00]
/*7C921DEF*/ MOV EAX,EDI
/*7C921DF1*/ MOV EDX,3
/*7C921DF6*/ SUB ECX,4
/*7C921DF9*/ JB SHORT ntdll.7C921E07
/*7C921DFB*/ AND EAX,3


f8一下 后IAT就添充完了。如下:

00475000 00075812
00475004 00075806
00475008 000757EE
0047500C 000757E2
00475010 00075822
00475014 00000000
00475018 00075A6E
0047501C 00075A5C
00475020 00075A4E
00475024 00075A3E
00475028 00075A32
0047502C 00075A26
00475030 00075A1C
00475034 00075A10
00475038 00075A04
0047503C 00075A7E
00475040 000759EC
00475044 000759DE
00475048 000759D0
0047504C 000759C2
00475050 000759B2
00475054 00075998

/////////////////////////////////////
这个一看就是原始的输入表,那还等啥?直接用 LordPE 修正镜像大小,然后 dump。
用 PETools 的编辑工具把 dump 程序的 OEP 改成 007148b,再用16进制编辑工具定位到偏移 75000 处.
第一个是75812,在winhex中拉到75812后再往上拉,再找到75812开头的地方。这时发现输入表没有了。
那只能自己重建一个了。

先熟悉下输入表结构吧。

IMAGE_IMPORT_DESCRIPTOR结构的各个域的含义:
1)union {
DWORD Characteristics;
DWORD OriginalFirstThunk;
};
这个联合指向一个 IMAGE_THUNK_DATA 类型的结构数组. 其实这个字段为0也行。

2)TimeDateStamp
该dll的时间日期戳,一般为0.

3)ForwarderChain
正向连接索引.一般为0.

4)Name
dll名字的RVA.

5)FirstThunk
这个域也是一个RVA,指向一个DWORD数组,数组以NULL结束.数组中的每个DWORD实际上是一个IMAGE_THUNK_DATA结构的联合体。IMAGE_THUNK_DATA联合体通常被解释为一个指向IMAGE_IMPORT_BY_NAME结构的RVA.

大小是5个dword. 程序里有多少个dll,就有多少个这样的结构,最后由20个0结尾。

///////////////////////////////////////////////////////
既然本程序没有输入表,我就在75b10处建一个吧。

第一个DWORDOriginalFirstThunk指向75812的rva是7550c.
第2,3个DWORD都填0.
第4个DWORD是指向dll的rva.找到dll的位置填上去为 75834
第5个DWORD是上面的指向75812的rva,找到是75000.

看到一共是3个dll。按照这个格式把那两个结构也写到后面即可。
改完后是这样的
:75b10
0C550700000000000000000034580700
00500700245507000000000000000000
D85A070018500700C457070000000000
00000000D6570700B450070000000000


完了后再用pe工具把iat的rva改为75b10 大小改为50即可。
/////////////////////////////////////////

由于union {
DWORD Characteristics;
DWORD OriginalFirstThunk;
};
这个为0也行 所以改为下面也行
000000000000000000000000D85A0700
18500700000000000000000000000000
34580700005007000000000000000000
00000000D6570700B450070000000000
///////////////////////////////////////////////////////////////
以上只是练习下手工建IAT的方法 其实下面方法最简单。
0047A41B FFD2 call edx F7进入
ctrl+B 搜

0F 85 A5 F5 ?? FF
将搜到指令的jnz 改成jmp 即可
壳就不加密IAT了

File: Click to Download



[ Edited by kyo327 at 2009-09-20 3:35:14 AM ]

Comments RSS Feed http://www.kyospace.com/feedcomm.asp?logID=327

No Comment

Post Comment
Topic Locked or You don't have the Permission. No Comment Allowed.
Here is kyo's blog © 2004-2005 
Processed in 0.562500 second(s)