我正在开发一个必须部署在具有root访问权限的客户端的私有云服务器上的软件程序。 我可以通过安全端口与软件进行通信。
我想阻止客户对我的程序进行逆向工程,或者至少让它变得足够困难"。以下是我的方法:
我认为这种方法可以阻止root用户:
使用调试器对我的代码进行反向工程
重复运行程序以检查输出
我的问题是:这个设计的弱点是什么? root用户如何攻击它?
答案 0 :(得分:5)
我想阻止客户对我的程序进行逆向工程,
当软件在您不拥有的硬件上运行时,您无法完全阻止这种情况。要运行该软件,CPU必须查看该程序的所有指令,并将它们存储在计算机内存中。
代码就是数据。当代码可运行时,该数据的副本是未受保护的代码。可以复制未受保护的代码。
使用反盗版检查来削弱代码会使其稍微困难,但黑客只会使用调试器并删除它们。插入无操作而不是调用“check_license”非常简单。
(https://softwareengineering.stackexchange.com/questions/46434中的答案可能对您有用)
硬件所有者控制操作系统和内存,他可以转储所有内容。
或者至少让它“足够难”。
你只能让它变得更难。
Write code in Go and compile the software into binary code (may be with obfuscation)
IDA将反编译任何机器代码。使用本机机器代码比字节码(java或.NET或dex)
强一点确保程序只能使用可通过安全端口发送的密钥启动。密钥可能会根据时间而变化。
如果相同密钥(密钥)的副本位于程序的代码或内存中,则用户可以将其转储并模拟您的服务器。如果代码的一部分或运行代码所需的部分数据是加密存储的,并且使用这样的外部密钥进行解密,则用户可能会窃听密钥(在它将从SSL解码之后但在用于解密秘密部分之前)代码),或从内存中转储解密的代码/数据(很容易看到在内存中创建新的可执行代码,即使使用Linux中的默认预安装工具,只需使用{{1搜索所有mmap
s标志)
每次我需要启动/停止程序时,我都可以通过安全端口发送带有密钥的命令。
这只是在线许可证/反盗版检查(“电话之家”)
的变体我认为这种方法可以阻止root用户:使用调试器对我的代码进行反向工程,或者
不,他可以随时启动调试器;但如果程序经常与您的服务器通信(每5秒钟),您可以使用交互式调试器更难。但如果它经常通信,最好将部分计算移动到您的服务器;这部分将受到保护。
他仍然可以使用非交互式调试器,跟踪工具和内存转储。此外,他可以在虚拟机中运行程序,等待在线检查完成(使用tcpdump和netstat监控网络流量),然后执行VM的实时快照(有几种变体可以启用VM的“实时迁移”;只需短暂停顿可能由您的程序记录,如果它有外部计时),继续在线运行第一个副本,并拍摄快照进行离线调试(包含所有密钥和解密代码)。
重复运行程序以检查输出
直到他破解通讯......