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

时间:2015-03-05 10:26:03

标签: reverse-engineering deobfuscation

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

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

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

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

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

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

1 个答案:

答案 0 :(得分: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)

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

强一点
  

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

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

  

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

这只是在线许可证/反盗版检查(“电话之家”)

的变体
  

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

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

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

  

重复运行程序以检查输出

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