这是一项家庭作业。
我应该更改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
时,它没有遇到任何问题而是运行异常。为什么这样,我做错了?
如何覆盖该功能?
答案 0 :(得分:0)
您如何知道该功能成功运行?您可以在调试器中运行代码(例如OllyDbg)并确保:
答案 1 :(得分:0)
VirtualProtect可能会返回错误。检查其(BOOL)返回值,如果为false,则使用GetLastError检查原因是什么。
请注意,VirtualProtect必须与调用分配内存的VirtualAlloc时给出的访问权限兼容。现在,这是你无法控制的,因为VirtualAlloc是在LoadLibrary内部调用的。
另一件事是提供给VirtualProtect的指针必须是该内存页面的起始地址,而您提供的函数指针可能不是。您的功能可以在页面内的任何位置,您必须将其调整到之前最近的页面。
感兴趣:
http://support.microsoft.com/kb/127904 (基本上你正在做什么,但需要更多步骤)
http://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/ (可能对DLL加载机制的细节有帮助)