【问题标题】:What are 3 - 5 methods for making my Windows desktop program tamper-proof or tamper-aware? [closed]使我的 Windows 桌面程序防篡改或防篡改的 3 到 5 种方法是什么? [关闭]
【发布时间】:2014-03-03 04:20:01
【问题描述】:

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

我知道,在任何特定时间,都可能有人捡起机器并将其丢入河中,而我无法提醒客户发生了这种情况。我对此进行了解释,他们的回答是“如果它不重新上线,这不是问题”。我猜他们希望监控哪些系统会长时间离线并以某种方式处理这些问题。

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

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

最后,客户更喜欢这是一个便携式应用,不需要安装 Windows。

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

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

【问题讨论】:

  • 您可以运行两个进程来检查他们的兄弟姐妹是否正在运行,如果没有 - 重新启动它们并通知您的客户。
  • 大多数防篡改系统都需要受信任的平台,因此您需要某种 UEFI 引导加载程序来启动受信任的链(排除 XP)。
  • 最好的入门方法是阅读 Punkbuster,因为它能够在停用时自行重启,nad 非常便携。
  • 是否值得考虑防病毒软件使用的防篡改概念?至少,我知道用户在不使用内置功能的情况下禁用杀毒软件并不容易。我只是不确定如何分类或描述这些技术。

标签: c# c++ windows security software-design


【解决方案1】:

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

如果您知道您的程序并非在计算机运行的每一天都运行,您可以更改锁定文件并添加上次运行的编码日期。在启动时检查该日期,即事件日志中的消息。如果那里有消息不是今天,而是晚于锁定文件中的上次运行日期,这意味着计算机在没有您的程序的情况下运行。

您也可以为此使用注册表,或者 - 如果您仍然可以使用 Web 服务,则只需将数据发送到那里。

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

【讨论】:

  • 我喜欢这种方法。基本上,如果我理解正确,您是在谈论调查计算机以寻找在我的程序未运行时它正在运行的“证据”?您对我们应该具体分析/监控的内容有何看法?您建议了 Windows 事件。是否有可能在计算机关闭期间生成带有时间戳的 Windows 事件?我知道这没有多大意义,但毕竟是 Windows ;-) 我真的很喜欢这种方法。我现在只是想知道除了 Windows 事件之外我们还可以扫描哪些其他内容。但是,这可能是最好的。
  • @user1123170 Windows 事件的问题是您的用户可以简单地 disable the Windows event log 甚至 just clear it 。这两个都需要管理员权限,所以如果你的用户是有限访问权限,你应该没问题。但是,您需要建立一些“宽限期”,在此期间可以写入事件而不会触发篡改警告,因为在 Windows 启动且您的应用尚未启动时可能会生成事件。
  • @user1123170 通常像这样的锁定文件所固有的另一个问题是,用户可能会删除它或篡改存储在其中的数据以混淆您的程序。也许他们会删除该文件并根据服务器告诉您的最后一次运行时强制您的程序重新启动。也许他们会更有创意并更改日期以匹配当前日期。您需要找到克服这两个问题的方法。也许只是完全跳过锁定文件并将服务器存储的最后一个程序运行时与事件日志最后一个计算机运行时进行比较?
  • 非常好的建议。谢谢!我认为这通常应该有效。您的警告都是有效的,我认为我们可以按照您的建议解决这些问题,例如将时间戳存储在远程服务器上并实现“宽限期”等。清除事件日志甚至部分删除事件日志是另一个好点。我不太确定该怎么办:如果用户清除了他们规避和禁用软件期间的所有事件日志怎么办?我认为这种方法大多是令人满意的,但显然不是万无一失的。非常感谢大家。
【解决方案2】:

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

您可能会阻止用户首先杀死您的进程。使用WH_CALLWNDPROC 钩子查看SetWindowsHookEx。然后,您可以使用 your hook method 查看消息是否既致命(WM_CLOSEWM_QUIT)又针对您的应用。然后您可以采取适当的措施(尽管如果您决定阻止任何致命消息,请务必小心,因为您可能会阻止您的系统关闭 - 我没有检查 WM_QUERYENDSESSION/WM_ENDSESSIONWM_QUIT 之间的交互,尽管WM_ENDSESSION docs 建议在系统关闭期间永远不会调用 WM_QUIT)。

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

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

  • 用户禁用了您应用的启动注册表项
  • 用户重启系统
  • 用户为所欲为
  • 用户重新启用应用的启动注册表项
  • 用户重启系统

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

我认为您必须确定要采取多远:您是在寻找无人可以绕过的绝对锁定,还是只想阻止普通用户在公司 PC 上浪费时间?

【讨论】:

  • 你是对的,尤其是关于场景 B。精通技术的用户在拥有硬件时总是占上风。在固件级别安装一些东西对我来说将是一个全新的领域,这听起来很危险。这种方法可能会带来很多伤害系统的风险,不是吗?就锁定而言:客户非常清楚我们实际上不需要锁定任何东西。我们只需要准确地报告篡改或“防篡改”。
  • @user1123170 我认为这是有风险的,是的。老实说,我什至不知道你会怎么做这样的事情,因为你必须更换主板的内置软件。您必须禁用从 CD/USB 引导并可能锁定 BIOS 选项。即便如此,他们仍然可以拉出高清甚至可能swap BIOS chips
  • @user1123170 您可以尝试设置 BIOS 密码来锁定引导顺序,但如果他们知道如何清除 CMOS,则不会持续很长时间。而且,如果您不以某种方式强制执行引导顺序,那么其他任何事情都不重要。 LiveCD 将使任何软件级监控措施变得无关紧要。
【解决方案3】:

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

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

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

【讨论】:

  • 这是一个值得考虑的好点。但是,在这种情况下,客户端确实希望允许用户将计算机从网络上断开一段时间。当用户与公司网络断开连接时,统计软件应继续运行。他们仍然想知道(一旦用户最终重新连接到网络)用户的系统是否一直在运行而没有运行该程序。感谢您跳出框框思考。
  • 好吧,如果其他解决方案失败,这可能是 B 计划。如果您使用 IP 和一些身份验证令牌,则可以强制它们在线(而不是在 LAN 上)。不在线 = 没有报酬 :-)
猜你喜欢
  • 2015-01-28
  • 2016-05-19
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-18
  • 2013-05-23
  • 2011-06-13
相关资源
最近更新 更多