问题标签 [api-hook]

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 投票
1 回答
1438 浏览

winapi - IAT 在自己的进程上挂钩 ExitProcess

我想问一个关于 IAT 挂钩我自己的进程的问题。

我目前正在尝试挂钩 ExitProcess,以便它在任何 ExitProcess 调用之前运行某个函数,并且我面临一些麻烦。

我在运行时遍历 PE,通过 IMAGE_IMPORT_DESCRIPTOR ,在那里找到 kernel32.dll (这是第一个 .dll)之后,我按名称遍历它 THUNK_DATA-s,试图在那里找到 ExitProcess,尽管没有运气。

记录功能,那些是在那里找到的功能 -

尽管 ExitProcess 不在 .

我尝试通过函数指针而不是名称进行枚举(使用 thunkdata 而不是 originalthunkdata),尽管它也失败了。

ExitProcess 的 GetProcAddress 确实在 PE 中返回了一个指针,我尝试通过 loadlibrary 强制加载 kernel32.dll(尽管它应该自动加载),尽管结果是相同的。

可能是什么问题呢 ?

非常感谢你,祝你有美好的一天!

0 投票
2 回答
908 浏览

c# - 如何拦截/覆盖.net 可执行文件中的函数调用?

我想在 .net 可执行文件(我无权访问源代码的第三方可执行文件)中拦截 CLR 函数调用以进行调试。我一直在研究一些挂钩 api(deviare、easyhook、mhook)等,但我认为它们只支持挂钩到 dll 中的简单函数,例如 xxx.dll!functionname,并且不能记录对对象的构造函数调用等。我想要知道它们是否是能够轻松记录.net 可执行文件中的函数调用的任何库,例如如果一个进程调用该函数,File.ReadAllText(@"C:\name.txt");我将使用参数 c:\name.txt 记录函数 File.ReadAllText。

以下是一些我尝试过/看过但没有做我想做的事情。

偏差

姆胡克

易钩

微软痣

Redgate Ants Profiler(这个非常接近。它记录所有 clr 函数调用,我只需要它来记录参数。如果你知道这将如何解决我的问题)

0 投票
1 回答
1327 浏览

c++ - 与 MS Detours 挂钩并使用 Withdll.exe 注入时应用程序崩溃

我正在FindNextFile()使用 MS Detours 进行连接。我已成功配置 Detours 库并编写了一个名为“Detuors.dll”的 dll 和一个名为“FNFSend.exe”的应用程序。以下是代码:

动态链接库:

两个代码都成功编译,没有错误。应用程序FindNextFile()以递归方式调用,dll 将其挂钩并将计数器写入文件。

然后,我使用 detours 库本身提供的名为“withdll.exe”的工具来创建一个注入了 dll 的进程。所以我使用命令将我的 dll 注入到应用程序中:

withdll /d:Detuors.dll "C:\FNFSend.exe"

注入后,函数hook成功,即在目录中创建文件,但应用程序突然崩溃。在visual studio中调试后,在“output.c”中看到异常如下:

请帮助纠正问题。

0 投票
4 回答
1443 浏览

c++ - 尝试连接到 MessageBeep 系统 API

客户要求我解决以下讨厌的问题。他们有一个自定义软件,该软件倾向于在没有任何明显原因的情况下“左右”显示消息框。比如软件本身就是一个记账程序,当他们取客户的钱时,消息框可能会连续显示3到4次左右。每个消息框都会播放 Windows 默认声音。不幸的是,这个软件的编程方式,它播放的声音类型是完全错误的。例如,当消息本身只是一个信息时,它可能会显示一个警告消息框并播放警告系统声音。这一切对于使用该软件的员工来说是相当烦人的。

我试图联系分发软件的供应商,但我遇到了死胡同。所以现在我正在寻找缓解这个问题的方法。

我最简单的解决方案是建议将扬声器静音,但不幸的是,它们需要有声音才能听到传入的电子邮件,最重要的是,以后能够播放来自它们的语音邮件。所以我的解决方案是以某种方式静音消息框的声音,只为一个进程。

根据我的经验,我知道有两个 API 可能会产生这些声音:MessageBeep和一个较旧的Beep

我还发现这篇文章解释了如何使用 AppInit_DLLs 来挂钩到系统 API。它工作得很好,除了我需要挂钩的两个 API 来自 User32.dll 而不是作者建议的 kernel32.dll 。

问题部分中还有这篇文章,它提供了从 User32.dll 连接到 API 的大致步骤,但是当我尝试实现它们时,没有足够的信息(据我所知)。

所以我的问题是,有谁知道如何挂钩 User32.dll 模块中的 API?

编辑:附言。忘了提。该软件安装在 Windows 7 Professional 上,禁用了 UAC——因为它与 UAC 不兼容 :)

0 投票
2 回答
970 浏览

c++ - 使用 APIHijack 解开 API Hook

我已经构建了一个通过 APIHiJack 连接到 Win32 TextOut 函数的应用程序。当应用程序启动时,DLL 会按预期注入,并且我的新 TextOut 函数被成功调用。

