问题标签 [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 回答
4270 浏览

c++ - 远程线程调用 LoadLibrary 失败,错误 87

我正在尝试创建一个远程线程,该线程将加载我编写的 DLL,并从中运行一个函数。DLL 工作正常(已检查),但由于某种原因,远程线程失败并且创建它的进程停止响应。

我使用 ollyDebug 尝试查看出了什么问题,我注意到两件事......

  1. 我的字符串(dll 名称和函数名称)正确传递给远程线程
  2. 线程在 LoadLibrary 上失败,最后一个错误代码为 87“ERROR_INVALID_PARAMETER”

我最好的猜测是,远程线程找不到 LoadLibrary (这是因为链接器完成了对我的进程的repspect???,只是猜测......)

我究竟做错了什么?

这是远程功能的代码:

编辑:

这是我将内存分配给远程进程的部分:

编辑:看起来问题是远程线程正在调用“垃圾”地址而不是 LoadLibrary 基地址。是否有可能 Visual Studio 链接远程进程 LoadLibrary 地址错误?

编辑:当我尝试运行与本地线程相同的代码时(我在 CreateRemoteThread 中使用当前进程的句柄),整个事情都运行良好。什么会导致这种情况?

我应该添加调用功能代码吗?它似乎正在完成它的工作,因为代码正在使用正确的参数在远程线程中执行......

代码在VS2010下编译。

data 是一个简单的结构,名称带有 char* 。(因为在代码中明确编写字符串会导致指向我原始进程的指针)。

我究竟做错了什么?

0 投票
1 回答
2210 浏览

windows - 关于 SetWindowsHookEx() 和 hooking 的问题

这里有一些背景信息。AppInit_DLLs我正在通过注册表项替换已在 dll 注入技术中使用的 dll 。它的目的是存在于每个进程中,并在 GDI32.dll 中设置挂钩以收集有关打印的信息。这是一种获得我们想要的东西的时髦方式。.dll 本身已有 10 多年的历史(用 Visual Studio 97 编写),我们想用比注入的 dll 侵入性更小的东西来替换它。

这似乎SetWindowsHookEx()是我们正在寻找的东西。我一直遇到一些麻烦,但我也与同事讨论过这棵树是否值得吠叫。以下是一些我们无法确定的问题:

  1. 当我们从 dll 中挂钩例程时,例如StartDoc()从 GDI32.dll 中,是否真的每次其他进程使用该 dll 中的该例程时都会收到通知? 这是我们通过注入的 .dll 获得的功能,我们需要相同的功能。

  2. 当钩子被触发时,钩子处理过程是在发起实际调用的进程的进程空间中运行,还是在设置钩子的进程的进程空间中运行? 我的观点是它必须在调用例程的进程的进程空间中运行。例如,如果一个程序调用StartDoc()从 GDI32.dll 中,它将钩子处理程序代码“注入”到其空间并执行。否则,必须在调用进程和设置挂钩的进程之间自动建立一些进程间通信,我只是不认为是这种情况。此外,这个钩子处理例程在调用进程的进程空间中运行是必要的,因为它需要知道的一件事是该调用进程的名称,我不确定如何获取该信息,如果它实际上并没有在该过程中运行。

  3. 如果挂钩处理例程是使用 .NET 托管环境编写的,那么当挂钩到不使用 .NET 托管环境的进程时会中断吗?我们真的很想在这里摆脱 C++ 并使用 C#,但是如果我们的钩子从不受管理的进程中调用会发生什么?如前所述,我认为我们的钩子处理过程将在最初调用被钩子例程的进程中运行。但如果这是真的,那么我认为如果这个进程没有使用 .NET 运行时环境,但传入的钩子处理代码是,我们会遇到麻烦。

0 投票
3 回答
9023 浏览

dll - 使用 AppInit_DLLs 的简单 DLL 注入不起作用。DllMain() 没有被调用

我已经编写了最简单的注入 dll。这是完整的代码:

超级简单对吧?好吧,我什至无法让它工作。此代码编译为 dll,我已将此 dll 的路径放在注册表中 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\AppInit_DLLs] 下。我还应该提到 LoadAppInit_DLLs 注册表值设置为 1。通过这样做,我希望在启动其他应用程序(如 notepad.exe)时看到文件“D:\test.txt”出现,但事实并非如此。我不明白。还有另一个 .dll,它非常古老,是用 Visual Studio '97 编写的(我正在尝试替换它),当我将 AppInit_DLLs 设置为指向它并启动任意应用程序时,它工作得很好。我可以说它在其他应用程序启动时正在加载。

