指南:代码混淆逆向工程

已发表: 2021-11-17

代码混淆图形是用于防止应用程序黑客攻击的最流行的应用程序安全方法之一。 它是世界各地安全专家最常建议的 AppSec 工作之一,它通常会照顾您的应用程序非常最低的安全要求。 这种策略经常被用作抵御黑客攻击的主要防御机制,并防止代码注入、逆向工程以及篡改客户和应用程序用户的个人信息等典型威胁。

混淆代码?

混淆可执行文件使其不再可理解、可理解或实用的做法称为代码混淆。 源代码被混淆到第三方难以理解和难以掌握的程度,更不用说执行了。 最终用户 ui 或代码的预期输出不受模糊性的影响。 这只是一个预防步骤,可以使任何有权访问软件可执行代码的潜在黑客无法使用该代码。

为什么需要混淆代码?

代码的混淆对于开源软件来说尤其重要,因为开源软件在个人利益的可黑客性方面具有明显的劣势。 开发人员通过使程序难以进行逆向工程来保证其产品的知识产权免受安全风险、非法访问和发现应用程序缺陷的影响。

无论使用哪种类型的隐藏技术,这种方法都会限制危险的源代码并确保不同级别的程序安全性。 时间、成本和资源的原因都倾向于在代码被混淆时放弃代码,因为反编译的代码变得难以辨认。

代码混淆技术

混淆在不同层次上起作用:它可以在语义/词法代码结构层次或数据结构/控制流层次上实现。 混淆策略也因对代码的操作而异。 从本质上讲,安全团队与开发团队合作确定对代码使用的混淆类型。

混淆应该重命名。

这种方法需要混淆命名变量,以便巧妙地隐藏使用它们的实际目的。 反编译器很难理解控制流,因为方法和变量是用各种符号和数字重命名的。 这种混淆方法常用于伪装Java、.NET、Android平台应用程序代码。 这被归类为布局混淆,因为它直接针对源代码为应用程序提供保护层。

数据混淆

这种方法侧重于代码中使用的数据结构,使黑客无法访问程序的真正目标。 这可能需要改变软件在内存中存储数据的方式,以及如何处理数据以产生最终结果。 此过程可以通过多种方式完成:

1.聚合的混淆
因此,数据在软件中的保存方式发生了变化。 例如,数组可能会被分成多个子数组,然后可以在整个程序中引用这些子数组。

2.数据存储的混淆
这会影响数据在内存中的存储方式。 例如,开发人员可以在局部和全局变量存储之间进行混洗,以掩盖变量行为的真实性质。

3. 按需获取混淆
这种方法改变了数据的顺序而不改变程序/代码片段的功能。 开发人员通过创建一个为变量引用的每个实例调用的不同模块来实现这一点。

4.加密字符串
这种技术会加密所有可读的字符串,导致代码难以辨认。 当软件运行时,它们必须在运行时解密。

5. 控制/代码流的混淆
控制从代码库的一部分传输到另一部分的方式对于确定程序的目标至关重要。 混淆这个流程通常是扭曲游戏流程的最有利可图的方式。 这种混淆策略使黑客难以弄清楚代码是如何以及为什么遵循特定路径的,从而使他们无法自拔。

包含随机和意外语句,以及永远不会执行的不必要的 case-switch 语句(死代码),是实现这种混淆策略的最流行方法之一。 这些断言除了使目标黑客感到困惑之外没有其他功能。 在条件程序定向的情况下,程序执行语句顺序的这种变化是非常有用的。

正在调试混淆。

调试信息在通过反编译和重新编译源代码来确定有关程序流程和缺陷的重要信息时通常很有用。 通过更改身份、行号或完全关闭对调试数据的访问来隐藏此类识别数据至关重要。

应解决混淆问题。

内存编程错误在攻击中越来越普遍,尤其是在 C 和 C++ 等非内存安全语言中。 安全漏洞通常是由不受控制的阵列访问等错误引起的。 地址混淆方法使逆向工程变得困难,因为每次执行转换后的代码时,程序的代码和数据的虚拟地址都是随机的。 因此,大多数内存错误攻击都是非确定性的,成功的可能性非常低。

个性化编码

开发人员使用这种方法通过自定义算法加密字符串,然后提供解码器功能来恢复原始代码。

运行时传递的参数

可以修改程序,使其在运行时需要参数。 为了解码变量,用户必须同时拥有代码和解密密钥。

为了开发一种分层防御方法来保护应用程序免受各种安全威胁,安全团队可能会选择同时部署一种以上的技术。

结论

总而言之,仅靠误导是无法解决高级安全问题的。 由于人工智能软件的可用性和黑客的技能,对代码进行反混淆比较困难,但这并非不可能。 因此,密码学并不是解决所有软件安全问题的灵丹妙药。
开发团队可能会使用各种代码混淆方法在不受信任的环境中保护他们的代码,具体取决于安全需求、程序的性质和性能基准。 这些应该在考虑每种方法的优点和缺点的同时进行。 此策略应支持其他 AppSec 计划,例如加密、RASP、数据保留规定等。 当与 AppSealing 等 RASP 解决方案结合使用时,它成为解决当今安全问题的有效解毒剂。