我的任务是为我的客户端创建一个软件,它将在后台计算某些系统统计信息(这不是前台进程)。目标平台是Windows XP - 7,语言/技术灵活。但是,我觉得客户最具挑战性的要求是软件必须在PC启动时运行,并且必须具有防篡改功能。也就是说,如果用户试图停止/禁用该软件,则客户希望接收电子邮件。
我认识到,在任何特定的时间,有人可以拿起机器并将其放入河中,我无法提醒客户这种情况已经发生。我解释了这一点,他们的回答是“如果没有重新上线”这不是问题。我猜他们希望能够监控哪些系统长时间处于脱机状态并以某种方式处理这些系统。
面临的挑战是,如果系统启动并运行但统计软件不是,他们希望收到警报(例如电子邮件通知)。例如,以下方案将触发通知电子邮件:
a)用户使用任务管理器终止我的进程,然后运行其他程序。下次我的进程启动它应该通知它被篡改。 b)用户禁用在启动时启动进程的机制(例如注册表项),重新启动计算机,以及运行其他程序。下次我的流程开始时,它应该通知它已被篡改。
最后,客户希望这是一个便携式应用程序,不需要安装Windows。
正如我所说,该技术非常灵活:我们可以在Windows平台上使用C ++,C#.NET,WSH或其他任何东西。我已经开发了近十年的软件,但没有遇到篡改意识的需要。所以问题是,有哪些不同的方法可以使我的Windows桌面程序篡改?
通知部分很简单,因为我可以在程序重新启动时调用外部Web服务,并且Web服务可以发送电子邮件通知。棘手的部分是确定系统是否正在运行而我的程序不是运行的逻辑?
答案 0 :(得分:2)
注意到程序以不需要的方式关闭的最简单方法是在某个地方安装一个“锁定”文件,如果以正常方式关闭程序(通过系统关闭事件),程序将删除该文件。在启动时,您可以看到锁定文件,并推断出您的程序异常关闭。
要知道您的程序每天都没有运行计算机,您可以更改锁定文件并添加上次运行的编码日期。在启动时使用例如事件日志中的消息检查该日期。如果那里的消息不是今天,而是晚于锁定文件中的上次运行日期,则表示计算机在没有您的程序的情况下运行。
您也可以使用注册表,或者 - 如果您仍然可以使用网络服务,请将数据发送到那里。
答案 1 :(得分:1)
a)用户使用任务管理器终止我的进程,然后运行其他程序。下次我的流程开始时,它应该通知它已被篡改。
您可能会阻止用户首先杀死您的进程。使用WH_CALLWNDPROC
挂钩查看SetWindowsHookEx。然后,您可以使用your hook method查看该邮件是否既致命(WM_CLOSE
,WM_QUIT
)又针对您的应用。然后你可以采取适当的行动(虽然你决定阻止任何致命的消息时要小心,因为你可能会阻止你的系统关闭 - 我没有检查WM_QUERYENDSESSION
/ WM_ENDSESSION
之间的互动和WM_QUIT
,虽然WM_ENDSESSION docs建议在系统关闭期间从不调用WM_QUIT。)
b)用户禁用在启动时启动进程的机制(例如注册表项),重新启动计算机并运行其他程序。下次我的流程开始时,它应该通知它已被篡改。
老实说,这有点难度。我不确定你能在这里做多少事情,因为任何你可以监控以检测“错过的启动”(其他正在运行的应用程序,系统正常运行时间等)都可能被以下事件链反对你:
您可以尝试监控有问题的注册表项,也许在应用关闭之前检查一次,如果它被销毁则发送篡改警告。您也可以在那时重新创建它。问题是,您基本上依赖于一个保护链:您的应用程序需要运行以确定自动启动密钥是否存在或缺失。如果您的用户很聪明,他可以完全绕过它,使用LiveCD / LiveUSB来禁用应用程序的启动注册表项,然后在他认为合适时重新启用它(可能使用相同的LiveCD / LiveUSB)。或者他可以使用LiveCD / LiveUSB做任何他想做的事情并完全忽略你的应用程序。最终我认为你的用户默认在这里有优势,除非你可以安装在最低级别(固件?)。即使这样,一个绝望的,精通技术的用户也可能会拿出系统的硬盘驱动器,将其放入另一台计算机的硬盘驱动器中,并禁用启动密钥。
我认为您必须确定您想要采取的措施:您是否正在寻找无人能够绕过的绝对锁定,或者您只是想阻止普通用户在公司PC上浪费时间?
答案 2 :(得分:0)
如果这是在公司网络上,那么如何使用客户端计算机的MAC地址?
可信服务器将进行观察,您将让客户端程序向该服务器标识自己。
服务器将通过MAC地址处于活动状态来监视此计算机是否在线。由于MAC不会改变,一旦客户端知道服务器,它就可以监控它。