目前,我正在努力解决两个关于移除钩子的问题,并希望得到一些指导。

1) 如果某些应用程序已关闭,它们不会向 DLL 发送 FreeLibrary(?) 调用以取消挂钩和清理。这是否正常,如果是,通常如何处理?

2) 更重要的是,如果我的应用程序因任何原因崩溃,应用程序仍然会出现预期的挂钩和崩溃,因为我的新 TextOut 函数不再存在。

我试图枚举所有进程并找到哪些进程包含 DLL(几乎是挂钩技术的逆过程),但它似乎从来没有找到像挂钩时那么多的注入点,因此挂钩的应用程序崩溃了。

提前谢谢了。

0 投票
1 回答
1274 浏览

c# - 使用纯托管代码挂钩 API

我在想如何在不使用 C++ 库之类EasyHook或类似库的情况下将 API 与 C# 或 VB.Net 挂钩。我喜欢学习这个的目的不是为了任何恶意,它只是为了获得更多的经验并找到.net 的极限。假设我喜欢挂钩 MessageBoxA API。我首先通过 Importing System.Runtime.InterropServices 导入它,然后在 user32.dll 中为 MessageBoxA API 调用添加 PInvoke Signiature

我现在基本上喜欢挂钩每个调用 MessageBoxA API 的进程来获取普通文本,但我喜欢在 messageBox 文本的末尾附加“挂钩”。一位对 .net 非常有经验的朋友,但不幸的是忙于帮我解决这个问题,他告诉我它绝对可以做到这一点。步骤是,首先我需要 dll(库)中的实际挂钩函数,稍后我将在进程中注入该函数,然后我需要确定它是本机进程还是托管进程。如果它是托管的,那么没有问题,但如果它是本机进程,我需要一个加载器。本机进程没有加载.net,因此我需要先手动加载它,然后再注入 dll。

然后我需要获取指向 .net 方法的指针作为指针,这样我就知道我的钩子应该指向的地址,然后我可以使用 GetProcessAdress 和 LoadLibraryA 来获取指向 API 的指针。我喜欢在API开头写的JMP可以使用WriteProcessMemory来实现。有人可以告诉我如何通过挂钩 hte messagebox api 并在调用它之前附加一些文本来在上面提到的一个简单示例中实现这一点。

=)

0 投票
1 回答
484 浏览

winapi - Win 7、8中绘制窗口标题的Window API

有谁知道 Windows 使用哪个 API 在 Win 7(Aero 主题)和 Win 8 中绘制窗口标题?我尝试使用 API Monitor 工具进行检查,但没有看到任何用于绘制标题的 API。

请指教。

谢谢。

0 投票
0 回答
469 浏览

c++ - 通过挂钩 ExtTextOutW 提取文本位置

我对 Windows API RedrawWindowExtTextOut和 BitBlt有疑问。如果我使用参数 lprcUpdate = NULL 和 hrgnUpdate = NULL 调用 RedrawWindow,我将连接 ExtTextOut 以提取屏幕上的文本位置:

在挂钩函数 ExtTextOut 中,我调用 LPToDP API 将位置转换为设备上下文位置。然后它工作正常。文字位置正确。

但是,如果我打电话

然后它失败了。位置不正确。我看到它通过使用 LPToDP 翻译到不正确的位置。

有人知道这个问题吗?我们该如何解决?

谢谢。

0 投票
1 回答
349 浏览

c++ - 当 std::wstring 在堆栈上定义时,挂钩的 NtOpenFile 失败

我已经使用mhook library. 在特殊情况下,当 a定义为NtOpenFile()时失败。在代码上定义它是.std::wstringstack varheapworking

代码可以正常工作,除非某个win32 application(我们称之为 nuisance.exe)尝试打开现有的测试文件(如 c:\temp\anyfile.log)access fails。大多数情况下返回 STATUS_INVALID_ACL (0xC0000077)。

reduced my code一行一行地发现错误发生在一个被调用的函数中定义了一个 std::wstring (下面这个例子)。每次在不同的操作系统上都会发生错误

我已经为这个电话修复了这种方式。但我担心其他情况下的其他功能可能会失败,所以我正在寻找原因并(可能)寻找解决方案。

Nuisance.exe 是一个 C# 应用程序,默认堆栈大小调用一个我一无所知的 win32 dll。

0 投票
1 回答
700 浏览

c++ - 如何检测计算机是否正在关闭以保存会话

我正在使用 C++/x86 asm 制作 RPG 游戏。我的问题与 C++ 组件有关。在 C++/win32 中,我将如何检测计算机是否正在关闭或关闭,或者其他什么 - 以便我可以保存游戏会话。我的游戏有一个“保存”选项,但如果用户或其他程序决定关闭计算机,我如何使用某种 API 挂钩检测到这一点,以便我可以立即将游戏会话保存到文本文件中。

现在请不要通过创建一个被动运行的线程来建议一个选项,因为我想将文件大小保持在最小,所以如果你能建议某种 WM_ 钩子那就太好了。我会参考 MSDN,但我不想通过他们的 WM 目录搜索几个小时。