我不确定这里发生了什么,但这应该有效,不是吗?再简单不过了。我正在使用 VS 2010,我认为我已经创建了一个非常平面的 Jane .dll,所以我认为任何项目设置都不应该出现问题,但我对此并不完全确定。我在这里想念什么?


设置信息

  • 操作系统:Windows 7 64 位
  • 操作系统版本:6.1.7601 Service Pack 1 Build 7601
  • IDE:Visual Studio 2010
  • IDE 版本:10.0.40219.1 SP1Rel
0 投票
4 回答
3685 浏览

hook - Win32 将 DLL 注入到针对“任何 CPU”构建的应用程序中

我正在开发一个捕获所有用户交互的项目。MSDN告诉(这个

SetWindowsHookEx 可用于将 DLL 注入另一个进程。32位DLL不能注入64位进程,64位DLL不能注入32位进程。如果应用程序需要在其他进程中使用钩子,则需要 32 位应用程序调用 SetWindowsHookEx 将 32 位 DLL 注入 32 位进程,64 位应用程序调用 SetWindowsHookEx 将 64 位DLL 转换为 64 位进程。

我的问题是,如果应用程序是针对Any CPU. 我是否需要SetWindowsHookEx从针对Any CPU.

我已经编写了 HookLogger_32.exe 加载 HookFunctions_32.dll(均为 x86)和 HookLogger_64.exe 加载 HookFunctions_64.dll(均为 x64)设置WH_CBTWH_MOUSE全局(不是特定线程)。

HookLogger_32.exe、HookLogger_64.exe、HookFunctions_32.dll 和 HookFunctions_64.dll 是用 C++ 编写的。

当我单击基于 .NET 构建的应用程序时Any CPU,这些 DLL 会被注入(通过SetWindowHookEx)。Windows 操作系统挂起,我必须强制重启我的机器。

当针对 x86 或 x64 构建相同的 .NET 应用程序时,当我在 HookLoggers(32 位和 64 位)启动后单击该应用程序时,一切正常。

这种未定义行为的任​​何原因。

我工作的平台是 64 位机器。

0 投票
2 回答
831 浏览

visual-c++ - 检测 Win API mouse_event 调用

我想编写一个程序来确定鼠标是由人移动还是由调用 User32 SendInput 函数的不同进程移动。我认为也许可以使用 dll 注入来检测何时调用 SendInput,但我对此没有任何经验 - 这可能吗?

非常感谢。

0 投票
1 回答
1856 浏览

windows - 为什么注入的任何 DLL 都会使主机进程崩溃?

在对我的软件的新版本进行 beta 测试时,一些用户在运行该应用程序时报告了异常。在这两种情况下都是:“应用程序无法正确启动(0xc0000142)”。我也将其视为 0xc0000005。我发现一个本地系统也有这个错误,并且在调试器下运行它时发现,“datamngr.dll”有访问冲突并且在堆上分配失败。我很快发现“datamngr.dll”是间谍软件,并且正在加载,就像它在系统的 AppInit 中一样。

一旦我清除了 AppInit reg 键,这个问题就消失了。我通过进程监视器检查了它,每当注入这个 DLL 时,我的应用程序就会崩溃。我以为它只是编写得很糟糕的间谍软件,但后来我发现其他 DLL 也在做同样的事情(例如 acaptuser32.dll,它是合法软件)。对我来说奇怪的是我的软件的以前版本没有崩溃。两个版本之间有很多很多的变化,所以很难说它是什么。

我从哪里开始?一些在线探索显示 Firefox 等应用程序替换 LoadLibrary 以将 DLL 列入黑名单以防止注入。但我想从更基本的开始——为什么应用程序现在崩溃了,而以前没有?

我意识到这是非常模糊的,但这几乎是不可避免的。我希望我做错的项目的属性中有一些明显的东西。我尝试过打开和关闭 ASLR,打开和关闭 DEP...我尝试过延迟加载 user32.dll 并通过 LoadLibrary 手动加载它(SetErrorMode 设置为忽略错误),但没有什么对我有用。我们已经在 Windows XP 和 Windows 7(32 位和 64 位)上看到了这种情况。

任何关于从哪里开始的指针将不胜感激。如果有人需要其他详细信息,我会提供尽可能多的信息。

干杯

0 投票
1 回答
249 浏览

c++ - 挂钩窗口创建;未触发挂钩

本质上,我通过注入的 DLL 在进程的内存中,我想停止创建窗口。我试过挂钩以下内容:

  • CreateWindowExW
  • CreateDialogParamW
  • DialogBoxParamW

不幸的是,我要销毁的窗口的创建并没有触发我的任何钩子。上述窗口中有几个 IE 控件,并且正在为它们调用 CreateWindowExW;但不是我想要的实际窗口。这是一个简单的弹出框,并且确实出现在 Spy++/Window Hack 中,所以我确定它是一个实际的窗口。

有任何想法吗?

0 投票
2 回答
8563 浏览

c++ - 在注入的DLL中调用函数

我想在我制作的注入 DLL 的远程进程中调用一个函数。

我已成功注入我的 DLL:

DllMain 被执行并且 DLL 在待机模式下运行。我想做的是以某种方式调用远程加载的 DLL 来做一些工作。

我试过像这样导出函数:

然后像这样执行函数:

但这会导致崩溃。

我该如何解决这个问题?

0 投票
3 回答
5792 浏览

c++ - Winsock recv 与 Detours 挂钩

我有一个应用程序,它使用 Winsock 2.0recv功能,例如,我可以通过 Redox Packet Editor 捕获输出,它确认版本是 2.0。

我有这个代码来挂钩函数:

对于send,一切正常,但我没有得到任何输出recv。我在另一个使用 1.1 版本的 Winsock 的应用程序中尝试过,它工作正常。试图挂钩 WSARecv,WSARecvEx 没有任何运气。

用 WinAPIOverride32 检查了应用程序,它清楚地表明它正在使用recv函数,并成功记录了使用情况。Winsock Packet Editor 也能很好地读取数据。

有任何想法吗?

0 投票
1 回答
1562 浏览

c++ - Explorer.exe 在注入 DLL 时在启动时死锁

每次用户登录 Windows(使用HKCU\Software\Microsoft\Windows\CurrentVersion\Run注册表路径)时,我都会使用注册表“运行”键自动执行我的程序。我的应用程序首先使用命令行 DLL-Injector
将 DLL 注入 explorer.exe 进程。

效果应该是:每次用户登录后(重新启动Windows后) - 我的应用程序被执行,我的DLL被注入explorer.exe

在某些情况下它可以工作,但在少数情况下(时间问题,很少重现),注入器和 explorer.exe 进程都死锁并且没有响应。
我不确定,但我相信它的发生是因为注入器正试图将 DLL 注入进程(并在这样做时暂停它),而进程已经在加载不同的 DLL(因此它被锁定)。这样两个进程都被锁定==>死锁。

我知道死锁是在 DLL 实际注入进程之前实现的。

有谁知道如何避免它?也许在注入之前查询 explorer.exe 的状态?或许要等探险者稳定下来?如果是这样 - 我该怎么做?

谢谢