参考教材

https://gryffinbit.lanzoui.com/iC3shpbqocd

实验内容

1、参考教材P83-P86,在VC2010下创建一个名字为“dlltest”的空DLL工程,该工程以如下源文件dlltest.c为基础,产生一个dlltest.dll文件。

   \#include <Windows.h>

void Func1(){

MessageBox(NULL, L"Func_1", NULL, MB_OK);

}

void Func2(){

MessageBox(NULL, L"Func_2", NULL, MB_OK);

}

void Func3(){

MessageBox(NULL, L"Func_3", NULL, MB_OK);

}

void Func4(){

MessageBox(NULL, L"Func_4", NULL, MB_OK);

}

void Func5(){

MessageBox(NULL, L"Func_5", NULL, MB_OK);

}

2、编写dlltest.def文本文件,内容如下:

LIBRARY dlltest

EXPORTS

Func1 @ 3

Func2 @ 5

Func3 @ 6 NONAME

Func5

将dlltest.def文件放在上述DLL工程中与dlltest.c源文件相同的目录下,并按照教材P84,进行DLL构建设置。

3、创建上述DLL的测试工程dllclient,该工程以如下源文件dllclient.c为基础。

#include <Windows.h>

typedef void(*Func)();

int main() {

Func Func1, Func2, Func3, Func5;

HMODULE hMod=LoadLibrary(L"dlltest.dll"); // 显式调用

Func1=(Func)GetProcAddress(hMod, "Func1"); Func1();

Func2=(Func)GetProcAddress(hMod, "Func2"); Func2();

Func3=(Func)GetProcAddress(hMod, (LPCSTR) 6); Func3();

Func5=(Func)GetProcAddress(hMod, "Func5"); Func5();

FreeLibrary(hMod);

return 0;

}

注意,执行dllclient工程前,需要将之前编译好的dlltest.dll文件放在dllclient.exe文件所在目录下。

4、按P87-P95的内容,分析该dlltest.dll文件的导出表IMAGE_EXPORT_DIRECTORY结构体中如下几个字段。

(1) DWORD Name

(2) DWORD Base

(3) DWORD NumberOfFunctions 

(4) DWORD NumberOfNames

(5) DWORD AddressOfFunctions

(6) DWORD AddressOfNames

(7) DWORD AddressOfnameOrdinals

实验要求

1、运行dllclient工程,了解DLL的工作方式。

2、使用C32asm与LordPE两个工具对dlltest.dll文件进行分析。(010editor更好用)

3、要求对导出表上述字段的值逐一在C32asm工具中分别截图,然后对照截图,对导出表字段,在实验结果中用表格进行说明。

4、对上述各个字段的含义进行准确理解。

实验结果

请在此处按照实验要求进行截图,并逐一在其后通过表格对导出表结构中各个结构体内部字段值进行记录:

地址 值(内存映像) 字段名
A81C h 1B85A h DWORD Name
A820 h 3 DWORD Base
A824 h 4 DWORD NumberOfFunctions
A828 h 3 DWORD NumberOfNames
A82C h 1B838 h DWORD AddressOfFunctions
A830 h 1B848 h DWORD AddressOfNames
A834 h 1B854 h DWORD AddressOfNameOrdinals

评论