让我的Windows桌面程序防篡改或防篡改的3-5种方法是什么



我的任务是为我的客户端创建一个软件,该软件将在后台计算某些系统统计信息(这不是前台过程)。目标平台是WindowsXP-7,语言/技术是灵活的。然而,我觉得客户端最具挑战性的要求是,软件必须在PC启动时运行,并且必须具有防篡改功能。也就是说,如果用户试图停止/禁用软件,客户端希望接收电子邮件。

我认识到,在任何特定的时间,都有人可以拿起机器扔到河里,我无法提醒客户发生了这种情况。我解释了这一点,他们的回应是"如果没有恢复在线,这不是问题"。我想他们希望监控哪些系统长时间离线,并以某种方式处理这些问题。

挑战在于,如果系统已启动并运行,但统计软件未,他们希望收到警报(例如电子邮件通知)。例如,以下场景将触发通知电子邮件:

a) 用户使用任务管理器终止我的进程,然后运行其他程序。下次我的进程启动时,它应该通知它被篡改了。b) 用户禁用在启动时启动进程的机制(例如注册表项)、重新启动机器和运行其他程序。下次我的进程启动时,它应该通知它被篡改了。

最后,客户端希望它是一个可移植的应用程序,而不需要安装Windows。

正如我所说,这项技术是灵活的:我们可以使用C++、C#.NET、WSH或任何其他适用于Windows平台的技术。我已经开发软件近十年了,但还没有遇到篡改意识的需求。所以问题是,有哪些不同的方法可以让我的Windows桌面程序具有防篡改功能?

通知很简单,因为当程序重新启动时,我可以调用外部web服务,web服务可以发送电子邮件通知。棘手的部分是确定系统是否在运行而我的程序没有运行的逻辑?

注意到程序以不需要的方式关闭的最简单方法是在某个地方有一个"锁定"文件,如果程序以正常方式关闭(通过系统关闭事件),该文件将被删除。在启动时,您可以看到锁定文件,并推断您的程序是异常关闭的。

如果知道你的程序不是每天都在运行,你可以更改你的锁定文件,并添加上次运行的编码日期。启动时,使用事件日志中的消息检查该日期。如果锁定文件中的消息不是今天,而是晚于上次运行日期,则表示计算机在没有您的程序的情况下运行。

您也可以使用注册表来实现这一点,或者——如果您有web服务可供您使用,那么让它将数据发送到那里。

  • 启动程序
  • 查找不是今天运行的计算机的最后日期
  • 将该信息发送到Web服务
  • 如果上次计算机运行日期与上次程序运行日期不同,该Web服务可以存储信息并推断计算机在没有您的程序的情况下运行
  • 该Web服务可以推断出您的软件已关闭,因为它有一个仍然打开的"会话">
  • 关闭时:向Web服务发送关闭消息

a)用户使用任务管理器终止我的进程,然后运行其他程序。下次我的进程启动时,它应该通知它被篡改了。

您可能会从一开始就阻止用户终止您的进程。使用WH_CALLWNDPROC挂钩签出SetWindowsHookEx。然后,您可以使用hook方法来查看消息是否是致命的(WM_CLOSEWM_QUIT)并指向您的应用程序。然后,您可以采取适当的操作(尽管如果您决定阻止任何致命消息,请稍微小心,因为您可能会阻止系统关闭-我还没有检查WM_QUERYENDSESSION/WM_ENDSESSIONWM_QUIT之间的交互,尽管WM_ENDSESSION文档建议在系统关闭期间永远不会调用WM_QUIT)。

b)用户禁用在启动时启动进程的机制(例如注册表项)、重新启动机器和运行其他程序。下次我的进程启动时,它应该通知它被篡改了。

老实说,这有点难。我不确定你在这里能做什么,因为任何你能监测到的"错过启动"(其他正在运行的应用程序、系统正常运行时间等)都可能因以下一连串的事件而对你不利:

  • 用户禁用应用程序的启动注册表项
  • 用户重新启动系统
  • 用户想做什么就做什么
  • 用户重新启用应用程序的启动注册表项
  • 用户重新启动系统

您可以尝试监控有问题的注册表项,也许在应用程序关闭前检查一次,如果它被破坏,则发送篡改警告。您也可以在此时重新创建它。问题是,你基本上依赖于一系列的保护:你的应用程序需要运行才能确定自动启动键是存在还是缺失。如果你的用户很聪明,他可以使用LiveCD/LiveUSB禁用应用程序的启动注册表项,然后在他认为合适的时候重新启用它(也许使用相同的LiveCD/LiveU),从而完全绕过这一点。或者,他可以只使用LiveCD/LiveUSB做他想做的任何事情,完全忽略你的应用程序。最终,我认为默认情况下,您的用户在这里占据了上风,除非您可以在最低级别(固件?)安装自己。即便如此,一个绝望的、精通技术的用户也可能会取出系统的硬盘,将其放入另一台计算机的硬盘读取器中,并禁用启动键。

我认为你必须确定你想走多远:你是在寻找一个没有人能绕过的绝对封锁,还是只是想阻止普通用户在公司电脑上浪费时间?

如果这是在公司网络上,那么使用客户端计算机的MAC地址怎么样?

一个受信任的服务器将进行观察,您将让客户端程序向该服务器标识自己。

服务器将通过MAC地址是否处于活动状态来监视此计算机是否处于联机状态。由于MAC不会改变,一旦服务器知道客户端,它就可以对其进行监控

相关内容

最新更新