问题标签 [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.
c++ - Windows 8 下 Metro 风格应用程序的 Fraps 类功能
Fraps 等工具适用于基于 OpenGL 或 DirectX 的游戏,但不适用于简单的 Windows 8 Metro 风格游戏,如“Cut The Rope”或“Pirates Loves Daisies”。是的,我知道“Cut The Rope”和“Pirates Loves Daisies”正在使用不同的技术,如 JavaScript 和 HTML5 canvas,但我真的很好奇是否有可能为此类游戏构建类似 Fraps 的工具(某种 canvas hack?)。我想做两件事:
1.测量fps。
2. 截取屏幕截图。
我正在阅读有关整个Fraps 概念的文章并拦截对 DirectX 的调用,但我不确定它是否适用于 Metro 应用程序。也许我只是在浪费时间。我有 2 个问题要问你们:
1. 你认为是否有可能构建类似 Fraps 的工具,用于不使用 DirectX 或 OpenGL 的 Metro 风格应用程序或游戏?
2. 弄乱 dxgi.dll(或其他 dll)会有所帮助吗?
谢谢
c++ - 如何拦截 64 位进程中的 API 方法调用?
背景
我正在开发一种遗留产品,该产品可以通过注入 dll 成功拦截被注入进程试图将其转换为任意 dll 的任意方法调用。特别是 gdi32.dll 库。不幸的是,它在嵌入 64 位应用程序时不起作用。它成为一个热门话题,是时候升级它的功能了。同样不幸的是,源代码中没有注释(典型的 >:-<),而且从外观上看,编写此代码的人对 x86 指令集相当熟悉。我已经很多年没有从事装配工作了,当我这样做的时候是摩托罗拉装配。
在网上搜索后,我从一位英特尔员工那里看到了这篇文章。如果我们的源代码没有早于本文大约 7 年,我会说这正是我们的 Mr. NoComments 开发人员学会执行 API 方法拦截的地方。这就是程序的相似之处。这篇文章也总结为一个不错的 pdf(拦截系统 API 调用),也可以从上述网站找到链接。
问题
我想真正理解英特尔网页链接中提供的示例,以便我可以很好地为 64 位场景创建解决方案。它有据可查,对我来说更容易理解。下面是 InterceptAPI() 例程的摘录。我添加了用“//#”表示的我自己的评论(原始评论用标准“//”标注),在这里我解释了我认为我知道什么和我不知道什么:
我想我对这段代码中发生的事情有很好的理解。所以百万美元的问题是:这对 64 位进程不起作用怎么办? 我的第一个想法是,“哦,地址现在应该是 8 个字节,所以这一定是出了什么问题。” 但我认为 JMP 命令仍然只需要一个相对的 32 位地址,因此即使在 64 位进程中使用 32 位地址,操作码也应该仍然有效。除此之外,我认为唯一可能是我们在方法调用开头的神奇 5 个字节实际上是其他一些神奇的数字。有人有更好的见解吗?
注意: 我知道还有其他一些解决方案,例如“Microsoft Detours”和“EasyHook”。前者太贵了,我目前正在探索后者,但到目前为止它令人失望。所以,我想继续讨论这个话题。我觉得这很有趣,也是解决我的问题的最佳方法。所以请不要“嘿,我对这篇文章一无所知,但请尝试{在此处插入第 3 方解决方案}。”
c++ - 在注入的进程中从 DLL 调用函数
有没有办法从该进程调用驻留在 dll 中的函数(将 dll 注入到进程中)?
我的意思是,如果我有myDLL.dll
导出一个函数,比如说void f(){do sth}
一个进程myProcess
,“myDLL.dll”是使用注入的CreateRemoteThread()
,我可以从中调用f()
,myProcess
那么实际上myProcess
是启动调用这个函数的“用户”吗?
我需要这样做,因为我希望该功能f()
不依赖于可以在任务管理器中杀死的某个程序,因为员工可以找到该进程并杀死它。我的经理要求我这样做,因为他认为员工在做其他事情而不是工作。
c# - 为什么我在 dll 注入后没有收到消息框?
我有简单的 dll 代码:
以及用于将 dll 注入另一个进程的 python 代码:
注入适用于某些进程。例如它适用于 gvim。我可以看到消息框。但是我在 C# 中创建了简单的应用程序。在尝试将我的 dll 注入此应用程序之后,什么也没有发生。
Python 注入器不会使用OpenProcess
orCirtualAllocEx
和 return报告任何错误c_ulong(3968L)
。那为什么我看不到消息框?
编辑:
我的操作系统:Windows XP Professional SP3 32 位。
编辑2:
我用 C 代码做了同样的事情,得到了同样的结果。注入例如适用于 gvim。但不适用于我在 c# 中的过程。我确实用调试器检查过,看起来 DllMain 函数没有执行。
c# - 在同一个进程中加载的两个 .NET CLR 如何相互通信?
既然可以让两个 CLR 在同一个机器上运行,那么它们如何相互“对话”呢?
假设 GUI 在 .NET 2.0 CLR 下运行,并且有一个脚本在 .NET 4.0 CLR 上运行,例如,有没有办法从 4.0 环境修改基于 2.0 的 GUI?
当我使用这种技术将 .NET C# REPL 环境注入另一个 .net 进程时,我遇到了这个确切的问题:视频:将 C# DLL 注入托管 (C#) 和非托管 (C++) 进程
注意:我在 Reddit 上问过一个类似的问题,该版本包含大量参考资料,如果您对并行执行和 CLR 托管主题感兴趣,这将很有用
c++ - 如何从注入的 DLL 中获取程序窗口?
我已将 DLL 注入到程序中,以在应用程序主窗口上实现聊天 UI。我想我可以获取应用程序主窗口句柄,然后获取它的 DC,然后在上面绘制。该窗口有一个可预测的标题,这意味着我可以使用它FindWindow
来获取句柄。唯一的问题是,DLL 是在进程启动时注入的。那时,该窗口尚未创建。这意味着FindWindow
什么也没找到!
对此有什么解决方案?我可以在 DLL 中创建一个线程并休眠一段时间,直到我知道创建了窗口吗?这似乎很不稳定,所以我宁愿不这样做。
我试图做的是SetWindowsHookEx
在 DLL 中使用来挂钩全局 WndProc。我可以扫描这些消息,直到从我的窗口中找到一条消息(这意味着它已被创建)。然后我可以保存句柄并继续我的程序。我不太担心当时有多个同名的窗口。唯一的问题是我的钩子永远不会被调用。
我像这样创建钩子:
它返回一个有效的钩子。WndProc 如下所示:
但是没有“WNDPROC”消息记录到我的日志文件中......早些时候,我有一个MessageBox
而不是日志来查看它是否有效,结果证明这是一个糟糕的主意。所有程序都冻结了,因为它们在等待我单击“确定”,而我不得不进行硬重置...当我重新打开计算机并MessageBox
用日志命令替换时,它不起作用。不过,我知道我的日志有效,因为它在其他任何地方都有效。我对发生的事情感到非常困惑。
是否有其他获取主窗口的方法(最好是在创建时)?还是我的钩子方法很好,但只是执行错误?感谢您的任何反馈。
c++ - 如何在 explorer.exe 中更改 NotifyIcon 的上下文菜单?
我想用新项目扩展默认扬声器通知的(托盘图标)右键单击上下文菜单。另外,我想使用 C++ 处理鼠标点击。
插图
到目前为止我所知道的
我学习了如何使用CreateRemoteThread()进行 dll 注入,因为我认为这是要走的路。我的问题是:在注入的 dll 里面做什么?例如,如何访问 NotifyIcon 对象?
也许可以通过简单的 Windows API 调用,但我不熟悉它。
c++ - 注入 dll 在 Windows XP 上不起作用
所以我正在尝试制作一个注入器来注入我Detours
用于挂钩游戏客户端的 dll,这很简单,但是有一个问题我不知道出了什么问题,它在 XP 上运行良好Windows Vista+
但在 XP 上运行不正常......这是我的代码
两者都是用 VC++2010 构建的,所以它应该可以工作,但在 Windows XP 上它会启动游戏但 dll 没有被注入,我知道这里有什么问题!
编辑:我相信这是因为我的 XP 缺少 MSVCR100D.DLL ,有没有办法让我的 dll 不依赖它?
c++ - 如何修改运行时加载的 DLL 的导入地址表
我想挂钩在运行时从加载的 DLL 调用的函数,我使用了“Windows Via C/C++”一书中的 CAPIHook 类(由 Install System Wide hook 完成的 DLL Injecting 和 Modify IAT 完成的挂钩)但是这个仅当可执行文件的 IAT 中存在 DLL 名称/符号时,代码才起作用。(即用于隐式 DLL 链接)
这是 DLL 代码:
这是钩子函数:
更换IAT的方法:
作者添加了注释以添加此功能,但我不知道该怎么做
注意:只有在导出模块已经加载的情况下才能挂钩该函数。一种解决方案是将函数名称存储为成员;然后,在挂钩的 LoadLibrary* 处理程序中,解析 CAPIHook 实例列表,检查 pszCalleeModName 是否是已加载模块的名称以挂钩其导出表并重新挂钩所有已加载模块的导入表。
他也在书上写了这个,但我又不知道该怎么办
一种可能的解决方案是使用挂钩的 LoadLibrary* 函数来检测模块何时导出未修补的挂钩函数,然后执行两个操作:
再次挂钩已加载模块的导入表,因为现在可以调用 GetProcAddress 并获取指向要挂钩的函数的原始实现的指针。请注意,函数的名称需要存储为类成员并在构造函数中设置。
直接在导出模块的导出地址表中更新这个钩子函数,如 ReplaceEATEntryInOneMod 函数的实现所示。这样,所有调用挂钩函数的新模块都会调用我们的处理程序
我尝试在加载 DLL 后修改 IAT,但未调用我的挂钩函数
那么,如何修改此代码以处理动态加载情况?
c++ - 在 Win 7 中从远程进程获取 PEB
规格:Windows 7 x64,Visual C++
目标:我正在尝试从示例程序(例如 calc.exe)中获取远程PEB 。我找到了 proc ID,并且我已经打开了具有所有良好权限的进程句柄。我现在开始编写一个类来使用 PROCESS_BASIC_INFORMATION 从进程中检索 PEB 的位置。
问题:我在其他地方发现了几篇帖子,似乎表明NtQueryInformationProcess在 MS 变成了垃圾。一篇文章提出了一种从 ntdll.dll 中动态链接 NtQueryInformationProcess 的方法。但是,我认为从长远来看这将是不稳定的(MS 明天可能会删除 NtQueryInformationProcess),而无需进行广泛的错误处理。
这个想法后来在这个线程中实现,然后 Mike2343 建议应该“使用其他方法”。
问题:定位不涉及 NtQueryInformationProcess 的远程进程的 PEB 的另一种方法是什么?
感谢任何花时间看这个的人。