0

在 C# 中,当应用程序 A 使用应用程序句柄调用应用程序 B 时,应用程序 A(IAppB)Activator.CreateInstance(Type.GetTypeFromProgID('AppB')).CallMe()如何将调用发送到应用程序 B?我不是要解释硬件层,而是想弄清楚是否有可能以某种方式捕获对应用程序的方法调用以弄乱它们。

4

2 回答 2

1

给定用法和名称,您很可能正在对进程外 COM 服务器进行方法调用。它的机制可以写一本书(很多已经写过),所以只是一个简短的概述。

通过使用存储在注册表中的配置信息启动 COM 服务器,球开始滚动。底层原生 api 调用是 CoCreateInstance()。然后,COM 基础结构再次使用注册表来发现充当代理和存根的 DLL。代理的工作是模拟您正在使用的确切 COM 接口。在这种情况下,是 coclass 的默认接口,即声明 CallMe() 方法的接口。

代理序列化传递的参数(如果有),然后调用 RPC 向服务器发出调用请求。在服务器端,存根充当客户端代码。它反序列化参数并进行实际调用。调用结果,至少是 HRESULT,以及可能通过引用传递并需要复制回来的任何参数,然后返回到代理以完成调用。

在低级 RPC 边界上使用这种方案是不切实际的。但是,您可以在技术上创建自己的代理和存根。存在很大的障碍,它们通常是由 MIDL 工具根据 IDL 语言编写的接口描述自动生成的。至少,您将需要该 IDL,以便您确切了解界面的外观。这往往很困难,因为您很少拥有服务器的源代码,因此也没有 IDL。如果服务器有类型库,您可以反编译类型库。这不太可能,因为您正在打一个迟到的电话。最后但同样重要的是,您需要非常了解 RPC。也很难,很晦涩。

于 2012-10-18T17:19:34.927 回答
0

你在这里混合了很多东西

  • 应用程序 A 调用应用程序 B - 这通常意味着“进程 A”调用“进程 B”
  • C# 方法 A 调用方法 B,- C# 中的任何正常调用
  • C# 调用 COM(这是你的代码片段正在做的事情)
  • 通过反射技术调用。这也在您的样本中

您的问题的答案取决于您所谈论的是哪一个。

如果您正在寻找简单地将自己置于同一应用程序域中的函数 A 和函数 b 之间,请查看 AOP - C# 中的面向方面编程

或拦截http://www.codeproject.com/Articles/8436/Intercepting-method-calls-in-C-an-approach-to-AOSD

或者看看城堡动态代理http://docs.castleproject.org/Default.aspx?Page=DynamicProxy

于 2012-10-18T17:02:58.243 回答