Skip to main content

还原混淆堆栈日志

混淆后代码中输出的日志中的函数堆栈是混淆后的名称,这给跟踪问题带来很大障碍。对照symbol mapping文件(文档见符号混淆) 记录的原始函数与混淆后函数的映射关系,人工还出原始堆栈的工作非常烦琐。Obfuz提供了DeobfuscateStackTrace工具用来自动化还原混淆堆栈。

DeobfuscateStackTrace工具

DeobfuscateStackTrace是一个基于.net 8开发的命令行工具,可以运行在Win、MacOS、Linux等所有.net支持的平台。

源码在仓库根目录下的DeobfuscateStackTrace-githubDeobfuscateStackTrace-gitee。 可以自己编译,也可以直接从github release中下载。

命令行参数

命令行参数描述如下:

  -m, --mappingFile                     Required. mapping xml file

-i, --input Required. input obfuscated log file

-o, --output Required. output deobfuscated log file

-r, --removeMethodGeneratedByObfuz Remove methods generated by obfuscator (e.g.
'$Obfuz$ProxyCall:$Obfuz$ProxyCall$Dispatch')

--help Display this help screen.

--version Display version information.

使用方式

  • DeobfuscateStackTrace --help 查看帮助。
  • DeobfuscateStackTrace -m {symbol mapping file} -i {obfuscated log} -o {deobfuscate log} 命令将混淆后的堆栈日志还原为原始日志。 -m的参数是 ObfuzSettings.SymbolObfusSettings.SymbolMappingFile指向的的symbol mapping文件, -i 的参数是混淆后的日志文件, -o是输出的还原堆栈后的日志文件。

示例:

  • Windows 下

DeobfuscateStackTrace -m path/of/symbol-mapping.xml -i obfuscated.log -o deobfuscated.log

  • MacOS或Linux下
dotnet DeobfuscateStackTrace.dll -m path/of/symbol-mapping.xml -i obfuscated.log -o deobfuscated.log

移除Obfuz生成的函数

默认还原的堆栈中会包含$Obfuz$ProxyCall:$Obfuz$ProxyCall$Dispatch$35(Object, Object, Int32)之类的由Obfuz生成的函数,这类函数日志如果太多有时会影响阅读。 可以通过指定-r--removeMethodGeneratedByObfuz从输出的堆栈日志中移除此类函数的堆栈信息。

以Windows下的命令行为例:


DeobfuscateStackTrace -m path/of/symbol-mapping.xml -i obfuscated.log -o deobfuscated.log -r

会还原混淆后的堆栈日志,并且移除所有Obfuz生成的函数。