[.NET逆向] [入门级]de4dot参数详解
为了避免被0xd4d(de4dot作者)认为是"N00bUser"
为了认识到Some of the advanced options may be incompatible, causing a nice exception.
With great power comes great responsibility.(de4dot开头2句话,可google翻译)
务必要了解如何带参数运行de4dot!!!
“de4dot弹出的用法都是英文,我看不懂怎么办?”
所以我写了一篇入门级教程,只要能认真看此贴,多用de4dot脱复杂些的壳,你一定能掌握de4dot的高级用法
在此之前,你需要准备好:
1. dnSpy(勾好这个选项)
<ignore_js_op>
2. de4dot(最新版请点击https://ci.appveyor.com/project/0xd4d/de4dot/branch/master/artifacts下载)
直接运行de4dot,看看de4dot告诉我们如何使用它。
这里我直接把英文以及翻译附上。会提到的参数标记为红色,这些比较常用
de4dot v3.1.41592.3405 Copyright (C) 2011-2015 de4dot@gmail.com
Latest version and source code: https://github.com/0xd4d/de4dotSome of the advanced options may be incompatible, causing a nice exception.
With great power comes great responsibility.de4dot.exe <options> <file options>
Options:
//全局参数
-r DIR Scan for .NET files in all subdirs
//搜索当前目录以及子目录中所有程序集并去混淆
-ro DIR Output base dir for recursively found files
//同-r参数,但是并不搜索子目录,仅限当前目录
-ru Skip recursively found files with unsupported obfuscator
//跳过查找到带有de4dot不支持的混淆器的程序集
-d Detect obfuscators and exit
//查明混淆器名称,然后退出de4dot
--asm-path PATH Add an assembly search path
//增加一个被搜索的目录
--dont-rename Don't rename classes, methods, etc.
//禁止所有重命名(比如类,方法,字段,属性,资源......)
--keep-names FLAGS
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
//禁止对指定内容重命名。比如我不想重命名命名空间、类名和方法名,那么我可以添加这样一个参数"--keep-names ntm",这里的n代表namespaces,t代表types,m代表methods
--dont-create-params
Don't create method params when renaming
//在重命名时不创建方法参数(?我也看不太懂)
--dont-restore-props
Don't restore properties/events
//不还原属性和事件
--default-strtyp TYPE
Default string decrypter type
//与--strtyp类似
--default-strtok METHOD
Default string decrypter method token or [type::][name][(args,...)]
//与--strtok类似
--no-cflow-deob No control flow deobfuscation (NOT recommended)
//不还原控制流混淆(举个例子,ConfuserEx的恐怖的switch,几乎只能让程序来还原)
--only-cflow-deob
Only control flow deobfuscation
//仅还原控制流混淆
--load-new-process
Load executed assemblies into a new process
//将程序集放在新进程中进行脱壳处理
--keep-types Keep obfuscator types, fields, methods
//保留混淆器类、字段和方法
--preserve-tokens
Preserve important tokens, #US, #Blob, extra sig data
//保持tokens不变,包括#US, #Blob, extra sig data。比如有个方法的token是0x06000008,不使用这个选项,去混淆之后某方法的token可能会变成0x06000004(比如这之前有4个无效方法被de4dot移除了),使用这个选项之后,无论怎样,方法的token始终是0x06000008
--preserve-table FLAGS
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
//保持表中指定种类的tokens不变。比如"--preserve-table ed,fd,md","--preserve-table all"
--preserve-strings
Preserve #Strings heap offsets
//保持#Strings堆偏移不变
--preserve-us Preserve #US heap offsets
//保持#US堆偏移不变
--preserve-blob Preserve #Blob heap offsets
//保持#Blob堆偏移不变
--preserve-sig-data
Preserve extra data at the end of signatures
//保持额外的签名数据偏移不变
--one-file Deobfuscate one file at a time
//一次只对一个程序集去混淆
-v Verbose
//显示详细信息
-vv Very verbose
//显示更多详细信息(?应该是,反正和-v一样都会显示信息)
-h Show this help message
//显示帮助,就是我翻译的这些内容
--help Same as -h
//同-hFile options:
//局部参数
-f FILE Name of .NET file
//指定被去混淆的程序集的路径(可以是相对路径或者绝对路径)
-o FILE Name of output file
//指定输出去混淆后的程序集的路径(可以是相对路径或者绝对路径)
-p TYPE Obfuscator type (see below)
//指定混淆器类型(下面写了)
--strtyp TYPE String decrypter type
//指定如何使用字符串解密器(字符串解密器指的是被混淆程序集中的一个方法)
--strtok METHOD String decrypter method token or [type::][name][(args,...)]
//指定哪一个方法作为字符串解密器Deobfuscator options:
//混淆器参数(我就不翻译了,因为有些没用过,不是很常用)
//比如"--un-name REGEX Valid name regex pattern (^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.`-]*$)"
//全大写单词代表一个参数,最尾处有一个括号,里面代表默认参数,如果你不填这个参数,那么de4dot认为你输入了--un-name "^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.`-]*$",因为这是默认的
//这里有个地方要注意,REGEX的内容一定要用""包起来,比如--un-name ^就是无效的,--un-name "^"是有效的
//而BOOL只要直接输入True/False,比如--an-methods True
Type un (Unknown)
--un-name REGEX Valid name regex pattern (^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.`-]*$)Type an (Agile.NET)
--an-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--an-methods BOOL
Decrypt methods (True)
--an-rsrc BOOL Decrypt resources (True)
--an-stack BOOL Remove all StackFrameHelper code (True)
--an-vm BOOL Restore VM code (True)
--an-initlocals BOOL
Set initlocals in method header (True)Type bl (Babel .NET)
--bl-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--bl-inline BOOL Inline short methods (True)
--bl-remove-inlined BOOL
Remove inlined methods (True)
--bl-methods BOOL
Decrypt methods (True)
--bl-rsrc BOOL Decrypt resources (True)
--bl-consts BOOL Decrypt constants and arrays (True)
--bl-embedded BOOL
Dump embedded assemblies (True)Type cf (CodeFort)
--cf-name REGEX Valid name regex pattern (!^[a-zA-Z]{1,3}$&!^[_<>{}$.`-]$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--cf-embedded BOOL
Dump embedded assemblies (True)Type cv (CodeVeil)
--cv-name REGEX Valid name regex pattern (!^[A-Za-z]{1,2}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)Type cw (CodeWall)
--cw-name REGEX Valid name regex pattern (!^[0-9A-F]{32}$&!^[_<>{}$.`-]$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--cw-embedded BOOL
Dump embedded assemblies (True)
--cw-decrypt-main BOOL
Decrypt main embedded assembly (True)Type cr (Confuser)
--cr-name REGEX Valid name regex pattern (^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.`-]*$)
--cr-antidb BOOL Remove anti debug code (True)
--cr-antidump BOOL
Remove anti dump code (True)
--cr-decrypt-main BOOL
Decrypt main embedded assembly (True)Type co (Crypto Obfuscator)
--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<>{}$.`-]*$)
--co-tamper BOOL Remove tamper protection code (True)
--co-consts BOOL Decrypt constants (True)
--co-inline BOOL Inline short methods (True)
--co-ldnull BOOL Restore ldnull instructions (True)Type ds (DeepSea)
--ds-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--ds-inline BOOL Inline short methods (True)
--ds-remove-inlined BOOL
Remove inlined methods (True)
--ds-rsrc BOOL Decrypt resources (True)
--ds-embedded BOOL
Dump embedded assemblies (True)
--ds-fields BOOL Restore fields (True)
--ds-keys BOOL Rename resource keys (True)
--ds-casts BOOL Deobfuscate casts (True)Type df (Dotfuscator)
--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<>{}$.`-]*$)Type dr3 (.NET Reactor)
--dr3-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--dr3-types BOOL Restore types (object -> real type) (True)
--dr3-inline BOOL
Inline short methods (True)
--dr3-remove-inlined BOOL
Remove inlined methods (True)
--dr3-ns1 BOOL Clear namespace if there's only one class in it (True)
--dr3-sn BOOL Remove anti strong name code (True)Type dr4 (.NET Reactor)
--dr4-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--dr4-methods BOOL
Decrypt methods (True)
--dr4-bools BOOL Decrypt booleans (True)
--dr4-types BOOL Restore types (object -> real type) (True)
--dr4-inline BOOL
Inline short methods (True)
--dr4-remove-inlined BOOL
Remove inlined methods (True)
--dr4-embedded BOOL
Dump embedded assemblies (True)
--dr4-rsrc BOOL Decrypt resources (True)
--dr4-ns1 BOOL Clear namespace if there's only one class in it (True)
--dr4-sn BOOL Remove anti strong name code (True)
--dr4-sname BOOL Rename short names (False)Type ef (Eazfuscator.NET)
--ef-name REGEX Valid name regex pattern (!^[a-zA-Z]$&!^#=&!^dje_.+_ejd$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)Type go (Goliath.NET)
--go-name REGEX Valid name regex pattern (!^[A-Za-z]{1,2}(?:`\d+)?$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--go-inline BOOL Inline short methods (True)
--go-remove-inlined BOOL
Remove inlined methods (True)
--go-locals BOOL Restore locals (True)
--go-ints BOOL Decrypt integers (True)
--go-arrays BOOL Decrypt arrays (True)
--go-sn BOOL Remove anti strong name code (True)Type il (ILProtector)
--il-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)Type mc (MaxtoCode)
--mc-name REGEX Valid name regex pattern (!^[oO01l]+$&!^[A-F0-9]{20,}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--mc-cp INT String code page (936)Type mp (MPRESS)
--mp-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)Type rm (Rummage)
--rm-name REGEX Valid name regex pattern (!.)Type sk (Skater .NET)
--sk-name REGEX Valid name regex pattern (!`[^0-9]+&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)Type sa (SmartAssembly)
--sa-name REGEX Valid name regex pattern (^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--sa-error BOOL Remove automated error reporting code (True)
--sa-tamper BOOL Remove tamper protection code (True)
--sa-memory BOOL Remove memory manager code (True)Type sn (Spices.Net)
--sn-name REGEX Valid name regex pattern (!^[a-zA-Z0-9]{1,2}$&^[\u2E80-\u9FFFa-zA-Z_<{$][\u2E80-\u9FFFa-zA-Z_0-9<>{}$.`-]*$)
--sn-inline BOOL Inline short methods (True)
--sn-remove-inlined BOOL
Remove inlined methods (True)
--sn-ns1 BOOL Clear namespace if there's only one class in it (True)
--sn-rsrc BOOL Restore resource names (True)Type xc (Xenocode)
--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<>{}$.`-]*$)String decrypter types
//如何使用字符串解密器
none Don't decrypt strings
//不解密
default Use default string decrypter type (usually static)
//默认(?)
static Use static string decrypter if available
//静态(?)
delegate Use a delegate to call the real string decrypter
//创建一个委托,传入相应参数,获取解密后的字符串
emulate Call real string decrypter and emulate certain instructions
//模拟(?)Multiple regexes can be used if separated by '&'.
//如果要用多个正则,可以使用&连接
Use '!' if you want to invert the regex. Example: !^[a-z\d]{1,2}$&!^[A-Z]_\d+$&^[\w.]+$
//要反转正则表达式可以使用"!"Examples:
de4dot.exe -r c:\my\files -ro c:\my\output
de4dot.exe file1 file2 file3
de4dot.exe file1 -f file2 -o file2.out -f file3 -o file3.out
de4dot.exe file1 --strtyp delegate --strtok 06000123
de4dot的参数格式是:先输入全局参数,再输入文件参数/去混淆器参数(这2个不用分顺序)
比如:de4dot.exe --dont-rename x.exe --strtype delegate --strtok 0x0600001F
1.Options(全局参数)
--dont-rename
和翻译一样,有的时候要用,因为混淆器会对反射代码特别处理,而de4dot可能没有处理好,导致反射时出错
可以看我的这个帖子 https://www.52pojie.cn/forum.php?mod=viewthread&tid=762380 里面就是因为de4dot没正确处理反射代码,导致需要加上这个参数重新破解一次
--preserve-*
相当于dnSpy中的这些选项,有的时候要加上
<ignore_js_op>
-v和-vv
有时de4dot就抛出个"Hmmmm... something didn't work. Try the latest version.",谁也不知道为什么de4dot会不起作用。所以需要添加-v或-vv使de4dot显示更详细的信息。
2.File Options(局部参数)
-p TYPE
如果不指明这个参数,de4dot会自动查明混淆器类型,并且使用对应的去混淆器来去混淆。
如果查明有多个混淆器,则使用查明的的第一个混淆器对应的去混淆器来去混淆。
tuts4you上有一个crackme,加了2层壳 https://forum.tuts4you.com/topic/36942-crackme-unpackme-deepsea-obfuscator-41-and-cryptoobfuscator/
<ignore_js_op> UnpackMe & CrackMe .rar (20.32 KB, 下载次数: 34)
如果我们直接把它拖入de4dot
<ignore_js_op>
<ignore_js_op>
打开dnSpy,可以发现这个和没脱壳一样。
所以我们需要手动指定先去哪一层混淆
这里我们用-p ds(ds是DeepSea)
<ignore_js_op>
<ignore_js_op>
可以发现效果非常好,再把"UnpackMe & CrackMe -cleaned.exe"直接拖入de4dot,让de4dot处理剩下的那一个混淆器,完成
<ignore_js_op>
--*-name REGEX
没啥说的,但是挺有用。
现在de4dot这么有名,很多时候混淆器为了逃避de4dot重命名使用了合法字符来重命名,比如我写了一个重命名:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
public static class Renamer { private static readonly Regex _validNameRegex = new Regex( "^[a-zA-Z_<{$][a-zA-Z_0-9<>{}$.`-]*$" ); private static void RenameAll(ModuleDef module) { foreach (TypeDef type in module.GetTypes()) if (!type.IsGlobalModuleType) { type.Namespace = GenerateNamespaceName(); type.Name = GenerateName(); foreach (FieldDef field in type.Fields) field.Name = GenerateName(); foreach (MethodDef method in type.Methods) { if (!(method.IsSpecialName || method.IsAbstract || method.IsVirtual)) method.Name = GenerateName(); foreach (ParamDef param in method.ParamDefs) param.Name = GenerateName(); } } } private static string GenerateName() { StringBuilder stringBuilder; string name; do { stringBuilder = new StringBuilder(_random.Next(10, 30)); for ( int i = 0; i < stringBuilder.Capacity; i++) stringBuilder.Append(_nameChars[_random.Next(_nameChars.Length)]); name = stringBuilder.ToString(); } while (!_validNameRegex.IsMatch(name)); return name; } private static string GenerateNamespaceName() { string name; name = GenerateName(); foreach ( string part in name.Split( '.' )) if (!_validNameRegex.IsMatch(part)) return GenerateNamespaceName(); return name; } } |
<ignore_js_op>
de4dot的默认正则表达式对这个重命名完全无效,所以我们使用参数--un-name "^[*删掉留下星号]",表示重命名所有内容
<ignore_js_op>
<ignore_js_op>
--strtyp TYPE和--strtok METHOD
这2个参数一般一起用,很多情况下还会和"-p un"一起用,--strtyp一般只接delegate,即--strtyp delegate,因为我把剩下的none static emulate default都试了一遍,没啥用...
--strtok接一个方法token,比如刚才这个crackme,就可以直接解密字符串来破解
演示一遍:
用dnSpy打开刚才的crackme,随便翻(翻不出可以同dnspy调试)
<ignore_js_op>
可以发现我鼠标指着的方法是字符串解密器
<ignore_js_op>
复制出token
我只需要解密字符串,而de4dot会自动使用对应的去混淆器,所以我还要指定-p un
<ignore_js_op>
dnspy打开解密之后的程序集,找到Form1类,看看哪些方法符合这个签名:void XX(object,EventArgs)
<ignore_js_op>
<ignore_js_op>
是不是非常简单呢
https://www.52pojie.cn/forum.php?mod=viewthread&tid=762674
[.NET逆向] [入门级]de4dot参数详解的更多相关文章
- Nginx主配置参数详解,Nginx配置网站
1.Niginx主配置文件参数详解 a.上面博客说了在Linux中安装nginx.博文地址为:http://www.cnblogs.com/hanyinglong/p/5102141.html b.当 ...
- iptables参数详解
iptables参数详解 搬运工:尹正杰 注:此片文章来源于linux社区. Iptalbes 是用来设置.维护和检查Linux内核的IP包过滤规则的. 可以定义不同的表,每个表都包含几个内部的链,也 ...
- chattr的常用参数详解
chattr的常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在实际生产环境中,有的运维工程师不得不和开发和测试打交道,在我们公司最常见的就是部署接口.每天每个人部署的 ...
- mha配置参数详解
mha配置参数详解: 参数名字 是否必须 参数作用域 默认值 示例 hostname Yes Local Only - hostname=mysql_server1, hostname=192.168 ...
- $.ajax()方法所有参数详解;$.get(),$.post(),$.getJSON(),$.ajax()详解
[一]$.ajax()所有参数详解 url: 要求为String类型的参数,(默认为当前页地址)发送请求的地址. type: 要求为String类型的参数,请求方式(post或get)默认为get.注 ...
- linux PHP 编译安装参数详解
linux PHP 编译安装参数详解 ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc -- ...
- 【转】jqGrid 各种参数 详解
[原文]http://www.cnblogs.com/younggun/archive/2012/08/27/2657922.htmljqGrid 各种参数 详解 JQGrid JQGrid是一个 ...
- HTML滚动字幕代码参数详解及Js间隔滚动代码
html文字滚动代码 <marquee style="WIDTH: 388px; HEIGHT: 200px" scrollamount="2" dire ...
- mysql5.6主从参数详解
mysql5.6的主从相当的不错,增加了不少参数,提升了主从同步的安全和效率,以下是mysql5.6主从参数详解. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 ...
随机推荐
- 为 Linux 应用程序编写 DLL
插件和 DLL 通常是用来无须编写整个新应用程序而添加功能的极好方法. 在 Linux 中,插件和 DLL 是以动态库形式实现的. 电子商务顾问兼设计师 Allen Wilson 介绍了动态库,并且向 ...
- Android源码分析(二)-----如何编译修改后的framework资源文件
一 : 编译framework资源文件 如果修改android framework资源文件,需要先编译资源文件,然后再编译framework才可以正常引用, 进入项目目录 cd work/source ...
- Linux普通用户登录后,命令行提示:-bash-4.1$ ,原因分析及解决
原文 有时候在使用用户登陆Linux系统时会发现,命令行提示符成了:-bash-4.1$,不显示用户名,路径信息. 原因:用户家目录里面与环境变量有关的文件被删除所导致的 也就是这俩文件:.bash_ ...
- lavavel 定时任务 (command的第二个参数)
之前好像没有写过,记录一下 $schedule->command()方法 第一个参数不用说,可以传纯字符串或者类::class,不过第二个参数确很少人提到 /** * Add a new Art ...
- JAVA线程池的创建与使用
为什么要用线程池? 我们都知道,每一次创建一个线程,JVM后面的工作包括:为线程建立虚拟机栈.本地方法栈.程序计数器的内存空间(下图可看出),所以线程过多容易导致内存空间溢出.同时,当频繁的创建和销毁 ...
- 【使用DIV+CSS重写网站首页案例】CSS引入方式
CSS引入方式(3种) *就近原则:行内引入可以覆盖内部引入的效果 内部引入: * type="text/css" 为默认可以不写 例子: <!DOCTYPE h ...
- vue.js集成codeMirror代码编辑器
1.前端代码 <link href="https://cdn.bootcss.com/codemirror/5.48.4/codemirror.css" rel=" ...
- 洛谷P1084 疫情控制(贪心+倍增)
这个题以前写过一遍,现在再来写,感觉以前感觉特别不好写的细节现在好些多了,还是有进步吧. 这个题的核心思想就是贪心+二分.因为要求最小时间,直接来求问题将会变得十分麻烦,但是如果转换为二分答案来判断可 ...
- jmeter4+win10+jdk1.8环境下,jmeter输入中文就卡死的问题
问题描述:jmeter4+win10+jdk1.8环境下,输入中文jmeter卡死: 解决思路: 起初以为是win10系统不兼容的问题,装了个虚拟机,在虚拟机里面装了win7,然后再装了jmeter, ...
- PVE手册资料
PVE 软件源/etc/apt/souces.list apt-get update命令获取软件源中的软件包信息 企业版软件源 /etc/apt/sources.list.d/pve-enterpri ...