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
}

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

31

32

33

34

35

36

37

38

39

40



41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56
