DLL监控

时间:2010-10-25 20:09:31

标签: c++ windows dll

是否有应用程序允许我查看从进程发送到DLL的内容?

我有一个进程,我有一个DLL,我想监视发送到函数的参数,以便我自己可以使用DLL。

DLL的导出是。

... 0CCPCompressor @@ @ AAE XZ
?? 0CCPExpandor @@ AAE @ XZ
?? 1CCPCompressor @@ AAE @ XZ
?? 1CCPExpandor @@ AAE @ XZ
?清除@ CCPCompressor @@ QAEHXZ
?清除@ CCPExpandor @@ QAEHXZ
..Compress @ CCPCompressor ..
..Delete @ CCPCompressor ..
..Delete @ CCPExpandor ..
..Expand @ CCPExpandor ..
..Free @ CCPCompressor ..
..Free @ CCPExpandor ..
..Init @ CCPCompressor ..
..Init @ CCPExpandor ..
..New @ CCPCompressor ..
..New @ CCPExpandor ..

4 个答案:

答案 0 :(得分:0)

总的来说,这是一个坏主意。即使您有一些捕获的参数集,如果没有深入分析DLL代码,您也不知道如何处理这些参数以及某些方法接受的参数范围。示例:如果我调用方法DoMathOperation(Add,1,2),您可以模仿此调用,但是您将无法执行DoMathOperation(Multiply,2,2),因为您不知道这是可能的。

答案 1 :(得分:0)

最简单的方法是简单地重新定位原始dll,并使用相同的导出创建一个自己创建的新dll。这个DLL将从备用位置LoadLibrary旧的dll。

这在这里不太适用 - dll导出c ++类成员,这有两个结果:c ++类必须静态加载,因为没有c ++机制将c ++函数指针(通过GetProcAddress获取)粘合到一个类实例。

这意味着你的垫片dll将不得不同时导入,导出和相同的符号集。

解决这个问题的唯一方法是将你的垫片dll分为两部分:

Shim1:

一部分将获得原始dll的名称,并将导出原始dll导出的相同类定义:

 class __decldpec(dllexport) CCPCompressor {
  ...

Depends可以破解名称修饰,或Undname.exe随Visual Studio一起分发。

这部分将LoadLibrary()使用位于其他文件夹中的shimdll2.dll的显式路径以及原始dll。导入shimdll2.dll

导出的函数需要GetProcAddress()

Shim2:

另一个垫片dll将位于您试图拦截的dll的文件夹中。这个dll必须从原始压缩器dll导入类:

class __declspec(dllimport) CCPCompressor {
  ...

您可以使用第一个dll创建的dll导入库来实际链接符号。 然后是一个从shim2.dll导出函数的情况,shim1.dll将在调用CCPCompressor方法时调用。

NB。其他的事情:你的CCPCompressor类版本至少需要一个大的虚拟数组,因为你无法从dll中知道应用程序对类的期望有多大(除非你碰巧有一个实际的头文件)描述课程。)


分解导出的名称以构建类定义: 从开始>打开Visual Studio 20XX命令提示符。节目> Visual Studio 20XX - >工具菜单。

c:\...\VC>undname ?Clear@CCPCompressor@@QAEHXZ
Microsoft (R) C++ Name Undecorator

Undecoration of :- "?Clear@CCPCompressor@@QAEHXZ"
is :- "public: int __thiscall CCPCompressor:Clear(void)"

c:\...\VC>_

为从原始dll导出的每个函数执行此操作(undname接受某种文本文件以加快此过程)以找出如何声明匹配类def。

答案 2 :(得分:0)

使用detours是否符合您的要求?

来自网站:

概述

创新系统研究取决于能否轻松检测和扩展现有操作系统和应用程序功能。通过访问适当的源代码,通过重建OS或应用程序来插入新的工具或扩展通常很简单。然而,在今天的世界系统中,研究人员很少能够访问所有相关的源代码。

Detours是一个用于在x86,x64和IA64机器上检测任意Win32函数的库。 Detours通过重写目标函数的内存代码来拦截Win32函数。 Detours包还包含将任意DLL和数据段(称为有效负载)附加到任何Win32二进制文件的实用程序。

Detours保留未检测的目标函数(可通过蹦床调用)作为仪器使用的子程序。我们的蹦床设计为现有的二进制软件提供了大量创新扩展。

我们使用Detours创建了一个自动分布式分区系统,用于检测和分析DCOM协议栈,并为基于COM的OS API创建一个thunking层。 Detours在微软和业内广泛使用。

答案 3 :(得分:0)

唯一可靠的方法是调试程序(使用任何调试器,如OllyDBG)并在所需的导出函数上设置断点。然后您可以简单地跟踪发送到调用函数的堆栈参数。这只是一个开始,您需要在调试器或反汇编程序中完全分析函数指令,以查看每个参数正在做什么及其类型。