问题标签 [dll-injection]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
5676 浏览

c++ - LoadLibraryW 在 LoadLibraryA 完成工作时不起作用

我编写了一些示例程序和 DLL 来学习 DLL 注入的概念。

我将 DLL 注入示例程序的注入代码如下(省略错误处理):

Memory::CreateThread 如下:

问题是,该模块未加载。但是,当我将第二行更改为

它可以工作(因为测试 dll 的名称中没有 unicode 字符)。

如何让它工作LoadLibraryW

0 投票
4 回答
759 浏览

c++ - 从另一个进程中获取内存

在 Windows 中,假设我使用 DLL 注入进入另一个进程。我还对我注入的进程的内存进行了一些屏幕截图,并知道我想要提取的数据的位置。假设在 0xaaaaaaaa 的另一个进程中存在包含某个值的数据。如何从该过程中获取此值,以便可以在我的注入应用程序中使用它?由于我被注入到进程中,我可以只使用 memcpy 之类的东西吗?

我假设它可能比这更复杂?

编辑:对于下面的回复,我看不到 WM_COPYDATA 如何帮助我,因为它可以将数据发送到另一个应用程序,而不是从现有应用程序中检索数据。

0 投票
5 回答
37779 浏览

c++ - 获取进程主线程的句柄

我在一些小型测试应用程序中创建了一个附加线程,并希望从这个附加线程中挂起主线程。附加线程是通过CreateRemoteThread外部进程创建的。

由于SuspendThread需要一个HANDLE应该暂停的线程,我想知道如何HANDLE从我的附加线程中运行的代码中获取它。

0 投票
3 回答
53895 浏览

c++ - 从注入的 DLL 挂钩 DirectX EndScene

我想绕过EndScene任意 DirectX 9 应用程序来创建一个小的覆盖。例如,您可以使用 FRAPS 的帧计数器覆盖,激活时会在游戏中显示。

我知道以下方法可以做到这一点:

  1. 创建一个新d3d9.dll的 ,然后将其复制到游戏路径。由于首先搜索当前文件夹,在转到 system32 等之前,我修改后的 DLL 被加载,执行我的附加代码。
    缺点:你必须在开始游戏之前把它放在那里。

  2. 与第一种方法相同,但直接替换system32中的DLL。
    缺点:您无法添加游戏特定代码。您不能排除不希望加载 DLL 的应用程序。

  3. 使用 IDA Pro 4.9 Free 等工具直接从 DLL 获取 EndScene 偏移。由于 DLL 是按原样加载的,因此您只需将此偏移量添加到 DLL 起始地址,当它映射到游戏时,获取实际偏移量,然后将其挂钩。
    缺点:每个系统上的偏移量都不相同。

  4. 挂钩Direct3DCreate9获取D3D9,然后挂钩D3D9->CreateDevice获取设备指针,然后Device->EndScene通过虚拟表挂钩。
    缺点:当进程已经在运行时,无法注入 DLL。您必须使用标志开始该过程CREATE_SUSPENDED以挂钩初始Direct3DCreate9.

  5. 注入 DLL 后,在新窗口中创建新设备。然后,EndScene从该设备获取偏移量并将其挂钩,从而为游戏使用的设备生成挂钩。
    缺点:根据我阅读的一些信息,创建第二个设备可能会干扰现有设备,并且可能会出现窗口模式和全屏模式等问题。

  6. 同第三种方法。但是,您将进行模式扫描以获得EndScene.
    缺点:看起来不那么可靠。

如何EndScene从注入的 DLL 挂钩,该 DLL 可能在游戏已经运行时加载,而不必处理其他系统上的不同d3d9.dll,并且使用可靠的方法?例如,FRAPS 如何执行它的 DirectX 挂钩?DLL 不应该适用于所有游戏,只适用于我通过CreateRemoteThread.

0 投票
7 回答
1995 浏览

c++ - 在 C++ 中更改成员函数的地址

在 C++ 中,我可以通过获取成员函数的地址轻松创建函数指针。但是,是否可以更改该本地函数的地址?

