问题标签 [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.
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 起作用:
c++ - 使用 C++ 挂钩 GetTickCount
我不擅长 C++,更多的是 C# 和 PHP。我被分配了一个项目,该项目需要我使用GetTickCount
并连接到应用程序中。我需要一些帮助,因为由于某种原因它没有按计划工作......这是挂钩的代码,我知道它有效,因为我以前在项目中使用过它。我唯一不太确定的是GetTickCount
它的一部分。我试着GetTickCount64
认为这是解决我的问题的方法(它没有使我注入的东西崩溃),但发现它根本不起作用,所以它没有崩溃。
这是用于的其余代码GetTickCount
你能看到一些不正确或应该改变的东西吗?任何帮助表示赞赏。谢谢!
windows - 注册表拦截的绕道替代方案
我正在寻找一种拦截读取并将读取重定向到某个注册表项的方法。当然,Detours 可以做到。但我需要它用于商业应用程序,并且 MS 10K 美元的许可费有点太高了。有没有其他选择?
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
提前谢谢了!
.net - 绕道拦截VB6按钮点击事件
我想将自己的 DLL 注入到 VB6 进程中,以覆盖按钮的默认单击行为。目标是调用我的方法,并且永远不要在 click 事件处理程序中调用原始 VB6 代码。
Microsoft Detours API 似乎可以提供帮助。这些示例向我展示了如何将我的 DLL 注入到正在运行的进程中;但我不确定我应该绕道的功能。
理想情况下,我会喜欢 Detours API 的 .Net 包装器。
任何帮助,将不胜感激。
c++ - C++/Windows API - 无法找到 CreateWindow
这是我在 Visual C++ 2010 Express 中的程序的开始:
Visual C++ 的 IntelliSense 告诉我它找不到CreateWindowW
(即使我看到它正在查看 Winuser.h 中的 #define 并且我可以 F12 转到函数定义)。它也不编译。
知道发生了什么吗?
谢谢,
麦克风
c++ - 我可以在运行时基于另一个函数创建一个函数吗?
我正在玩微软的Detours to hook api,例如,我可以更改MessageBoxA
以这种方式调用时发生的情况:
所以当你打电话时MessageBoxA
,你实际上是在打电话MyMessageBoxA
。
现在我想写一个函数Hook()
,它会做上面的代码在运行时做的事情。例如,如果我将函数指针传递MessageBoxA
给函数,它将完全按照上面的代码执行。
当然,我也可以将其他函数指针传递给它。
那么有一个问题,当我得到一个函数指针时Hook
,如何定义一个与给定函数具有相同返回值和参数的函数(在本例中MessageBoxA
为 to int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
),然后填充函数的函数体?
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 返回时,代码会中断。
有谁知道可能出了什么问题?即使我认为类型映射没问题,我也将错误归咎于他们。
问候。
我删除了锁定部分以缩短源。无论我是否锁定队列,问题仍然存在
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()
那我该怎么办??还是我对此的某些方面的理解是错误的?
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
我的代码:
还有一件事,你能解释一下吗: