一个针对net文件的反混淆工具,一个广受认可的开源工具。
目录:
一、工具的下载和配置
二、工具的基本命令和使用
一、工具的下载和配置
开源工具源地址:https://github.com/de4dot/de4dot
下载源代码后,需要自行编译,其开发语言是C#,开发分为两个版本:一个是基于.NET Core的(de4dot.netcore.sln),一个是基于.NET Framework的(de4dot.netframework.sln),可以依据目标程序选择想要执行编译的版本。
dotnet build de4dot.netcore.slndotnet build de4dot.netcore.sln -c Release //release版本
也可以使用VS studio编译。
需要注意的是如果使用.net core版本,需要安装netcoreapp3.1和netcoreapp2.1;如果使用.net framework版本,需要安装net 35和net45。(VS studio2019以下版本默认有net45)
如果不想自己编译,有编译好的也可以直接用:
https://github.com/kant2002/de4dot/tree/v3.2.0
二、工具的基本命令和使用
1.工具支持的混淆类型
-
Agile.NET (aka CliSecure)
-
Babel.NET
-
CodeFort
-
CodeVeil
-
CodeWall
-
CryptoObfuscator
-
DeepSea Obfuscator
-
Dotfuscator
-
.NET Reactor
-
Eazfuscator.NET
-
Goliath.NET
-
ILProtector
-
MaxtoCode
-
MPRESS
-
Rummage
-
Skater.NET
-
SmartAssembly
-
Spices.Net
-
Xenocode
2.基本使用
直接把目标程序用de4dot.exe打开即可,也可以命令行
de4dot.exe <目标程序地址>
运行后文件在程序集的目录下生成一个带-cleaned的新程序集。
也可以通过 -f (指定目标net文件夹)和-o (指定输出路径)参数,指定输出路径
de4dot.exe file1 -f <目标程序文件夹地址> -o <输出文件夹>
或者是反混淆大型的NET项目,需要反混淆整个项目文件可以使用如下命令
1 de4dot -r <目标程序文件地址> -ru -ro <输出程序文件地址>
其中,-r:指定输入文件夹,包括子文件夹;-ru : 跳过不支持的混淆工具混淆过的文件;-ro : 指定输出文件夹。
这个工具还可以查看目标程序使用的混淆工具是什么,从而对症下药,寻找更有针对性的工具
de4dot.exe -f "D:\a\xxx.exe" -d
其中,-d就是扫描混淆工具,如果使用-r替换-f则输出整个文件的所有net混淆工具,实现遍历扫描
如果de4dot反混淆失败,而目标函数的混淆工具de4dot又支持,那么可能是de4dot反混淆识别出错导致,可以使用如下命令指定反混淆工具。
1 de4dot <目标程序地址> -p sa
其中sa是一个混淆工具的简称,具体工具和简称,可以在help界面查看,作者也罗列如下:
|
类型 |
参数 |
描述 |
默认值 |
|---|---|---|---|
| Agile.NET(an) | --an-name |
有效名称正则模式 | ^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
--an-methods |
解密方法 |
True | |
--an-rsrc |
解密资源 |
True | |
--an-stack |
移除所有 StackFrameHelper 代码 |
True | |
--an-vm |
还原 VM 代码 |
True | |
--an-initlocals |
在方法头中设置 initlocals |
True | |
| Babel .NET(bl) | --bl-name |
有效名称正则模式 | ^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
--bl-inline |
内联短方法 |
True | |
--bl-remove-inlined |
移除内联方法 |
True | |
--bl-methods |
解密方法 |
True | |
--bl-rsrc |
解密资源 |
True | |
--bl-consts |
解密常量和数组 |
True | |
--bl-embedded |
转储嵌入程序集 |
True | |
| CodeFort(cf) | --cf-name |
有效名称正则模式 | !^[a-zA-Z]{1,3}$&!^[_<>{}$.
-]$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$. |
--cf-embedded |
转储嵌入程序集 |
True | |
| CodeVeil(cv) | --cv-name |
有效名称正则模式 | !^[A-Za-z]{1,2}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
| CodeWall(cw) | --cw-name |
有效名称正则模式 | !^[0-9A-F]{32}$&!^[_<>{}$.
-]$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$. |
--cw-embedded |
转储嵌入程序集 |
True | |
--cw-decrypt-main |
解密主嵌入程序集 |
True | |
| Confuser(cr) | --cr-name |
有效名称正则模式 | ^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.
-]*$` |
--cr-antidb |
移除反调试代码 |
True | |
--cr-antidump |
移除反转储代码 |
True | |
--cr-decrypt-main |
解密主嵌入程序集 |
True | |
| Crypto Obfuscator(co) | --co-name |
有效名称正则模式 | !^(get_|set_|add_|remove_)?[A-Z]{1,3}(?:
\d+)?$&!^(get_|set_|add_|remove_)?c[0-9a-f]{32}(?: |
--co-tamper |
移除篡改保护代码 |
True | |
--co-consts |
解密常量 |
True | |
--co-inline |
内联短方法 |
True | |
--co-ldnull |
还原 ldnull 指令 |
True | |
| DeepSea(ds) | --ds-name |
有效名称正则模式 | ^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
--ds-inline |
内联短方法 |
True | |
--ds-remove-inlined |
移除内联方法 |
True | |
--ds-rsrc |
解密资源 |
True | |
--ds-embedded |
转储嵌入程序集 |
True | |
--ds-fields |
还原字段 |
True | |
--ds-keys |
重命名资源键 |
True | |
--ds-casts |
反混淆类型转换 |
True | |
| Dotfuscator(df) | --df-name |
有效名称正则模式 | !^(?:eval_)?[a-z][a-z0-9]{0,2}$&!^A_[0-9]+$&^[\u2E80-\u8FFFa-zA-Z_<{$][\u2E80-\u8FFFa-zA-Z_0-9<>{}$.
-]*$` |
--df-inline |
内联短方法 |
True | |
--df-remove-inlined |
移除内联方法 |
True | |
| .NET Reactor (dr3) | --dr3-name |
有效名称正则模式 | ^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
--dr3-types |
还原类型(object -> 实际类型) |
True | |
--dr3-inline |
内联短方法 |
True | |
--dr3-remove-inlined |
移除内联方法 |
True | |
--dr3-ns1 |
如果命名空间中只有一个类则清除命名空间 |
True | |
--dr3-sn |
移除反强名称代码 |
True | |
| .NET Reactor (dr4) | --dr4-name |
有效名称正则模式 | ^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
--dr4-methods |
解密方法 |
True | |
--dr4-bools |
解密布尔值 |
True | |
--dr4-types |
还原类型(object -> 实际类型) |
True | |
--dr4-inline |
内联短方法 |
True | |
--dr4-remove-inlined |
移除内联方法 |
True | |
--dr4-embedded |
转储嵌入程序集 |
True | |
--dr4-rsrc |
解密资源 |
True | |
--dr4-ns1 |
如果命名空间中只有一个类则清除命名空间 |
True | |
--dr4-sn |
移除反强名称代码 |
True | |
--dr4-sname |
重命名短名称 |
False | |
| Eazfuscator.NET(ef) | --ef-name |
有效名称正则模式 | !^[a-zA-Z]$&!^#=&!^dje_.+_ejd$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
| Goliath.NET(go) | --go-name |
有效名称正则模式 | !^[A-Za-z]{1,2}(?:
\d+)?$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$. |
--go-inline |
内联短方法 |
True | |
--go-remove-inlined |
移除内联方法 |
True | |
--go-locals |
还原局部变量 |
True | |
--go-ints |
解密整数 |
True | |
--go-arrays |
解密数组 |
True | |
--go-sn |
移除反强名称代码 |
True | |
| ILProtector(il) | --il-name |
有效名称正则模式 | ^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
| MaxtoCode(mc) | --mc-name |
有效名称正则模式 | !^[oO01l]+$&!^[A-F0-9]{20,}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
--mc-cp |
字符串代码页 |
936 | |
| MPRESS(mp) | --mp-name |
有效名称正则模式 | ^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
| Obfuscar(ob) | --ob-name |
有效名称正则模式 | ^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]{1,}$` |
| Rummage(rm) | --rm-name |
有效名称正则模式 | !. |
| Skater .NET(sk) | --sk-name |
有效名称正则模式 | !
[^0-9]+&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$. |
| SmartAssembly(sa) | --sa-name |
有效名称正则模式 | ^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
--sa-error |
移除自动错误报告代码 |
True | |
--sa-tamper |
移除篡改保护代码 |
True | |
--sa-memory |
移除内存管理器代码 |
True | |
| Spices.Net(sn) | --sn-name |
有效名称正则模式 | !^[a-zA-Z0-9]{1,2}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |
--sn-inline |
内联短方法 |
True | |
--sn-remove-inlined |
移除内联方法 |
True | |
--sn-ns1 |
如果命名空间中只有一个类则清除命名空间 |
True | |
--sn-rsrc |
还原资源名称 |
True | |
| Xenocode(xc) | --xc-name |
有效名称正则模式 | !^[oO01l]{4,}$&!^(get_|set_|add_|remove_|_)?[x_][a-f0-9]{16,}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.
-]*$` |

2415

被折叠的 条评论
为什么被折叠?



