阿π
专注于网络协议,系统底层,服务器软件
C++博客
|
首页
|
发新随笔
|
发新文章
| | |
管理
定位IAT并输出导入函数名称和对应的函数地址
1
#include
<
stdio.h
>
2
#include
<
windows.h
>
3
4
void
main()
5
{
6
//
取得主模块的模块句柄(即进程模块基地址)
7
HMODULE hMod
=
GetModuleHandle(NULL);
8
9
//
把进程基址赋给pDosHeader,即起始基址就是PE的IMAGE_DOS_HEADER
10
IMAGE_DOS_HEADER
*
pDosHeader
=
(IMAGE_DOS_HEADER
*
)hMod;
11
12
//
定位到PE HEADER
13
//
基址hMod加上IMAGE_DOS_HEADER结构的e_lfanew成员到达IMAGE_NT_HEADERS
14
//
NT文件头的前4字节是文件签名("PE00" 字符串),然后是20字节的IMAGE_FILE_HEADER结构
15
//
即到达IMAGE_OPTIONAL_HEADER结构的地址,获取了一个指向IMAGE_OPTIONAL_HEADER结构体的指针
16
IMAGE_OPTIONAL_HEADER
*
pOptHeader
=
17
(IMAGE_OPTIONAL_HEADER
*
)((BYTE
*
)hMod
+
pDosHeader
->
e_lfanew
+
24
);
18
19
//
定位到导入表
20
//
通过IMAGE_OPTIONAL_HEADER结构中的DataDirectory结构数组中的第二个成员中的
21
//
VirturalAddress字段定位到IMAGE_IMPORT_DESCRIPTOR结构的起始地址
22
//
即获得导入表中第一个IMAGE_IMPORT_DESCRIPTOR结构的指针(导入表首地址)
23
IMAGE_IMPORT_DESCRIPTOR
*
pImportDesc
=
(IMAGE_IMPORT_DESCRIPTOR
*
)
24
((BYTE
*
)hMod
+
pOptHeader
->
DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress);
25
26
while
(pImportDesc
->
FirstThunk)
27
{
28
//
遍历结构的OriginalFirstThunk字段所指向的IMAGE_IMPORT_BY_NAME结构得到导出函数名
29
//
遍历IMAGE_IMPORT_DESCRIPTOR结构的FirstThunk数组得到每个函数的地址
30
31
//
导出模块的名称
32
char
*
pszDllName
=
(
char
*
)((BYTE
*
)hMod
+
pImportDesc
->
Name);
33
printf(
"
\n模块名称:%s \n
"
, pszDllName);
34
35
//
一个IMAGE_THUNK_DATA就是一个双字,它指定了一个导入函数
36
IMAGE_THUNK_DATA
*
pThunk
=
(IMAGE_THUNK_DATA
*
)
37
((BYTE
*
)hMod
+
pImportDesc
->
OriginalFirstThunk);
38
int
n
=
0
;
39
while
(pThunk
->
u1.Function)
40
{
41
//
取得函数名称。hint/name表前两个字节是函数的序号,后4个字节是函数名称字符串的地址
42
char
*
pszFunName
=
(
char
*
)
43
((BYTE
*
)hMod
+
(DWORD)pThunk
->
u1.AddressOfData
+
2
);
44
//
取得函数地址。IAT表就是一个DWORD类型的数组,每个成员记录一个函数的地址
45
PDWORD lpAddr
=
(DWORD
*
)((BYTE
*
)hMod
+
pImportDesc
->
FirstThunk)
+
n;
46
47
//
打印出函数名称和地址
48
printf(
"
从此模块导入的函数:%-25s,
"
, pszFunName);
49
printf(
"
函数地址:%X \n
"
, lpAddr);
50
n
++
; pThunk
++
;
51
}
52
53
pImportDesc
++
;
54
}
55
MessageBox(NULL,
"
Test
"
,
"
Test
"
,
0
);
56
}
发表于 2010-08-23 13:22
阿π
阅读(1116)
评论(0)
编辑
收藏
引用
所属分类:
其它
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
Linux下makefile教程
c++ 中关于int,unsigned int , short的跨平台移植
C++中的四种强制类型转换的区别 [转]
c++ 枚举网页
[收藏]QQ_dll Function
[分享收藏]IP协议族协议头结构
atoi,atof实现
c++ web Kit简介
PE文件头的结构图
DLL在应用程序间共享数据
网站导航:
博客园
IT新闻
BlogJava
知识库
博问
管理
随笔:64 文章:15 评论:65 引用:0
<
2012年6月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
留言簿
(14)
给我留言
查看公开留言
查看私人留言
随笔分类
非技术(13)
(rss)
服务器开发(3)
(rss)
流媒体
(rss)
其它(25)
(rss)
驱动编程
(rss)
图形开发
(rss)
网络编程(14)
(rss)
随笔档案
2012年6月 (1)
2012年3月 (1)
2011年4月 (1)
2010年12月 (1)
2010年11月 (13)
2010年10月 (1)
2010年9月 (10)
2010年8月 (7)
2010年7月 (5)
2010年6月 (6)
2010年5月 (9)
2010年4月 (3)
2010年2月 (1)
2010年1月 (5)
收藏夹
收藏(1)
(rss)
最新随笔
1. Linux下makefile教程
2. Delete Gmail account
3. c++ 中关于int,unsigned int , short的跨平台移植
4. 【转帖】青年买不起房欲自杀折射四大悲哀
5. C++中的四种强制类型转换的区别 [转]
6. 成都地铁规划[图]
7. linux makefile编写
8. c++ 枚举网页
9. 设计winsock服务器需要注意的几个问题
10. CVC内部杂志
最新评论
1. re: UNICODE与ANSI的区别
内容简明扼要,适合我的理解,谢谢
--欣豆儿
2. re: c++ 中关于int,unsigned int , short的跨平台移植
跨平台移植写的很全面,学习了。
--poker
3. re: 网络通讯协议图
太好了!谢谢!
--雨
4. re: 我常去的编程技术网站
评论内容较长,点击标题查看
--home loans
5. re: 我常去的编程技术网站
评论内容较长,点击标题查看
--forum profile service
阅读排行榜
1. 网络通讯协议图(17946)
2. linux makefile编写(13944)
3. C++中的四种强制类型转换的区别 [转](10791)
4. 分享以前收藏的TCP状态转换图(9934)
5. Socket粘包问题(8781)