我自己用MFC写了一个程序(附件内),用来研究一下MFC程序的输入表信息,但是遇到一些问题:
用16进制编辑器打开程序
(1)3C偏移处的值为:00010000(0100h)
(2)数据目录中输入表的指针在PE文件头80偏移处.0100h + 80h = 180h
(3)转道180h看输入表指针.0C2A0000(2a0ch)
(4)用LordPE看程序的Section信息:
名称 V偏移 V大小 R偏移 R大小 标志
.rdata 00002000 00001094 00001400 00001200 40000040
发现磁盘偏移和内存偏移不相等,计算差值:VRK = 2000h - 1400h = c00h
后面要用到.
(5)前面(3)里面计算得到的输入表指针的内存偏移地址为:2a0ch
文件偏移 = 2a0ch - c00h = 1e0ch
(6)于是在1e0ch处寻找IMAGE_IMPORT_DESCRIPTOR数组
<1>C42A0000 00000000 00000000 782D0000 40200000
<2>EC2C0000 00000000 00000000 BC2D0000 68220000
<3>8C2A0000 00000000 00000000 D42F0000 08200000
<4>502D0000 00000000 00000000 68300000 CC220000
<5>842A0000 00000000 00000000 74300000 00200000
<6>00000000 00000000 00000000 00000000 00000000 // 结束
(7)把地址全部翻转过来减去差值VRK
<1>1EC4 0000 0000 2178(MFC71.DLL) 1440
<2>20ec 0000 0000 21bc(MSVCR71.dll) 1668
<3>1e8c 0000 0000 23d4(KERNEL32.dll) 1408
<4>2150 0000 0000 2468(USER32.dll) 16cc
<5>1e84 0000 0000 2474(COMCTL32.dll) 1400
<6>0000 0000 0000 0000 0000
(8)IMAGE_IMPORT_DESCRIPTOR数组结构
IMAGE_IMPORT_DESCRIPTOR
{
Union {
DWORD Characteristics;
PIMAGE_THUNK_DATA OriginalFirstThunk;
};
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
PIMAGE_THUNK_DATA FirstThunk;
}
(9)下面是在第一个IID数组第一个字段偏移处取到的信息
7C080080 F2050080 87180080 DA0E0080 85180080 ....//后面很多不写了
问题来了~:
(1)每个双字的地址怎么不象<加密于解密>书上写的0000结尾的呢?
(2)MFC写的的程序的输入表和一般WIN32写的输入表有没有区别啊?
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!