这是家庭作业。
我应该更改 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/