问题标签 [detours]

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 回答
5196 浏览

c - 挂钩用户调用功能?

我有一个虚拟机,它在 VM_Create 上将函数的地址(systemCalls)传递给虚拟机。

所以我挂钩 VM_Create 并窃取 syscalls 地址,将其放入备份函数指针中,并将修改后的 systemCalls 函数的地址传递给原始 VM_Create,我可以从中更改参数,添加或删除调用,然后调用备份的- up 系统调用函数。效果很好,直到游戏发布新版本。

我相信已经发现了问题:

这是未修改的 systemCalls 函数的开始:

这是我修改后的系统调用函数:

问题是从修改后的函数中调用原始函数:

已经失败了。

从反汇编的伪代码可以看出,CL_CgameSystemCalls的新定义似乎是:

这意味着他们通过添加 __usercall 属性并将第一个参数放入寄存器 ebx 来更改函数,如果我解释了反编译正确的话。

现在我的问题:

如何将 *args (args[0]) 检索到变量中?

我怎样才能从修改后的函数中调用未修改的函数,它现在使用__usercall?

这是使用 usercall 对系统调用的反汇编:

这是从 hexrays 反编译器创建的伪代码:

您可以在此处找到 CL_CgameSystemCalls 函数的完整(最后一个官方)源代码(复制粘贴太多):

http://ioqsrc.vampireducks.com/da/d3b/cl__cgame_8c-source.html

这是旧版本的反汇编,其中从修改后的 syscall 调用 orig_syscall 起作用:

0 投票
2 回答
3455 浏览

c++ - 使用 C++ 挂钩 GetTickCount

我不擅长 C++,更多的是 C# 和 PHP。我被分配了一个项目,该项目需要我使用GetTickCount并连接到应用程序中。我需要一些帮助,因为由于某种原因它没有按计划工作......这是挂钩的代码,我知道它有效,因为我以前在项目中使用过它。我唯一不太确定的是GetTickCount它的一部分。我试着GetTickCount64认为这是解决我的问题的方法(它没有使我注入的东西崩溃),但发现它根本不起作用,所以它没有崩溃。

这是用于的其余代码GetTickCount

你能看到一些不正确或应该改变的东西吗?任何帮助表示赞赏。谢谢!

0 投票
5 回答
1932 浏览

windows - 注册表拦截的绕道替代方案

我正在寻找一种拦截读取并将读取重定向到某个注册表项的方法。当然,Detours 可以做到。但我需要它用于商业应用程序,并且 MS 10K 美元的许可费有点太高了。有没有其他选择?

0 投票
1 回答
563 浏览

windows - 我的记忆去哪儿了?

我们一直在使用 Vmmap、Processexplorer 和 MS Detours 来分析我们程序中的内存使用情况。我们的目标是验证我们程序的内存使用情况。例如,我们知道我们有 X MB 的数据从磁盘加载到内存中,我们希望确保我们不会以某种方式使用 2X MB 的内存来执行此操作。

但是,我们注意到以下差异: - 对于执行期间的特定点,Vmmap 将报告约 1310 MB 的私有工作集,而 Processexplorer 将报告约 1304 MB(仅减少 6MB,但哪个“更”准确......) - 使用 MS Detours 的内存跟踪将报告从 HeapAlloc 调用分配的 ~948 MB,但 Vmmap 会说程序正在使用 ~1143 MB 的私有堆

我的问题是,除非我们的跟踪代码中出现错误,并且内存被驱动程序映射,任何人都可以解释 Vmmap 和 Processexplorer 如何比我们的 MS Detours 钩子捕获更多的内存数据吗?

我们挂钩的其他值得注意的调用是: - VirtualAlloc - ZwAllocateVirtualMemory - RtlAllocateHeap - MapViewOfSection

提前谢谢了!

0 投票
2 回答
834 浏览

.net - 绕道拦截VB6按钮点击事件

我想将自己的 DLL 注入到 VB6 进程中,以覆盖按钮的默认单击行为。目标是调用我的方法,并且永远不要在 click 事件处理程序中调用原始 VB6 代码。

Microsoft Detours API 似乎可以提供帮助。这些示例向我展示了如何将我的 DLL 注入到正在运行的进程中;但我不确定我应该绕道的功能。

理想情况下,我会喜欢 Detours API 的 .Net 包装器。

任何帮助,将不胜感激。

0 投票
3 回答
2869 浏览

c++ - C++/Windows API - 无法找到 CreateWindow

这是我在 Visual C++ 2010 Express 中的程序的开始:

