如何在.NET中反混淆代码?

6

混淆只是关于混淆非公共变量/成员的名称吗?如果是这样,是否有可能编写一个应用程序,至少将这些名称更改为可读性更强的名称,例如"variable1"等,然后提取整个代码仍然可以编译?


1
当然可以。通常被称为逆向工程/反汇编/反编译等(如果你正在寻找一个工具)。 - stefan
有一个这样的工具的示例,请参见 http://de4dot.com/ - gregmac
5个回答

9
不,这只是其中一部分,特别是对于更复杂的混淆器。它们可以生成 IL(中间语言),而这种语言在大多数编程语言中都无法表达,并且逻辑流程极其混乱,以使最好的工具也变得困惑。如果有足够多的时间,你可以手动完成(可能需要很长时间),而且混淆器和反混淆器之间肯定存在着技术竞赛——但你过于低估了这里的技术水平。
此外,还要注意,许多混淆器会查看整个应用程序(而不仅仅是一个程序集),因此它们也可以更改公共 API。

1
@Joan - 通常你可以明确地告诉它忽略特定类型,但一般来说,在应用程序级别上是没有公共API的;但如果你正在混淆一个库,那么是的 - 它必须保留那个。关于减速问题;不会真的有影响 - CLI并不在意IL是否是意大利面条式的。 - Marc Gravell
1
@Marc Gravell的控制混淆可能会破坏即时编译器中的大量优化,为什么不会呢?你的链接还是与主题无关。 - stefan
1
@Marc Gravell,字符串加密等并不是我的问题。我只考虑代码流程,而且我坚信,在哪里以及如何混淆代码会对速度产生很大的惩罚。毕竟我们希望进行全局优化的原因是有道理的 :) - stefan
1
@Joan确实-反射器可以显示IL,但不能反编译为任何语言;它本身并没有混淆;只是使用了你无法在代码中编写的IL技巧。完全混淆的代码通常很难加载到反射器中。关于内部化;这不是编译器的功能,而是JIT/CLI在ldstr操作码上的功能,但确实:它可能会有不同的表现。我的理解是混淆器会努力将其负面影响降至最低。 - Marc Gravell
1
@Joan - 我的原因与混淆无关;这是一些使用元编程在运行时编写最适当的序列化代码的OSS序列化代码,可能会相当棘手。简单地说,在某些点上,最适当的IL 恰好 是在语言方面毫无意义的东西。 - Marc Gravell
显示剩余10条评论

2

这肯定是一个混淆器的起点。虽然有些混淆器也会加密字符串等技巧,使反编译汇编变得非常困难。

当然,由于运行时需要在所有这些之后运行程序集,所以有决心的黑客可能会反向工程化它 :)


2
有“反混淆器”工具可以撤消多种混淆技术,例如解密字符串、删除代理方法、去虚拟化代码、删除反调试代码、删除无用类、恢复方法参数和字段的类型等。
其中一个非常强大的工具是 de4dot
但还有更多工具可用。

1

混淆是指将有意义的名称(如accountBalance)更改为无意义的名称(如a1)。

应用程序显然仍然可以正常工作,但理解其中的算法会更加困难。


1
那是一种(愚蠢的)混淆方式。想象一下在LSD的影响下,仍然能让这些东西工作。那是一个很好的混淆。 - stefan

1

这取决于使用的混淆技术。更改变量名称仅是问题的一部分。大量的混淆工具同时执行某种程序流混淆,这将进一步复杂化代码理解。最终,混淆后的IL在大多数编程语言中不容易(如果有)表达。

即使重命名变量和字段也不会对您有太大帮助,因为拥有许多variable1、variable2等变量名称并不能帮助您理解所阅读的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接