更改dll的内容

时间:2011-05-17 18:01:19

标签: 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时,它没有遇到任何问题而是运行异常。为什么这样,我做错了?

如何覆盖该功能?

2 个答案:

答案 0 :(得分:0)

您如何知道该功能成功运行?您可以在调试器中运行代码(例如OllyDbg)并确保:

  1. 您的代码在某个地址写入0xCC,
  2. 0xCC写成功,
  3. 0xCC操作码没有例外。

答案 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加载机制的细节有帮助)