【问题标题】:Writing process memory without WriteProcessMemory不使用 WriteProcessMemory 写入进程内存
【发布时间】:2019-01-03 12:10:07
【问题描述】:

我正在尝试在不使用WriteProcessMemory() 函数的情况下编写另一个进程内存。

我正在调用VirtualAllocEx() 以使用CreateRemoteThread() 将数据传递给我的线程。

WriteMemoryInfo* m = (WriteMemoryInfo*)VirtualAllocEx(
    hProc, 
    NULL, 
    1024, 
    MEM_COMMIT | MEM_RESERVE, 
    PAGE_READWRITE
);

m->addr = FinalAddress; // Problem
m->data = Data;         // Problem
m->length = Size;       // Problem

HANDLE threadID = CreateRemoteThread(
    hProc, 
    NULL, 
    0, 
    (LPTHREAD_START_ROUTINE)RemoteThread,
    m, 
    NULL, 
    NULL
);

问题是,我无法使用VirtualAllocEx() 写入新创建的内存,因为它不属于我的进程。解决方案是在此内存上使用WriteProcessMemory(),但这是我正在执行的功能。

如何在没有WriteProcessMemory() 的情况下初始化此内存(m 变量)?

【问题讨论】:

  • 创建一个命名的内存映射文件,将信息写入其中,让您的远程线程打开该文件并读取信息。当然,不使用WriteProcessMemory是没有意义的。
  • 为什么你不想使用WriteProcessMemory ?这里有什么问题?您也可以创建部分(文件映射) - 首先在自身进程中映射它,初始化数据,然后在远程进程中映射它
  • @DavidHeffernan - 我们在这里不需要 named 部分。远程线程不需要打开它(也 - 该线程的代码将位于哪里?)我们可以(并且需要)自己在远程进程中映射此部分。我也认为该线程的代码也需要在部分内部(如果它尚未加载以处理 dll,我对此表示怀疑)
  • @RbMm 如何将其映射到远程进程?是否使用受支持的 API?
  • @DavidHeffernan ZwMapViewOfSection 支持不少于代码注入

标签: c winapi


【解决方案1】:

CreateRemoteThread()VirtualAllocEx() 将被归类为与 WriteProcessMemory() 一样有风险,如果您使用这些,您不妨也使用 WriteProcessMemory()

CreateRemoteThread()lpParameter 参数采用指向要传递给函数的变量的指针。

如果您不想使用WriteProcessMemory(),您可以使用命令行参数启动进程,将您想要用于lpParameter 的任何内容作为命令行参数传递。它会存在于目标进程中,但进程会忽略它。

然后您可以对该变量进行模式扫描以获取地址,然后将该地址作为lpParameter 变量传递。

我的朋友 timb3r 与我分享了这个巧妙的技巧。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 2013-08-10
    • 2016-05-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多