首页 文章

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

提问于
浏览
2

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

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

  • 在Go中编写代码并将软件编译成二进制代码(可能是混淆)

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

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

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

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

  • 重复运行程序以检查输出

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

1 回答

  • 5

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

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

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

    代码就是数据 . 当代码可运行时,该数据的副本是未受保护的代码 . 可以复制不受保护的代码 . 使用反盗版检查来削弱代码会使其稍微困难,但黑客只会使用调试器并删除它们 . 插入无操作而不是调用“check_license”非常容易 .

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

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

    或者至少让它“足够难” .

    你只能让它变得更难 .

    在Go中编写代码并将软件编译成二进制代码(可能是混淆)

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

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

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

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

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

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

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

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

    重复运行程序以检查输出

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

相关问题