【问题标题】:Execute remote function with memory address as parameter以内存地址为参数执行远程功能
【发布时间】:2011-12-26 15:34:17
【问题描述】:

我正在尝试在正在运行的(旧)Win32 Borland 应用程序中执行一个函数(Window 具有类 OLW_WINDOW)。通过使用 OllyDbg,我发现该函数有一个参数,即内存地址。该函数使用的一个变量/值存储在该地址的偏移量处。我的想法是找到该内存地址(在内存块中处于恒定偏移量),将变量/值更改为我想要的,然后执行该函数。使用 WriteProcessMemory 和 CreateRemoteThread 执行是可以的,但问题是如何找到内存地址/块?在 OllyDbg 中打开“内存映射”时,内存块没有所有者、节或包含。是否可以获得由指定线程创建的内存块列表?或者我可以以某种方式从应用程序中获取它吗?顺便说一句:该函数通常在单击按钮时执行,并且我要设置的变量/值是列表视图(或等效项)中(按名称)列出的数据库 ID。

【问题讨论】:

  • 如果内存地址是函数的参数,就不能提供任何你喜欢的地址吗?
  • 我可以,但我担心内存地址还包含函数使用的其他变量,如数据库连接句柄。但我找到了一个(部分)答案here

标签: windows memory ollydbg createremotethread


【解决方案1】:

最好的办法就是调用函数。

作为一个例子,这里有一个将输出打印到控制台的函数:

void ConsoleOutput(char* text);

要调用它,我们会在目标二进制文件中找到该函数的地址。假设它位于 0xDEADC0DE。

我们将为函数指针形成一个 typedef:

typedef void(__cdecl* tConsoleOutput)(char* text);

我们将创建该函数指针类型的实例

tConsoleOutput ConsoleOutput = (ConsoleOutput)0xDEADC0DE;

要调用我们只需要做的函数:

ConsoleOutput("Hello");

同样对于您的项目,您可以输入所需的任何参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    相关资源
    最近更新 更多