De4dot

参数详解

吾爱破解有比较详细的帖子

下载链接

CSDN
GitHub
爱盘

Options

  1. //全局参数
  2. -r DIR Scan for .NET files in all subdirs
  3. //搜索当前目录以及子目录中所有程序集并去混淆
  4. -ro DIR Output base dir for recursively found files
  5. //同-r参数,但是并不搜索子目录,仅限当前目录
  6. -ru Skip recursively found files with unsupported obfuscator
  7. //跳过查找到带有de4dot不支持的混淆器的程序集
  8. -d Detect obfuscators and exit
  9. //查明混淆器名称,然后退出de4dot
  10. --asm-path PATH Add an assembly search path
  11. //增加一个被搜索的目录
  12. --dont-rename Don't rename classes, methods, etc.
  13. //禁止所有重命名(比如类,方法,字段,属性,资源......)
  14. --keep-names FLAGS
  15. Don't rename n(amespaces), t(ypes), p(rops), e(vents), f(ields), m(ethods), a(rgs), g(enericparams), d(elegate fields). Can be combined, eg. efm
  16. //禁止对指定内容重命名。比如我不想重命名命名空间、类名和方法名,那么我可以添加这样一个参数"--keep-names ntm",这里的n代表namespaces,t代表types,m代表methods
  17. --dont-create-params
  18. Don't create method params when renaming
  19. //在重命名时不创建方法参数(?我也看不太懂)
  20. --dont-restore-props
  21. Don't restore properties/events
  22. //不还原属性和事件
  23. --default-strtyp TYPE
  24. Default string decrypter type
  25. //与--strtyp类似
  26. --default-strtok METHOD
  27. Default string decrypter method token or [type::][name][(args,...)]
  28. //与--strtok类似
  29. --no-cflow-deob No control flow deobfuscation (NOT recommended)
  30. //不还原控制流混淆(举个例子,ConfuserEx的恐怖的switch,几乎只能让程序来还原)
  31. --only-cflow-deob
  32. Only control flow deobfuscation
  33. //仅还原控制流混淆
  34. --load-new-process
  35. Load executed assemblies into a new process
  36. //将程序集放在新进程中进行脱壳处理
  37. --keep-types Keep obfuscator types, fields, methods
  38. //保留混淆器类、字段和方法
  39. --preserve-tokens
  40. Preserve important tokens, #US, #Blob, extra sig data
  41. //保持tokens不变,包括#US, #Blob, extra sig data。比如有个方法的token是0x06000008,不使用这个选项,去混淆之后某方法的token可能会变成0x06000004(比如这之前有4个无效方法被de4dot移除了),使用这个选项之后,无论怎样,方法的token始终是0x06000008
  42. --preserve-table FLAGS
  43. Preserve rids in table: tr (TypeRef), td (TypeDef), fd (Field), md (Method), pd (Param), mr (MemberRef), s (StandAloneSig), ed (Event), pr (Property), ts (TypeSpec), ms (MethodSpec), all (all previous tables). Use - to disable (eg. all,-pd). Can be combined: ed,fd,md
  44. //保持表中指定种类的tokens不变。比如"--preserve-table ed,fd,md","--preserve-table all"
  45. --preserve-strings
  46. Preserve #Strings heap offsets
  47. //保持#Strings堆偏移不变
  48. --preserve-us Preserve #US heap offsets
  49. //保持#US堆偏移不变
  50. --preserve-blob Preserve #Blob heap offsets
  51. //保持#Blob堆偏移不变
  52. --preserve-sig-data
  53. Preserve extra data at the end of signatures
  54. //保持额外的签名数据偏移不变
  55. --one-file Deobfuscate one file at a time
  56. //一次只对一个程序集去混淆
  57. -v Verbose
  58. //显示详细信息
  59. -vv Very verbose
  60. //显示更多详细信息(?应该是,反正和-v一样都会显示信息)
  61. -h Show this help message
  62. //显示帮助,就是我翻译的这些内容
  63. --help Same as -h
  64. //同-h

File options

  1. //局部参数
  2. -f FILE Name of .NET file
  3. //指定被去混淆的程序集的路径(可以是相对路径或者绝对路径)
  4. -o FILE Name of output file
  5. //指定输出去混淆后的程序集的路径(可以是相对路径或者绝对路径)
  6. -p TYPE Obfuscator type (see below)
  7. //指定混淆器类型(下面写了)
  8. --strtyp TYPE String decrypter type
  9. //指定如何使用字符串解密器(字符串解密器指的是被混淆程序集中的一个方法)
  10. --strtok METHOD String decrypter method token or [type::][name][(args,...)]
  11. //指定哪一个方法作为字符串解密器

