问题标签 [apimonitor]

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

windows - 捕获可移植可执行文件 (PE) EXE 内部函数调用

我如何捕获/记录 EXE 文件的所有本地函数调用?API 监控工具捕获 Windows API 函数调用,我想捕获本地函数调用,例如当用户单击某个按钮时。

问候,

0 投票
0 回答
233 浏览

c# - 如何使用 EasyHook 更改 System.Management 方法的结果?

我一直在制作一个 C# DLL,该 DLL 将被注入到同样用 C# 编写的特定目标应用程序中。目标是操纵 .NET 框架的几个函数的输出。我通过挂钩底层 Windows API 函数成功地更改了读取注册表项的值,但我在读取系统硬盘签名和序列号的方式上遇到了麻烦。

它大致以这种方式使用 System.Management:

我浏览了 ManagementObject 类的.NET 参考源,寻找可以挂钩的 winapi 调用,但没有发现任何有用的东西。我还在一个测试程序上使用了一个api 监视器,只有这个代码,但即使过滤它就像大海捞针一样。

我的问题是,我将如何改变这种方法的结果?我无法挂钩目标应用程序的方法,因为程序集被混淆了,因此每次更新时名称都会更改。

0 投票
0 回答
277 浏览

c++ - 识别 winspool 根本原因的技术!EnumPorts 错误地返回 0 个端口

有一个 Windows 环境,其中所有网络打印机上的“端口”选项卡为空,但仅在某些 win7 客户端上。这些客户端的所有其他打印功能都适用于这些打印服务器上的打印机。由于环境的设置方式,我无法轻松地将内核调试器附加到这些 vSphere 虚拟机。

  • Server 2008 R2 机器 - 好的
  • 清洁 Win7 机器 - 好的
  • Win7 机器 + 很多 3rd 方软件,包括 3rd 方设备驱动程序,多个 API 挂钩软件等 - BROKEN

所有机器都加入同一个域,并以同一个用户身份登录。在 Explorer.exe 上使用Rohitab API Monitor我发现 winspool EnumPorts成功,但在失败的机器上返回 0 个端口,但在相同的用户帐户/相同的网络和相同的参数下,它在两台工作机器上返回 600+ 个端口。

我编写了一个测试 C++ 程序来单独测试 EnumPorts。Visual Studio 2015 项目 + 二进制文件在这里

该计划的关键部分是:

在 pPortInfo 的工作机器上输出是:

在损坏的机器上:

到目前为止我已经确定/尝试了什么

  • 使用SysInternals AutoRuns比较机器,两台机器上的 Windows 服务配置/驱动程序/挂钩 DLL 之间存在数百个差异。我想找到一种技术来将其缩小到潜在的罪魁祸首,而不必删除/禁用所有这些项目
  • 我尝试通过重命名AppInit_DLLs键并确认这些 DLL 不再在进程中加载​​来禁用所有挂钩 DLL,但它仍然损坏
  • 捕获的WireShark跟踪 - 在调用 EnumPorts 时,工作机器上的网络流量被发送/接收到打印服务器。在损坏的机器上,根本没有网络流量发送到打印服务器。但是,在损坏的机器上,您仍然可以运行 net view /all \ 等命令并映射到远程打印服务器上的打印机/驱动器。
  • 使用Microsoft Message Analyzer RPC 跟踪,这会记录 RPC 调用,但不确定如何解释此数据。似乎没有一个呼叫失败。
  • 深入了解 winspool!EnumPorts 它使用NdrClientCall2与打印服务器通信,但这些调用没有失败。
  • 尝试禁用本地防火墙
  • 尝试 netsh winsock 重置并重新启动
  • 在禁用防病毒软件的情况下进行测试
  • 在 Windows 事件查看器中创建了一个过滤器,以在测试运行期间查看所有 Windows 事件日志条目,并且找不到任何看似相关的错误
  • 通过 WinDbg 运行我的测试工具,没有第一次机会异常或其他错误
  • 尝试在 EnumPort 函数完成时设置断点,然后使用NotMyFault创建完整的内存 dmp但找不到任何东西,并且一开始并不真正知道我在寻找什么
  • 使用进程监视器查找丢失的注册表项/文件,但找不到任何
0 投票
1 回答
133 浏览

teechart - 加载类型库/DLL 时出错 (TeeChart.TChart.10)

我们对旧版本 (TeeChart.TChart.7) 没有任何问题,但最近我们安装了 TeeChart.TChart.10 并开始在我们的运行时应用程序中出现问题。我们的问题是,每当我们在应用程序中单击任何 TeeChartView 时,都会弹出一个错误窗口,并显示以下文本:“加载类型库/DLL 时出错”。

我们的应用程序是在 Dolphin Smalltalk 中开发的,我们以前从未遇到过问题,或者在开发环境中这个问题不存在,但它出现在运行时应用程序中。如果您愿意,我们可以提供有关错误的更多信息,我们尝试使用 API Monitor v2 32 位记录 API 调用,但错误描述性不是很强。

我们希望您能帮助我们,否则我们将不得不降级到我们使用的以前的版本。

0 投票
1 回答
324 浏览

c# - Deviare2 挂钩 WriteFile API 两次,仅一次写入

Deviare2 是 MS Windows 上的专业 API Hook 库。它易于使用且功能强大。但是当我想WriteFile使用 C# 虚拟编写器进行挂钩时,我发现它被挂钩WriteFile了两次。我尝试使用 API Monitor 来挂钩 dummy writer,我发现 API Monitor 只是为每个 write 调用挂钩一个。那很奇怪!

挂钩代码:

虚拟写:

0 投票
0 回答
150 浏览

windows - IGlobalInterfaceTable::RegisterInterfaceInGlobal 返回零 cookie

我正在尝试重新打包一个由多个库、COM 接口和一个 COM 自动化服务器组成的专有应用程序。

我的精简发行版不起作用。

使用函数调用监视器(RohitLab API 监视器),我已经确定对 IGlobalInterfaceTable::RegisterInterfaceInGlobal 的调用会为剥离版本中的 cookie 返回零值;在正确的完整安装中,它总是返回 256。

文档说“无效 cookie 的值为 0”。

这很有趣,但是应用程序忽略了零返回值并使用 256 代替(总是?)用于 IGlobalInterfaceTable::GetInterfaceFromGlobal,并且稍后不起作用,因为它试图将接口返回的 NULL 指针连接到其他 COM 对象.

它不会崩溃,只是不会按预期工作。

问题:为什么 RegisterInterfaceInGlobal 会返回零值?包含此接口类型库的 dll 使用 regsvr32 注册。顺便说一句,它似乎加载了另一个 dll,它也是一个 COM 库,但其中没有类型库。

0 投票
1 回答
834 浏览

api - 在没有 Present 的情况下连接到 D3D11 进程并获取 Texture2D

我有一些 D3D11 进程正在挂钩以捕获帧。如果进程调用Present(),捕获帧是没有问题的,但是......在某些情况下它没有可见窗口并且没有调用 Present() 方法,但是帧确实被渲染了。我可以连接Draw()ExecudeCommandList()(和其他)方法。实际上,没有调用 Present() 所以我无法访问 SwapChain 的后台缓冲区。我想当应用程序在没有窗口的情况下运行时没有创建 SwapChain。

当我 hook Draw()orExecuteCommandList()时,我只能访问D3D11Deviceand D3D11DeviceContext

使用 API 监视器,我在每一帧结束时捕获了有关 D3D11 调用的一些信息:

在此处输入图像描述

有谁知道我怎样才能得到结果帧?我的目的是将框架放入 D3D11Texture2D。

谢谢!

升级版:

我发现这种方法对我有帮助:ID3D11DeviceContext::ResolveSubresource,但我无法处理它。它是摊销的(在主应用程序中我试图抓取框架)。

VTable 日志的一部分:

谢谢2!

0 投票
1 回答
175 浏览

c++ - API 监视器类型定义 (XML) 到 C++ 代码

我是一名 C# 程序员,正在做一些逆向工程工作,但遇到了一些麻烦。

我想要做的是在远程进程中挂钩一个库函数并记录一些数据。

我已经将API Monitor与未知库 (libcef.dll) 的一些自定义类型和函数定义一起使用,并且我能够拦截已定义的函数。

我想编写自己的应用程序来挂钩这些功能。我选择在 C++ 中使用 EasyHook,因为它看起来比使用托管 EasyHook 库在 C# 中编组这么多更简单。

EasyHook 要求我使用正确的函数调用约定、标识符和参数来定义要挂钩的函数。

但是,由于我对 C++ 的了解有限,我能够将 API 监视器(在 XML 文件中)的类型定义转换为 C++ 代码,然后我可以在定义我想要挂钩的函数时使用这些代码(这是cef_parse_url)。

所以问题是:如何将以下 API Monitor 类型定义 (XML) 转换为 C++ 代码?

如果有人可以帮助我,那对我来说就意味着整个世界。我相信对于 C++ 中级的人来说,能够轻松地帮助我。

提前致谢!

0 投票
2 回答
261 浏览

winapi - 为什么 GetCaretPos 返回与 GetTextExtentPoint32 不同的远程编辑

编辑在不同的程序中(DPI 不知道)。我的程序正在尝试获取文本宽度。

所以GetTextExtentPoint32行为与 DrawText 相同。他们都返回宽度为32GetCaretPos{1, 1}变为的结果{25, 1},表示宽度为24

我的电脑上的 DPI 是 150%。如果我将 DPI 设置为 100%,这些 API 返回值不会改变。所以我认为这不是因为 DPI 影响。

这两个API有什么关系?


使用 API 监控工具,我可以看到程序本身调用 GetTextExtentPoint32A 并返回[24, 12]. 其行为类似于 GetCaretPos。

我怎样才能得到与目标进程本身相同的结果?


现在事情变得更有趣了!如果我创建字体并再次选择它,则GetTextExtentPoint32返回[24, 12]

如果我在重新创建之前使用 DrawText 进行编辑,我可以看到字体是Bold,但是在重新创建和重新绘制字体之后,它看起来是Normal

你能解释一下吗?

0 投票
1 回答
18 浏览

version-control - 如何知道哪个 Windows 进程已经启动/停止了哪个服务

比如想知道sample.exe创建MyDriverService并运行Start/Stop来运行myDriver.sys

我尝试使用 Process Monitor、API Monitor 但只有来自 Services.exe 的信息