是否可以(或如何)从内存中转储源代码/机器代码?

逆向工程 C++ 记忆 。网
2021-07-05 10:02:46

我实际上是在为软件保护方面工作。但是为了正确保护我的源代码(无论是 .Net 还是 C++),我需要从黑客的角度了解什么是可实现的(和不可实现的)。

我可以随心所欲地保护/混淆/加密/虚拟化我的代码,但是当源代码加载到内存中时,它必须不受保护才能运行。那么在这个时候,黑客能否将源代码从内存中转储出来,从而完整地、纯正地恢复我的源代码?

如果是,如何做到这一点?使用什么工具?

编辑:根据我的发现,这似乎是可行的,并且有可以防止这种情况的保护工具,例如Agile.Net

方法级代码加密- 加密所有 MSIL 代码并将其保存在安全存储中。当程序集被加载时,Agile.NET 绑定到 .NET 运行时引擎并在每个方法的基础上管理解密 MSIL。Agile.NET 创建了一个运行时环境,通过一次解密一个方法来执行原始 MSIL 代码,这一重要优点最大限度地减少了 MSIL 代码在内存中的暴露,从而防止从物理内存中转储代码

但我不知道如何,有人可以对此有所了解吗?

1个回答

需要明确的是:您不能从 .net 或 c++ 二进制文件重建源代码。您可以尝试使用启发式方法、嵌入符号和有关汇编程序的知识恢复它,但是您已经在翻译过程中丢失了必要的信息。

您应该区分打包和混淆。

打包意味着您加密(和/或压缩)编译代码的部分并在开始时有一个解密/解包存根,获取加密块并解包它们。这通常可以在恶意软件的情况下观察到。在这种情况下,您可以在解密过程后立即转储内存,并且它不会被加密。

有更复杂的打包方式,如VM-packing,显着增加了转储数据的挑战,但在这方面已经有很多研究。话虽如此,但不存在像一般拆包器这样的东西。

另一方面,混淆以某种方式直接改变代码,使其仍然能够被执行。例如,一种常见的技术是通过使用意大利面条式代码来混淆控制流,例如插入不必要的分支和跳转。这些操作基本上无法撤消,并且显着增加了逆转的挑战。

-> 您不能在您希望它运行的机器上隐藏您要执行的逻辑。你只能让人们更难弄清楚你的代码做了什么。