Deobfuscator options

  1. //混淆器参数(我就不翻译了,因为有些没用过,不是很常用)
  2. //比如"--un-name REGEX Valid name regex pattern (^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.`-]*$)"
  3. //全大写单词代表一个参数,最尾处有一个括号,里面代表默认参数,如果你不填这个参数,那么de4dot认为你输入了--un-name "^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.`-]*$",因为这是默认的
  4. //这里有个地方要注意,REGEX的内容一定要用""包起来,比如--un-name ^就是无效的,--un-name "^"是有效的
  5. //而BOOL只要直接输入True/False,比如--an-methods True
  6. Type un (Unknown)
  7. --un-name REGEX Valid name regex pattern (^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.`-]*$)

Type

  1. Type an (Agile.NET)
  2. --an-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  3. --an-methods BOOL
  4. Decrypt methods (True)
  5. --an-rsrc BOOL Decrypt resources (True)
  6. --an-stack BOOL Remove all StackFrameHelper code (True)
  7. --an-vm BOOL Restore VM code (True)
  8. --an-initlocals BOOL
  9. Set initlocals in method header (True)
  10. Type bl (Babel .NET)
  11. --bl-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  12. --bl-inline BOOL Inline short methods (True)
  13. --bl-remove-inlined BOOL
  14. Remove inlined methods (True)
  15. --bl-methods BOOL
  16. Decrypt methods (True)
  17. --bl-rsrc BOOL Decrypt resources (True)
  18. --bl-consts BOOL Decrypt constants and arrays (True)
  19. --bl-embedded BOOL
  20. Dump embedded assemblies (True)
  21. Type cf (CodeFort)
  22. --cf-name REGEX Valid name regex pattern (!^[a-zA-Z]{1,3}$&!^[_<>{}$.`-]$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  23. --cf-embedded BOOL
  24. Dump embedded assemblies (True)
  25. Type cv (CodeVeil)
  26. --cv-name REGEX Valid name regex pattern (!^[A-Za-z]{1,2}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  27. Type cw (CodeWall)
  28. --cw-name REGEX Valid name regex pattern (!^[0-9A-F]{32}$&!^[_<>{}$.`-]$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  29. --cw-embedded BOOL
  30. Dump embedded assemblies (True)
  31. --cw-decrypt-main BOOL
  32. Decrypt main embedded assembly (True)
  33. Type cr (Confuser)
  34. --cr-name REGEX Valid name regex pattern (^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.`-]*$)
  35. --cr-antidb BOOL Remove anti debug code (True)
  36. --cr-antidump BOOL
  37. Remove anti dump code (True)
  38. --cr-decrypt-main BOOL
  39. Decrypt main embedded assembly (True)
  40. Type co (Crypto Obfuscator)
  41. --co-name REGEX Valid name regex pattern (!^(get_|set_|add_|remove_)?[A-Z]{1,3}(?:`\d+)?$&!^(get_|set_|add_|remove_)?c[0-9a-f]{32}(?:`\d+)?$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  42. --co-tamper BOOL Remove tamper protection code (True)
  43. --co-consts BOOL Decrypt constants (True)
  44. --co-inline BOOL Inline short methods (True)
  45. --co-ldnull BOOL Restore ldnull instructions (True)
  46. Type ds (DeepSea)
  47. --ds-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  48. --ds-inline BOOL Inline short methods (True)
  49. --ds-remove-inlined BOOL
  50. Remove inlined methods (True)
  51. --ds-rsrc BOOL Decrypt resources (True)
  52. --ds-embedded BOOL
  53. Dump embedded assemblies (True)
  54. --ds-fields BOOL Restore fields (True)
  55. --ds-keys BOOL Rename resource keys (True)
  56. --ds-casts BOOL Deobfuscate casts (True)
  57. Type df (Dotfuscator)
  58. --df-name REGEX Valid name regex pattern (!^(?:eval_)?[a-z][a-z0-9]{0,2}$&!^A_[0-9]+$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  59. Type dr3 (.NET Reactor)
  60. --dr3-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  61. --dr3-types BOOL Restore types (object -> real type) (True)
  62. --dr3-inline BOOL
  63. Inline short methods (True)
  64. --dr3-remove-inlined BOOL
  65. Remove inlined methods (True)
  66. --dr3-ns1 BOOL Clear namespace if there's only one class in it (True)
  67. --dr3-sn BOOL Remove anti strong name code (True)
  68. Type dr4 (.NET Reactor)
  69. --dr4-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  70. --dr4-methods BOOL
  71. Decrypt methods (True)
  72. --dr4-bools BOOL Decrypt booleans (True)
  73. --dr4-types BOOL Restore types (object -> real type) (True)
  74. --dr4-inline BOOL
  75. Inline short methods (True)
  76. --dr4-remove-inlined BOOL
  77. Remove inlined methods (True)
  78. --dr4-embedded BOOL
  79. Dump embedded assemblies (True)
  80. --dr4-rsrc BOOL Decrypt resources (True)
  81. --dr4-ns1 BOOL Clear namespace if there's only one class in it (True)
  82. --dr4-sn BOOL Remove anti strong name code (True)
  83. --dr4-sname BOOL Rename short names (False)
  84. Type ef (Eazfuscator.NET)
  85. --ef-name REGEX Valid name regex pattern (!^[a-zA-Z]$&!^#=&!^dje_.+_ejd$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  86. Type go (Goliath.NET)
  87. --go-name REGEX Valid name regex pattern (!^[A-Za-z]{1,2}(?:`\d+)?$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  88. --go-inline BOOL Inline short methods (True)
  89. --go-remove-inlined BOOL
  90. Remove inlined methods (True)
  91. --go-locals BOOL Restore locals (True)
  92. --go-ints BOOL Decrypt integers (True)
  93. --go-arrays BOOL Decrypt arrays (True)
  94. --go-sn BOOL Remove anti strong name code (True)
  95. Type il (ILProtector)
  96. --il-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  97. Type mc (MaxtoCode)
  98. --mc-name REGEX Valid name regex pattern (!^[oO01l]+$&!^[A-F0-9]{20,}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  99. --mc-cp INT String code page (936)
  100. Type mp (MPRESS)
  101. --mp-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  102. Type rm (Rummage)
  103. --rm-name REGEX Valid name regex pattern (!.)
  104. Type sk (Skater .NET)
  105. --sk-name REGEX Valid name regex pattern (!`[^0-9]+&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  106. Type sa (SmartAssembly)
  107. --sa-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  108. --sa-error BOOL Remove automated error reporting code (True)
  109. --sa-tamper BOOL Remove tamper protection code (True)
  110. --sa-memory BOOL Remove memory manager code (True)
  111. Type sn (Spices.Net)
  112. --sn-name REGEX Valid name regex pattern (!^[a-zA-Z0-9]{1,2}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
  113. --sn-inline BOOL Inline short methods (True)
  114. --sn-remove-inlined BOOL
  115. Remove inlined methods (True)
  116. --sn-ns1 BOOL Clear namespace if there's only one class in it (True)
  117. --sn-rsrc BOOL Restore resource names (True)
  118. Type xc (Xenocode)
  119. --xc-name REGEX Valid name regex pattern (!^[oO01l]{4,}$&!^(get_|set_|add_|remove_|_)?[x_][a-f0-9]{16,}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)

字符串解密器

  1. String decrypter types
  2. //如何使用字符串解密器
  3. none Don't decrypt strings
  4. //不解密
  5. default Use default string decrypter type (usually static)
  6. //默认(?)
  7. static Use static string decrypter if available
  8. //静态(?)
  9. delegate Use a delegate to call the real string decrypter
  10. //创建一个委托,传入相应参数,获取解密后的字符串
  11. emulate Call real string decrypter and emulate certain instructions
  12. //模拟(?)
  13. Multiple regexes can be used if separated by '&'.
  14. //如果要用多个正则,可以使用&连接
  15. Use '!' if you want to invert the regex. Example: !^[a-z\d]{1,2}$&!^[A-Z]_\d+$&^[\w.]+$
  16. //要反转正则表达式可以使用"!"

语法例子

  1. de4dot.exe -r c:\my\files -ro c:\my\output
  2. de4dot.exe file1 file2 file3
  3. de4dot.exe file1 -f file2 -o file2.out -f file3 -o file3.out
  4. de4dot.exe file1 --strtyp delegate --strtok 06000123

使用

查壳

常见的比如PEiD、Exeinfo PE:解混淆 - .NET解混淆器和解包器-De4dot - 图1

dnspy

混淆后,阅读性极差
解混淆 - .NET解混淆器和解包器-De4dot - 图2

解混淆

运行软件

以控制台界面,在所在目录打开运行
可通过Shift+右击,选择在此处打开PowerShell窗口
解混淆 - .NET解混淆器和解包器-De4dot - 图3

需要解混淆的文件,放在同目录下面比较方便,不放的话,输入绝对路径也行

  1. de4dot.exe [同文件夹下要解混淆的文件名(或者绝对路径)] -o [解混淆后.exe(或者绝对路径)]

解混淆 - .NET解混淆器和解包器-De4dot - 图4
解混淆 - .NET解混淆器和解包器-De4dot - 图5

解混淆后查壳

解混淆一查,还是有混淆,应该是没解干净,不过还是有变的信息?

解混淆 - .NET解混淆器和解包器-De4dot - 图6

解混淆后dnspy

解混淆 - .NET解混淆器和解包器-De4dot - 图7