更改dll的内容

标签 c dll

这是家庭作业。

我应该更改 dll 函数的内容并在其中添加错误 (0xCC)。在加载 dll 函数并将其保护更改为 PAGE_EXECUTE_READWRITE 之后。

我无法在其中输入错误代码。我尝试了以下(我删除了不感兴趣的东西):

typedef BOOL (*pfn)();

HMODULE hModule=LoadLibrary("somedll");

pfn somefunc=(pfn)GetProcAddress(hModule,"somefunction");

VirtualProtect (somefunc,dwSize,PAGE_EXECUTE_READWRITE,&dwOldProtect);

BYTE *p = (BYTE*)somefunc;

*p = 0xCC;

当我执行 somefunc 时,它没有出现异常,而是正常运行。为什么会这样,我做错了吗?

如何覆盖函数?

最佳答案

可能 VirtualProtect 返回了一个错误。检查其 (BOOL) 返回值,如果为假,则使用 GetLastError 检查原因。

请注意,VirtualProtect 必须与调用分配内存的 VirtualAlloc 时提供的访问权限兼容。现在,这是您无法控制的事情,因为 VirtualAlloc 是在 LoadLibrary 内部调用的。

另一件事是,提供给 VirtualProtect 的指针必须是该内存页的起始地址,而您提供的函数指针很可能不是。您的功能可以在页面内的任何位置,您必须将其调整到最近的页面开始位置。

感兴趣的:

http://support.microsoft.com/kb/127904 (基本上是你在做什么,但还需要几个步骤)

http://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/ (可能有助于详细了解 DLL 加载机制)

关于更改dll的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6035099/

相关文章:

c++ - C++ 代码链接错误 : warning C4190: type has C-linkage specified, 但返回与 C 不兼容的 UDT

java - JNI 可以处理任何 dll 文件(Windows)吗?

c - 将 float 传递给带有 int 参数的函数(未事先声明)

c - linux内核模块中的每个任务数据结构

c# - 缺少 ServiceStack 的 DLL

c - 使用Rundll32.exe执行DLL导出的函数

c++ - 结构指针的区别

c++ - 堆栈是如何初始化的?

python - HTTP POST Azure 中的授权 header [错误代码 401]

php - 适用于 Windows 的 PECL 扩展