即说我在同一个类中有funcA() 和funcB(),定义不同。我希望将 funcA() 的地址更改为 funcB() 的地址,这样在运行时调用 funcA() 实际上会导致调用 funcB()。我知道这很丑陋,但我需要这样做,谢谢!

编辑 - - - - -

我正在尝试做的事情的背景:

我希望为现有代码库实现单元测试,我的所有模块都继承的基类中的一些方法是非虚拟的。我不允许编辑任何生产代码。我可以摆弄构建过程并在基类中替换相关方法设置为虚拟,但我认为我宁愿使用这样的 hack(我认为这是可能的)。

另外,出于技术上的好奇心,我对这个话题很感兴趣,因为通过尝试解决这个问题的过程,我学到了很多关于代码生成和函数查找等事情的底层工作原理,其中我刚读完大学二年级,还没有机会在学校学习。我不确定我是否会在学校里学到这样的东西,因为我在计算机工程专业而不是 CS 专业。

返回主题 funcA() 和 funcB() 方法确实具有相同的签名,所以问题是我只能使用 & 运算符获取函数的地址?我是否正确地说我不能更改函数的地址,或者在不破坏部分内存的情况下换出该地址的内容?如果将函数导出到 dll,那么 DLL 注入对于这种情况会是一种好方法吗?

0 投票
1 回答
2050 浏览

c# - 挂钩 extTextOut 问题

我正在使用 c# 中的 dll 注入软件,注入的 dll 也在 c# 中,并且我正在将 pinvoke 用于某些系统功能。

使用 extTextOut 时,我将字符串打乱,并且线条混合在一起我做错了什么?

我使用来自 codeplex.com 的 EasyHook 连接了 extTextOut,如下所示:

我的 extTextOut 方法是

如果可以的话,还有另一个问题。我怎样才能不断监视失焦或最小化的窗口(使用这种方法它不能正常工作)

非常感谢!

0 投票
3 回答
825 浏览

terminology - 是 dll injection,ring0,ring3... 所有 Windows 特定的概念吗?

它们存在于 linux 平台上吗?

0 投票
1 回答
1071 浏览

delphi - 在远程线程中,如何调用参数包含指针的函数?

我想SHFileOperation使用代码注入来调用。我的代码在调用MessageBoxfrom等简单函数时工作正常user32.dll,但在调用ShFileOperationfrom时不会shell32.dll

我将发布我认为有问题的代码部分。我知道问题出在结构实现中。

这是 RemoteInfo 值的图像:

http://www.freeimagehosting.net/uploads/219d79fc30.jpg

0 投票
4 回答
562 浏览

c++ - 在 C++ 中使用未记录的类

我正在对 Windows 可执行文件进行逆向工程。我从注入可执行文件(不同的线程,自己的堆栈)的一些代码中找到了一个我想使用的类。给定方法地址和成员变量结构,我将如何声明这样一个类?

例如,假设我找到了一个名为 foo 的类,它的构造函数 @ 0x4012D30 和一个函数 doTheMario @ 40125D4。我也知道它包含三个 DWORD 的私人数据。由于这两种方法都是 _thiscalls,我在我的代码中声明了一个这样的类:

现在,这是一个完美的花花公子类,但是现在有什么方法可以让编译器/链接器将类方法绑定到我前面提到的两个地址?当然,我可以编写一个 asm 包装器,为我需要使用的每个方法将 stdcall 转换为 thiscall,然后使用结构而不是类,但必须有更好的方法。

我目前使用 gcc/g++,但我可以切换到 VC++(因为 gcc 的内联 asm 无论如何都让我头疼)。

0 投票
4 回答
1505 浏览

delphi - Delphi 是否可以在另一个进程中获取函数/过程的地址?

我使用 Madshi 的 madCodeHook 组件在进程中注入 DLL,然后挂钩过程/函数。问题是每次新版本的EXE出来时,函数的地址可能会改变。目前我这样做的方式是使用 Ollydbg,然后在我注入进程的 DLL 中硬编码地址,这是非常丑陋和不安全的。只是想知道如果我可以动态地执行它,是否有办法知道程序的定义。

请注意,这不是出于恶意,我只是在目标 EXE 中挂钩了一些程序用于记录目的。