我正在尝试打开具有调试权限的进程句柄,并定义一个指向调试对象内存中的对象的指针.
我是毕业最后一年的计算机科学大学生,他的任务是建立一个应用程序,用于下一代学生的教育目的.
你可能会问我为什么在这里寻求帮助?好吧,目标平台是Windows,遗憾的是我对WinAPI一无所知......
好的,这是基本要求:
使用这个应用程序,学生将学会处理地址,在这种情况下是静态的:调试对象进程将有一些静态指针,这导致其他指针自己形成一个多维指针.学生必须使用一些调试技术找到这些基地址(这不是我工作的一部分!)并尝试在这些指针的末尾找到这些值.
导师将使用我的应用程序随机更改调试对象过程中的值和/或结构.
一些搜索确实产生了第一个答案:使用ReadProcessMemory和WriteProcessMemory一个可以轻松地更改另一个进程的内存中的值,而无需获得调试权限.
然而,我的导师想要的是能够定义指针(比如unsigned int),它应该指向调试对象进程的内存空间,有效地保存我之前写的基地址.他们真的想要这个,我甚至无法说出这些,所以我最终坚持这样做......
好吧,如果以下(伪)代码有效,我已经完成了我的任务:
grantThisProcessDebugPrivileges();
openAnotherProcessWhileItsRunning("targetProcess.exe");
unsigned int * targetValue = (unsigned int*) 0xDE123F00;
// or even
myCustomClass * targetClass = (myCustomClass*) 0xDE123F00;
Run Code Online (Sandbox Code Playgroud)
其中地址0xDE123F00位于targetProcess.exe的内存空间中.
我知道这是可能的,否则将没有可以显示此信息的调试器.
好的,事情是:我真的很困惑,我是否必须在打开目标进程之前激活我的应用程序的调试权限,在打开之后执行它,或者更确切地说给目标进程这些权限.
所以我在MSDN中找到了一个例子并尝试实现它:
BOOL SetPrivilege(
HANDLE hToken, // token handle
LPCTSTR Privilege, // Privilege to enable/disable
BOOL bEnablePrivilege // TRUE to enable. …Run Code Online (Sandbox Code Playgroud)