Visual C++ 的 IntelliSense 告诉我它找不到CreateWindowW(即使我看到它正在查看 Winuser.h 中的 #define 并且我可以 F12 转到函数定义)。它也不编译。

知道发生了什么吗?

谢谢,

麦克风

0 投票
2 回答
450 浏览

c++ - 我可以在运行时基于另一个函数创建一个函数吗?

我正在玩微软的Detours to hook api,例如,我可以更改MessageBoxA 以这种方式调用时发生的情况:

所以当你打电话时MessageBoxA,你实际上是在打电话MyMessageBoxA
现在我想写一个函数Hook(),它会做上面的代码在运行时做的事情。例如,如果我将函数指针传递MessageBoxA给函数,它将完全按照上面的代码执行。
当然,我也可以将其他函数指针传递给它。
那么有一个问题,当我得到一个函数指针时Hook,如何定义一个与给定函数具有相同返回值和参数的函数(在本例中MessageBoxA为 to int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)),然后填充函数的函数体?

0 投票
2 回答
2587 浏览

c# - 带有原始函数调用的 EasyHook

我正在开发一个应用程序,它使用 EasyHook 库将代码注入所需的进程并拦截来自特定 dll 的调用。在我的例子中,库是 Oracle Call Interface,OCI.dll。我想拦截执行的 sql 语句,以便在客户端创建 sql 查询日志。以前我用过微软的detours(2.1版),但是它的license不允许商业使用,3.0版的成本很高。我开始使用 EasyHook 库。我在交付的示例中更改了从 kernel32.dll 拦截函数 CreateFileW 的代码,并将其调整为与 oci.dll 中的函数 OCIStmtFetch2 一起使用。

我有头文件或 oci 库,我确切地知道函数参数和返回类型。根据头文件签名是:

剑 OCIStmtFetch2 ( OCIStmt *stmtp, OCIError *errhp, ub4 nrows, ub2orientation, ub4 scrollOffset, ub4 mode);

根据 Oracle 提供的其他头文件,OCIStmt 是一个结构,而 OCIError 是错误函数的句柄。ub2 和 ub4 是 unsigned short(16 位)和 unsigned int(32 位)的类型定义。Sword 是 typedef 到有符号整数(也是 32 位) 我的 EasyHook 库注入代码如下所示(一些函数名称与示例 FileMonInject 相同):

如您所见,我将 ub4 与 UInt32 映射,将 ub2 与 UInt16 映射,将剑与 Int32 映射。第一次我使用 IntPtr 作为指针(两个第一个参数),但代码不能正常工作。注入的dll完美地拦截了函数调用,我可以在原始函数之前运行我的代码,我可以调用原始函数并返回预期值,但是当执行return E时,目标应用程序会导致内存冲突异常并退出。正如您在代码中看到的那样,然后我尝试使用 void* 指针和 unsafe 关键字来启用在 C# 中使用指针,结果相同。与我使用 Detours 库的代码相比,我可以使用调试器检查的参数和指针值对于两个库都是相同的,因此类型映射看起来不错。然而,当我从 DOCIStmtFetch2_Hooked 返回时,代码会中断。

有谁知道可能出了什么问题?即使我认为类型映射没问题,我也将错误归咎于他们。

问候。


我删除了锁定部分以缩短源。无论我是否锁定队列,问题仍然存在

0 投票
3 回答
1854 浏览

c++ - 是否可以通过 MS 绕道注入多个 Dll?

在 c++ 中,我想将多个 dll 挂接到一个进程。现在我使用CreateProcesswithdll()which 一次只能挂钩一个 api。我该怎么做才能注入多个 dll?

我遇到了这个问题,因为 MS detours 要求我们将自定义 dll 命名为与原始 dll 相同,以便正确绕过 api 调用。因此,即使我可以在创建的同一个 detour dll 中处理不同的 api 调用,我也需要有不同的名称来挂钩来自不同 api 的调用,这意味着我需要不同的 detour Dll。这也意味着我需要注入不同的 DLL。我对吗?

如果我不清楚某些事情,我会尝试更清楚地呈现它:D

谢谢!

PS:只是为了让我的问题更清楚。我需要在同一个进程中注入超过 1 个 dll。CreateProcesswithdll()创建一个线程处于睡眠状态的新进程。在 detours 完成注入 dll 并设置 hooks 后,它会被唤醒。如果我想注入多个 dll 我显然不能重复调用CreateProcesswithdll()

那我该怎么办??还是我对此的某些方面的理解是错误的?

0 投票
1 回答
1570 浏览

c++ - MS Detours 2.1 - 未解决的外部问题

我正在使用 MS Detours 2.1 库和 VS 2010。我正在尝试绕过 PlaySoundW 函数。

我无法编译该代码,并且出现以下错误:

Error 2 error LNK1120: 1 unresolved externals (...)\detoursLearning.dll detoursLearning

Error 1 error LNK2001: unresolved external symbol __imp__PlaySoundW@12 (...)\detoursLearning\main.obj detoursLearning

我的代码:

还有一件事,你能解释一下吗: