如何在.net中进行模糊处理后调查问题?

时间:2015-12-29 15:05:41

标签: .net obfuscation peverify

我正在尝试使用ConfuserEx对库进行模糊处理,但之后我的应用程序与MissingMethodException崩溃,堆栈跟踪指向第一次使用混淆类,并且有问题的方法是重命名的。我不知道它的通话或其他用途在哪里,所以我不清楚应该检查什么。我的猜测是在JIT过程中发生异常。

仅应用了重命名混淆,我有地图将其反转。

我查看了模糊模块并重命名了该方法的版本肯定存在。

在混淆模块上运行PEVerify.exe也会出现一些错误(下面只提供了一些小摘录):

[IL]: Error: [d:\1\Confused\my.dll : _YGbNngBKpRxvvy7NkSKSrcvDmJG_::_17w1GiROq6y1aWRw9wWSUGOde1C_][mdToken=0x60003cd] Method does not exist.
Method does not exist.
Method does not exist.
[IL]: Error: [d:\1\Confused\my.dll : _cdMM5QrQwL2ksRGa1UJRmJUkVTd_::.ctor][mdToken=0x60006c8][offset 0x00000002] Unable to resolve token.
[IL]: Error: [d:\1\Confused\my.dll : ClassXyz::_tGtv2dtaIMIA6LoHXu7DwMxfvlS_][mdToken=0x6000732] Method does not exist.
[IL]: Error: [d:\1\Confused\my.dll : ClassXyz::_tk0zK3VXciZeRsH2nVWBZ6jNVdE_][mdToken=0x6000733] Method does not exist.
[IL]: Error: [d:\1\Confused\my.dll : ClassXyz::_tGtv2dtaIMIA6LoHXu7DwMxfvlS_][mdToken=0x6000732] Method does not exist.
[IL]: Error: [d:\1\Confused\my.dll : ClassXyz::_tk0zK3VXciZeRsH2nVWBZ6jNVdE_][mdToken=0x6000733] Method does not exist.
[IL]: Error: [d:\1\Confused\my.dll : ClassXyz::_PkJlSB6sykBdsQ8OXX3CBVEXudk_][mdToken=0x6000735] Method does not exist.
[IL]: Error: [d:\1\Confused\my.dll : ClassXyz::_AYy29oWv1vnvKJP5Q1lcxUcQZRd_][mdToken=0x6000757] Method does not exist.

我已准备好调试混淆过程以搜索出错的地方......但我不知道该寻找什么。我怎样才能知道代码的哪一部分试图使用旧方法名? 如何使用PEVerify的输出,例如mdTokens将如何帮助我?

3 个答案:

答案 0 :(得分:1)

只需要耐心。首先,使用WinDbg启动该应用程序并让应用程序崩溃。然后,您可以看到详细的异常信息,例如调用堆栈和寄存器。借助ILSpy等工具的帮助,您可以确切地看到缺少哪种方法。最后分析混淆日志文件以找到原始方法。

典型的解决方法是尝试从混淆中排除该方法,以查看问题是否已解决。但是可能还有其他的解决方法,或者根本没有解决方法,但要修复混淆器。

我是Obfuscar的当前维护者,所以上面是我在调试Obfuscar问题时的个人经验。希望它可以帮助你。

答案 1 :(得分:0)

根据我在SeeUnsharp .NET Obfuscator开发中的经验,在运行时期间MissingMethodException表示您要执行一个程序集,该程序集对IL代码中的成员具有无效或缺少的引用。 IL代码是.NET CLI编译器生成的代码,可能包含对不需要存在的方法的引用。如果你在C#中这样做,C#编译器会告诉你。

当编译器(在这种情况下是混淆器)没有并且告诉您缺少哪个方法时,PEVerify会捕获此错误,或者至少在缺陷方法调用位于哪个方法的IL偏移处。您可以使用ILSpy,启用元数据标记显示并切换到IL模式,以查找相关指令。 PEVerify的剩余错误可能会在运行时造成麻烦,这就是SeeUnsharp始终通过PEVerify运行混淆程序集以确保输出有效的原因。

我说这是ConfuserEx的问题。当我在IL处理期间以错误的方式连接东西时,我也有这些例外。找到丢失方法的原始文件后,可以通过某种方式检查它是否特殊。它是虚拟的吗?它是一种接口方法吗?是否涉及动态类型?最终,从重命名中排除该方法可能是一种解决方案。

MSDN blogs中还有关于此错误的更多信息。

答案 2 :(得分:0)

如果使用/tokens开关运行,可以在ildasm结果中看到这些标记。像ildasm.exe asm.dll /out=asm.il /tokens一样。在这种情况下,ildasm在每个定义和引用附近生成MD令牌。因此,可以对PEVerify报告的令牌进行简单的文本搜索。

以下是使用/tokens运行时ildasm生成的IL的示例:

  .method /*060035D5*/ private hidebysig newslot virtual final 
          instance void  b() cil managed
  {
    .override [mscorlib/*23000001*/]System.IDisposable/*01000051*/::Dispose /*01000051::0A000069*/ 

请注意,ildasm不会在0x之前添加令牌(为简洁起见),因此您应该对060006c8而不是0x060006c8进行不区分大小写的搜索。