【问题标题】:Calling a function from a remote process using injected DLL使用注入的 DLL 从远程进程调用函数
【发布时间】:2013-11-16 21:54:19
【问题描述】:

我看到了一个类似但仍然不同的问题,所以只是为了澄清这不是 13428881 的欺骗(在注入的 DLL 中调用函数)。

我现在拥有的: 一个 DLL,注入到目标进程中,显示​​一个消息框并摆弄做数学。

我未来想要的: 一个可以操纵和玩弄目标进程内部的 DLL。

实现所需操作的下一步是在我要注入的进程中调用远程线程中的方法。

我们举个例子: 我有一个 C++ 应用程序,它有 int main,假设它看起来像这样:

int PrintText(string text)
{
    cout << text;
    return 1;
}

int main()
{
    while (true)
    {
        PrintText("From the DLL");
    }
}

好的,太好了,我的目标应用程序当前正在打印一些文本,而且看起来非常愉快。它以令人难以置信的速度发送垃圾邮件,但如果需要,我可以使用线程和睡眠等来减慢它的速度。事实上这不是问题,这里的代码还没有经过编译或测试,我也无意使用这个确切的代码。我实际上是在玩游戏。

现在,假设我创建了一个指向方法 PrintText 的指针,并且我知道它在该进程中的地址。如何在外部调用它并传入参数?

在本地,我相信它看起来像这样:

int i;
int (*PrintSomeText)(string) = PrintText;

然后我可以使用引用调用此函数,如下所示:

i = operation("Text to be printed", PrintSomeText);

按照我的理论,这应该声明一个名为 i 的整数,然后定义一个指向返回 int 的方法的指针,将一个字符串作为参数,并且该指针存储在 PrintText 中的指针的值。 (或类似的东西)。

很好,所以我可以通过指针调用我自己的函数,这很好,事实上破解。我真的对这种能力感到惊讶,我现在感觉自己像超人。我去救一些婴儿什么的,brb。

返回,所以现在我想继续更进一步,并迈出下一步。假设我知道该方法位于目标进程中的地址 100(十进制,我可能会以十六进制执行,因为我正在使用 CheatEngine / OllyDBG 来查找目标进程中的方法,但是对于这个例子我们'会保持简单)。

我假设我注入的 DLL 完全获得了自己的空间,它对目标进程有更高的访问权限吗?我怎样才能找到这个?

感谢您的宝贵时间, 乔什

编辑:一个小提示,我正在阅读 C++ 教程书,到目前为止它被证明非常有用。我注意到我忘了包括我的操作方法,所以很抱歉丢失了。如果需要,请告诉我。谢谢!

编辑 nr 2:我刚刚编写了一些可编译的代码来测试这一点,因为我在没有 IDE 的情况下从书中编写了大部分的徒手阅读,并且 IDE 最终配置了自己,所以这是我的代码目前正在合作

#include "stdafx.h"
#include <iostream>

using namespace std;

int PrintText(char * Text)
{
    cout << Text << endl;
    return 1;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int (*Print)(char*) = PrintText;
    char Text[] = "Hello, world!";
    PrintText(Text);
    int x = (*Print)("Oh my word, it really works!");
    cin.get();
    return 0;
}

注意我还没有让它无限期运行,所以是的,请原谅,我会尽快添加它。

【问题讨论】:

  • 您注入的 DLL 对其注入的进程具有完全访问权限。
  • 你能帮我更清楚地定义一下吗?很抱歉……不知道我在做什么,也许是菜鸟?但在这种情况下,我需要更多的推动而不是推动。我可以简单地指定指向地址的指针吗?我想我需要添加目标模块基地址,并将我获取的方法地址添加到该地址以便调用该方法?顺便说一句,谢谢你至少给了我一些继续前进的灵感!

标签: c++ dll code-injection dll-injection codecave


【解决方案1】:

Dauphic 非常成功,我可以完全控制目标进程,正如我所希望的那样。所以,这就是我正在做的调用目标进程方法(对于任何未来的读者感兴趣):

  1. 在内存中找到方法。为此,我首先禁用了ASLR (Address space layout randomization),然后在目标程序中本地创建了一个指向我的方法的指针,然后使用iostream 将指针转储到屏幕,现在我知道了方法的地址。

    李>
  2. 在要注入的 dll 中创建 typedef。这就是我有点卡住的地方,但我认识一些经常这样做的人,所以我设法摆脱了他们。就我而言,这就是 typedef 的外观:

    typedef int __printPrototype(char* text);
    
  3. 将目标应用程序中方法的地址绑定到注入的dll中的复制:

    int (*Print)(char*);
    Print = (__printPrototype*)0x0041121C;
    Print("I'm injecting myself into you.");
    

完美!

感谢 dauphic 和一位名叫 DarkstaR 的好朋友。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多