使用二进制代码和密钥防止逆向工程

Ada*_*NYC 2 reverse-engineering deobfuscation

我正在开发一个必须部署在具有root访问权限的客户端的私有云服务器上的软件程序.我可以通过安全端口与软件进行通信.

我想阻止客户对我的程序进行逆向工程,或者至少让它"足够难".以下是我的方法:

  1. 在Go中编写代码并将软件编译成二进制代码(可能是混淆)
  2. 确保只能使用可通过安全端口发送的密钥启动程序.密钥可以根据时间而变化.
  3. 每次我需要启动/停止程序时,我都可以通过安全端口发送带有密钥的命令.

我认为这种方法可以阻止root用户:

  1. 使用调试器对我的代码进行反向工程

  2. 反复运行程序以检查输出

我的问题是:这个设计的弱点是什么?root用户如何攻击它?

osg*_*sgx 5

我想阻止客户端对我的程序进行逆向工程,

当软件在您不拥有的硬件上运行时,您无法完全阻止这种情况.要运行该软件,CPU必须查看该程序的所有指令,并将它们存储在计算机内存中.

https://softwareengineering.stackexchange.com/questions/46434/how-can-software-be-protected-from-piracy

代码就是数据.当代码可运行时,该数据的副本是未受保护的代码.可以复制不受保护的代码.

使用反盗版检查来削弱代码会使其稍微困难,但黑客只会使用调试器并删除它们.插入无操作而不是调用"check_license"非常容易.

(https://softwareengineering.stackexchange.com/questions/46434中的答案可能对您有用)

硬件所有者控制操作系统和内存,他可以转储所有内容.

或者至少让它"足够难".

你只能让它变得更难.

Write code in Go and compile the software into binary code (may be with obfuscation)
Run Code Online (Sandbox Code Playgroud)

IDA将反编译任何机器代码.使用本机机器代码比字节码(java或.NET或dex)强一点

确保程序只能使用可通过安全端口发送的密钥启动.密钥可以根据时间而变化.

如果相同密钥(密钥)的副本位于程序的代码或内存中,则用户可以转储它并模拟您的服务器.如果代码的一部分或运行代码所需的部分数据是加密存储的,并且使用这样的外部密钥进行解密,则用户可能会窃听密钥(在它将从SSL解码之后但在用于解密秘密部分之前)代码),或从内存中转储解密的代码/数据(很容易看到在内存中创建新的可执行代码,即使使用Linux中的默认预安装工具,只需搜索mmap带有PROT_EXEC标志的所有s )

每次我需要启动/停止程序时,我都可以通过安全端口发送带有密钥的命令.

这只是在线许可证/反盗版检查的变种("电话之家")

我认为这种方法可以阻止root用户:使用调试器对我的代码进行反向工程,或者

不,他可以随时启动调试器; 但如果程序经常与您的服务器通信(每5秒钟),您可以使用交互式调试器更难.但如果它经常通信,最好将部分计算移动到您的服务器; 这部分将受到保护.

他仍然可以使用非交互式调试器,跟踪工具和内存转储.此外,他可以在虚拟机中运行程序,等待在线检查完成(使用tcpdump和netstat监控网络流量),然后执行VM的实时快照(有几种变体可以启用VM的"实时迁移";只需短暂停顿可能由您的程序记录,如果它有外部计时),继续在线运行第一个副本,并拍摄快照进行离线调试(其中包含所有密钥和解密代码).

反复运行程序以检查输出

直到他破解通讯......