小编Ahn*_*uhs的帖子

使用调试权限和读/写内存打开进程

精简版:

我正在尝试打开具有调试权限的进程句柄,并定义一个指向调试对象内存中的对象的指针.

长版

我是毕业最后一年的计算机科学大学生,他的任务是建立一个应用程序,用于下一代学生的教育目的.

你可能会问我为什么在这里寻求帮助?好吧,目标平台是Windows,遗憾的是我对WinAPI一无所知......

好的,这是基本要求:

  • 编程语言:C++
  • 平台:Windows(7专业版)
  • 使用的IDE:Visual Studio 2012
  • 如果它们对于简化开发不是必需的,则不需要额外的库

该应用程序将用于什么?

使用这个应用程序,学生将学会处理地址,在这种情况下是静态的:调试对象进程将有一些静态指针,这导致其他指针自己形成一个多维指针.学生必须使用一些调试技术找到这些基地址(这不是我工作的一部分!)并尝试在这些指针的末尾找到这些值.

导师将使用我的应用程序随机更改调试对象过程中的值和/或结构.

一些搜索确实产生了第一个答案:使用ReadProcessMemoryWriteProcessMemory一个可以轻松地更改另一个进程的内存中的值,而无需获得调试权限.

然而,我的导师想要的是能够定义指针(比如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)

c++ memory windows debugging process

6
推荐指数
1
解决办法
7476
查看次数

标签 统计

c++ ×1

debugging ×1

memory ×1

process ×1

windows ×1