在运行时阻止WCF消息登录客户端应用程序

本文关键字:登录 客户端 应用程序 消息 WCF 运行时 | 更新日期: 2023-09-27 18:04:35

我已经看到了很多打开WCF消息记录的方法,但是我想在客户端桌面应用程序(WPF或WinForms)中阻止WCF消息记录吗?我担心一些高级用户会发现如何通过编辑配置文件来打开日志记录,并有一种方法来存储我的应用程序发送给远程服务的敏感信息。如果用户知道自己在做什么,他们似乎对消息日志记录有着难以置信的控制。我已经搜索了SO和MSDN寻找一种方法来确保此设置,并没有找到任何不能通过编辑配置文件来覆盖的东西。

在运行时阻止WCF消息登录客户端应用程序

凡是电脑能做的,用户也能做。这是一条不可改变的规律。这就是为什么会有Keygens,这就是为什么会有软件破解,这就是为什么你的程序不可能生成消息,但不允许用户看到它。

您可以通过设置一个看门狗来检查是否启用了日志记录,并抛出错误,从而使它们更加困难,但下面只是它们可以做的一个简短列表,以篡权逃避用户对消息传递的访问:

  • Fiddler/Proxy Server
  • 带有自签名证书的MITM
  • 钩子从secur32.dll导出的通道函数
  • 在他们的计算机上反编译运行的应用程序,可能修改它以删除您包含的任何障碍
    这听起来很难,但比您想象的要容易得多。几个nop和你用来从日志消息中检测用户的所有聪明的代码都消失了。
  • 在构造消息时进行内存转储。消息的文本将在内存中等待重用,在发送后很长时间(>200ms)。
  • 使用调试器运行并在某些WCF函数上设置断点
  • 等等…

忽略限制

在检查是否启用跟踪方面,您可以使用如下结构:

private static bool IsWcfTracingEnabled()
{
    TraceSource ts = new TraceSource("System.ServiceModel.MessageLogging");
    return ts.Listeners.Count > 0;
}

将返回false

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging">
      <listeners>
        <clear />
      </listeners>
    </source>
  </sources>
</system.diagnostics>

true for:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging">
      <listeners>
        <clear />
        <add name="messages"
          type="System.Diagnostics.XmlWriterTraceListener"
          initializeData="c:'logs'messages.svclog" />
      </listeners>
    </source>
  </sources>
</system.diagnostics>

或:

<system.diagnostics>
  <sources>
    <source name="System.ServiceModel.MessageLogging" />
  </sources>
</system.diagnostics>