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