gpt4 book ai didi

c++ - 使用注入(inject)的 DLL 从远程进程调用函数

转载 作者:太空狗 更新时间:2023-10-29 20:42:08 26 4
gpt4 key购买 nike

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

我现在有什么:一个 DLL,注入(inject)到目标进程中,显示​​一个消息框并进行数学运算。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

我假设我注入(inject)的 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;
}

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

最佳答案

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

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

  2. 在要注入(inject)的dll中创建一个typedef。这是我有点卡住的地方,但我认识一些经常这样做的人,所以我设法从他们那里得到了帮助。在我的例子中,typedef 是这样的:

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

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

完美!

感谢 dauphic 和一个名叫 DarkstaR 的好 friend 。

关于c++ - 使用注入(inject)的 DLL 从远程进程调用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19798912/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com