rkhunter 脚本学习记录(一)

系统:ubuntu 12.04       rkhunter 版本:1.4.2



一.Global function definitions(全局函数共126个):


1. display() 函数

  1).作用:用来在终端显示文本信息,并在日志文件中保存该文本信息。

  2).分析:按完成的功能分为几个部分,作者都加了注释。

  3).重构/自定义:完成的功能写成函数的形式,好处是什么。或者说哪里调用了该函数。


2. name2text() 函数

  1).作用:修改字符串中的控制字符。

  2).分析:echo $ECHOOPT  "$*" | sed -e 's/ /<SP>/g; s/ /<TAB>/g' | tr -d '\n' | tr '[:cntrl:]' '?'

                   sed -e 执行替换,tr 删除字符或完成替换。$ECHOOPT应该是用于输出菜单的变量。

                   $* 表示所有参数。 

  3).重构/自定义:


3. keypresspause() 函数

  1).作用:显示提示信息给用户。

  2).分析:函数结构如下。-a 代表and,与的关系。后面可以添加多个判断。类似汉语的 如果(if)....就(then).... 。 

                   if [$xx -eq 0 -a $xxx -eq 0 ] ; then

                      exec .... 

                   fi


  3).重构/自定义:

  

4. get_option() 函数

   1).作用:处理配置文件选项。

   2).分析:

   3).重构/自定义:


5. check_paths() 函数

   1).作用:检查路径名清单,确保清单提供的文件和目录有效。 

   2).分析:

   3).重构/自定义:


6. expand_paths() 函数

   1).作用:输出路径名列表。

   2).分析:

   3).重构/自定义:


7. make_space_list() 函数

   1).作用:参数格式转换。

   2).分析:

   3).重构/自定义:


8. check_is_digit() 函数

   1).作用:检查可选项是否是0或1 的数字。

   2).分析:

   3).重构/自定义:


9. get_temp_file() 函数

   1).作用:查找临时文件路径。

   2).分析:

   3).重构/自定义:


10. suckit_extra_checks() 函数

   1).作用:居然在函数名和注释里面用这个词,”suckit“ 是啥意思啊?

                    该函数针对使用 “suckit” 这一形容词描述(一类)的rootkit做的检查。 

   2).分析:

   3).重构/自定义:


11. scanrootkit() 函数

   1).作用:执行rootkit检查。

   2).分析:

   3).重构/自定义:


12. check_required_commands() 函数

   1).作用:检查需要的命令系统中是否存在。

   2).分析:

   3).重构/自定义:


13. check_commands() 函数

   1).作用: 测试并检查使用了变量的命令。

   2).分析:

   3).重构/自定义:


14. get_installdir_option() 函数

   1).作用:获取安装路径信息。

   2).分析:

   3).重构/自定义:


15. get_language_option() 函数

   1).作用:从配置文件或命令行获取语言配置信息。

   2).分析:

   3).重构/自定义:


16. get_logfile_option() 函数

   1).作用:获取日志文件配置信息。

   2).分析:

   3).重构/自定义:

 

17. get_tmpdir_option() 函数

   1).作用:获取临时文件配置信息。

   2).分析:

   3).重构/自定义:


18. get_dbdir_option() 函数

   1).作用:获取DB_PATH配置信息。

   2).分析:

   3).重构/自定义:


19. add_extra_dirs() 函数

   1).作用:获取额外的可执行文件路径,并添加到EXTRA_DIRS 变量中。

                    例如:/opt/bin   /opt/sbin;/sw/bin   /sw/sbin等等。   

   2).分析:

                     test命令:test 命令是使得在各种情况下都能够确定要判断的条件是否存在的工具。test命令最短的定义可以是评估一个表达式。

              若条件为真,则返回一个0值。若表达式不为真,则返回一个大于0的值。检查最后所执行命令的状态的简便方法是使用$?值。

          test 4 -gt 3  ;echo $?

                     test命令期望在命令行中找到一个参数,当shell没有为变量赋值时,则将该变量视为空。即在处理脚本时,一旦脚本寻找的参数不

              存在,则通过test命令报告该错误。

                  

          test -r file1.sh
          echo $?         
          #若输出0则代表有该文件,否则说明没有该文件。

                当试图保护脚本时,可通过将所有参数包含在双引号中来解决。然后shell将变量展开,若变量没有值,那么将传递一个空值给test。

              另一种方法是在脚本内增加一个额外检查过程来判断是否设置了命令行参数。若没有设置命令行参数,那么脚本会告诉用户缺少参数,

              然后退出。


   3).重构/自定义:


20. get_bindir_option() 函数

   1).作用:获取BINDIR路径。

   2).分析:

   3).重构/自定义:


21. get_scriptdir_option() 函数

   1).作用:获取并设置SCRIPT_PATH路径,做为安装时可选项。

   2).分析:

   3).重构/自定义:


22 .find_cmd() 函数

   1).作用:在BINPATHS路径下查找需要的命令,并返回结果。

   2).分析:

   3).重构/自定义:

 

23. get_rootdir_option() 函数

   1).作用:检查ROOTDIR是否已经配置。

   2).分析:

   3).重构/自定义:


24. get_existwl_option() 函数

   1).作用:函数是要从配置文件(/etc/rkhunter.conf)中获取白名单设置。

   2).分析:$ERRCODE????   

   3).重构/自定义:


25. get_mailonwarn_option() 函数

   1).作用:从配置文件中得到配置信息。

   2).分析:

   3).重构/自定义:


26. get_webcmd_option() 函数

   1).作用:从配置文件中得到配置信息。

   2).分析:

   3).重构/自定义:


27. get_syslog_option() 函数

   1).作用:从配置文件或命令行获取是否使用日志。

   2).分析:

   3).重构/自定义:


28. get_ssh_options() 函数

   1).作用:从配置文件中获取SSH配置信息。

   2).分析:

   3).重构/自定义:


29. get_syslog_config_options() 函数

   1).作用:从配置文件中获取系统日志配置项。

   2).分析:

   3).重构/自定义:


30. get_auto_x_option() 函数

   1).作用:获取XWindows自动配置项。

   2).分析:

   3).重构/自定义:


31. get_locking_options() 函数

   1).作用:获取当RKH运行时,是否要锁定RKH配置文件的配置项。

   2).分析:

   3).重构/自定义:


32. sort_test_lists() 函数

   1).作用:将测试项分为:可测试、不可测试两部分。

   2).分析:

   3).重构/自定义:


33. check_test_options() 函数

   1).作用:检查测试(比如:可测试列表是否有效)有效性

   2).分析:

   3).重构/自定义:


34. get_enable_option() 函数

   1).作用:获取可测试列表。

   2).分析:

   3).重构/自定义:


35. get_disable_option() 函数

   1).作用:获取不可测试列表(或称为不进行测试的项列表)

   2).分析:

   3).重构/自定义:


36. get_xinetd_option() 函数 

   1).作用:从配置文件中获取inetd and xinetd的配置文件路径。

   2).分析:

   3).重构/自定义:


37. get_port_options() 函数

   1).作用:获取端口的配置选项,并建立关于端口的白名单(即那些端口是安全的程序在使用的)。

   2).分析:

   3).重构/自定义:


38. get_groups_accounts_options() 函数

   1).作用:获取passwd、shadow文件,用户、组配置信息。

   2).分析:

   3).重构/自定义:


39. test_epoch_cmd() 函数

   1).作用:判断并为 EPOCH_DATE_CMD 变量赋值。

   2).分析:

   3).重构/自定义:


40. get_epoch_date_cmd_option() 函数

   1).作用:从配置文件中得到配置信息。

   2).分析:

   3).重构/自定义:


41. get_phalanx2_option() 函数

   1).作用:获取 PHALANX2_DIRTEST 变量的配置信息。

   2).分析:

   3).重构/自定义:


42. get_dev_options() 函数

   1).作用:获取配置文件中关于“ALLOWDEVFILE”的信息(添加白名单)。

   2).分析:

   3).重构/自定义:


43. get_hidden_options() 函数

   1).作用:获取配置文件中关于“ ALLOWHIDDENFILE”、“ ALLOWHIDDENFILE” 的信息(添加白名单)。

   2).分析:

   3).重构/自定义:


44. get_missing_file_options() 函数

   1).作用:用来检查丢失的文件或空文件。比如空的日志文件。

   2).分析:

   3).重构/自定义:


45. get_unhide_options() 函数

   1).作用:在检查隐藏端口时,“unhide commands”==》读取配置项(默认:unhide proc),查找隐藏进程。 

   2).分析:unhide 可以当做独立的工具来使用。

   3).重构/自定义:


46. get_process_options() 函数

   1).作用:获取配置项,检查进程。

   2).分析:

   3).重构/自定义:


47. get_suspscan_options() 函数

   1).作用:为 suspscan test 处理配置项。

   2).分析:

   3).重构/自定义:


48. get_if_prelinked() 函数

   1).作用:判断系统是否使用 ”prelink“ 。  

   2).分析:判断系统是否存在 "etc/prelink.cache"。即是否使用 prelink 预链接技术。

   3).重构/自定义:


49. get_md5_hash_function() 函数

   1).作用:获取系统中md5校验和命令。

   2).分析:

   3).重构/自定义:


50. get_hash_function()  函数

   1).作用:获得系统关键文件的hash值,并保存。

   2).分析:

   3).重构/自定义:


51. get_scan_mode_dev_option() 函数

   1).作用:从配置文件中得到SCAN_MODE_DEV变量,并据此确定如何扫描/dev路径。

   2).分析:

   3).重构/自定义:


52. get_startup_paths_option() 函数 

   1).作用:获取系统启动文件和路径。

   2).分析:

   3).重构/自定义:


53. get_rtkt_whitelist_options() 函数

   1).作用:从配置文件中获取rookit的白名单(免检)文件和路径。

   2).分析:

   3).重构/自定义:


54. get_shared_lib_whitelist_option() 函数

   1).作用:获取被列入白名单的共享库文件。

   2).分析:

   3).重构/自定义:


55. get_mirror_options() 函数

   1).作用:获取镜像文件配置。

   2).分析:用来升级的。/var/lib/rkhunter/db/mirrors.dat文件的内容:mirror=http://rkhunter.sourceforge.net。除此之外,还有版本号。

   3).重构/自定义:


56. get_os_info_options() 函数

   1).作用:获取操作系统信息。

   2).分析:

   3).重构/自定义:


57. get_user_fileprop_list() 函数

   1).作用:获取用户文件、目录信息。

   2).分析:

   3).重构/自定义:


58. get_properties_options() 函数

   1).作用:获取文件属性检查等需要的配置信息。

   2).分析:

   3).重构/自定义:


59. get_prelink_dep_option() 函数

   1).作用:获取prelink依赖错误的信息。当没有依赖错误时不执行。

   2).分析:

   3).重构/自定义:


60. get_summary_options() 函数

   1).作用:汇总 Warnings 信息。

   2).分析:

   3).重构/自定义:


61. get_network_options() 函数

   1).作用:获取用于网络检查的参数。

   2).分析:

   3).重构/自定义:


62. get_os_specific_options() 函数

   1).作用:获取操作系统特定的(LKM_PATH)配置信息。

   2).分析:

   3).重构/自定义:


63. get_app_options() 函数

   1).作用:获取应用程序检测需要的参数信息。

   2).分析:

   3).重构/自定义:


64. get_configfile_options() 函数

   1).作用:处理所有配置项,处理配置信息函数的入口。

   2).分析:

   3).重构/自定义:


65. get_readable_date() 函数

   1).作用:获取并设置READABLE_DATE。

   2).分析:

   3).重构/自定义:


66. rkh_dat_set_version() 函数

   1).作用:升级后设置版本信息(/var/lib/rkhunter/db/rkhunter.dat)。

   2).分析:

   3).重构/自定义:


67. rkh_dat_get_os_info() 函数

   1).作用:获取操作系统信息(/var/lib/rkhunter/db/rkhunter.dat)

   2).分析:

   3).重构/自定义:


68. rkh_dat_set_file_properties() 函数

   1).作用:检查文件的相关信息(/var/lib/rkhunter/db/rkhunter.dat)

   2).分析:

   3).重构/自定义:


69. create_rkh_file_prop_list() 函数

   1).作用:创建关于路径名的文件,该文件被用来做文件配置检查。

   2).分析:

   3).重构/自定义:


70. get_old_prop_attrs() 函数

   1).作用:配置文件被创建时,设置一些参数(变量)。

   2).分析:

   3).重构/自定义:


71. do_prop_update() 函数

   1).作用:更新rkhunter.dat文件。

   2).分析:

   3).重构/自定义:


72. get_next_mirror() 函数

   1).作用:获取mirrors.dat中的镜像信息,升级使用。

   2).分析:

   3).重构/自定义:


73. download_file() 函数

   1).作用:从 rkhunter.sourceforge.net 站点 下载mirrors.dat 文件到DB_PATH 路径下。

   2).分析:mirrors.dat 文件应该是测试数据--预期结果之类的。

   3).重构/自定义:


74. do_i18n_update() 函数

   1).作用:更新 i18n 语言文件(多语言支持)。

   2).分析:

   3).重构/自定义:


75. do_update() 函数

   1).作用:版本升级。

   2).分析:

   3).重构/自定义:


76. do_versioncheck() 函数

   1).作用:版本检查。

   2).分析:

   3).重构/自定义:


77. do_config_file_check() 函数

   1).作用:基本的配置文件检查。

   2).分析:

   3).重构/自定义:


78. do_system_check_initialisation() 函数

   1).作用:系统检查初始化。

   2).分析:非常长的函数(重点)。

   3).重构/自定义:


79. strings_check() 函数

   1).作用:运行 “字符串” 命令检查。 

   2).分析:

   3).重构/自定义:


80. shared_libs_check() 函数

   1).作用:共享库检查。

   2).分析:

   3).重构/自定义:


81. updt_rkhdat() 函数

   1).作用:文件配置检查。

   2).分析:

   3).重构/自定义:


82. file_properties_check() 函数

   1).作用:文件参数检查。

   2).分析:超长的函数(重点)。

   3).重构/自定义:


83. suspscan() 函数

   1).作用: 扫描可疑文件。

   2).分析:

   3).重构/自定义:


84. do_system_commands_checks() 函数

   1).作用:检查系统命令。

   2).分析:

   3).重构/自定义:


85. rootkit_file_dir_checks() 函数

   1).作用:查找已知 rootkit 的文件和目录。

   2).分析:根据已知的 rootkit 的文件、目录,判断系统中 是否存在该 rootkit。

   3).重构/自定义:


86. possible_rootkit_file_dir_checks() 函数

   1).作用:查找疑似 rookit 的文件、目录。

   2).分析:

   3).重构/自定义:


87. get_rc_paths() 函数

   1).作用:获取系统启动文件列表。

   2).分析:

   3).重构/自定义:


88. possible_rootkit_string_checks() 函数

   1).作用:检查疑似 rootkit 的字符串。

   2).分析:

   3).重构/自定义:


89. additional_rootkit_checks() 函数

   1).作用:执行额外的 rootkit 检查。 

   2).分析:

   3).重构/自定义:


90. malware_checks() 函数

   1).作用:检查恶意软件。

   2).分析:

   3).重构/自定义:


91. xinetd_include() 函数

   1).作用:处理 xinetd 服务包含的指令。

   2).分析:

   3).重构/自定义:


92. xinetd_includedir() 函数

   1).作用:处理 xinetd  'includedir' 指令。

   2).分析:

   3).重构/自定义:


93. sol10_inetd() 函数

   1).作用:处理 Solaris 10 及之后版本的 inetd配置(开机启动服务配置)。

   2).分析:

   3).重构/自定义:


94. trojan_checks() 函数

   1).作用:检查木马。

   2).分析:

   3).重构/自定义:


95. bsd_specific_checks() 函数

   1).作用:执行关于 BSD 的特殊测试。

   2).分析:

   3).重构/自定义:


96. freebsd_specific_checks() 函数

   1).作用:执行关于 FREE BSD 的特殊测试。

   2).分析:

   3).重构/自定义:


97. linux_loaded_modules() 函数

   1).作用:查找当前已加载的内核模块。

   2).分析:

   3).重构/自定义:


98. linux_avail_modules() 函数

   1).作用:检查已加载内核模块的名称。

   2).分析:

   3).重构/自定义:


99. linux_specific_checks() 函数

   1).作用:执行关于Linux的特殊测试。

   2).分析:

   3).重构/自定义:


100. os_specific_checks() 函数

   1).作用:执行针对所有操作系统的测试。

   2).分析:

   3).重构/自定义:


101. do_rootkit_checks() 函数

   1).作用:执行 rootkit 检测。

   2).分析:

   3).重构/自定义:


102. check_port_wl() 函数

   1).作用:检查端口对应及白名单(当然也包含隐藏端口的检查)。

   2).分析:

   3).重构/自定义:


103. do_network_port_checks() 函数

   1).作用:检查已开放端口中是否包含已知的后门端口。

   2).分析:

   3).重构/自定义:


104. do_network_hidden_port_checks() 函数

   1).作用: 使用 “unhide-tcp” 命令检查隐藏端口。

   2).分析:

   3).重构/自定义:


105. do_network_interface_checks() 函数

   1).作用:网络接口检查。

   2).分析:

   3).重构/自定义:


106. do_network_checks() 函数

   1).作用:执行网络检查。

   2).分析:

   3).重构/自定义:


107. do_system_startup_file_checks() 函数

   1).作用:执行系统开机启动文件检查。

   2).分析:

   3).重构/自定义:


108. pwdgrp_changes() 函数

   1).作用:检查 /etc/passwd  和 /etc/group 文件的更改。

   2).分析:rootkit 会自动修改 上述文件,添加用户和组。

   3).重构/自定义:


109. do_group_accounts_check()  函数

   1).作用:检查 passwd 和 group 文件。

   2).分析:

   3).重构/自定义:


110. do_system_config_files_check() 函数

   1).作用:执行针对系统软件配置的检查。

   2).分析:

   3).重构/自定义:


111. do_dev_whitelist_check() 函数

   1).作用:检查 /dev 下的文件(系统设备)。

   2).分析:

   3).重构/自定义:


112. do_filesystem_check() 函数

   1).作用:执行文件系统检查。

   2).分析:

   3).重构/自定义:


113. do_local_host_checks() 函数

   1).作用:执行在本地主机(localhost)上的测试。

   2).分析:

   3).重构/自定义:


114. do_app_checks() 函数

   1).作用:执行应用程序检查。

   2).分析:

   3).重构/自定义:


115. display_check_summary() 函数

   1).作用:显示汇总信息。

   2).分析:

   3).重构/自定义:


116. do_system_check() 函数

   1).作用:执行 rootkit 检查,程序入口。

   2).分析:该函数的执行顺序(调用其他函数的顺序及初始化执行环境)。

   3).重构/自定义:


117. check_os_info() 函数

   1).作用:检查系统信息。

   2).分析:

   3).重构/自定义:


118. set_file_prop_dirs_files() 函数

   1).作用:设置  USER_DIR_LIST 等执行环境。

   2).分析:

   3).重构/自定义:


119. check_test() 函数

   1).作用:检查测试项。

   2).分析:

   3).重构/自定义:


120. display_tests() 函数

   1).作用:输出所有可用的测试和测试组名称。

   2).分析:

   3).重构/自定义:


121. display_languages() 函数

   1).作用:简单到输出所有可用到语言类型。

   2).分析:定义变量 KNOWN_LANGS 并赋值(DB_PATH=/var/lib/rkhunter/db/i18n),当命令执行出错,不输出错误报告(2>/dev/null)。

                    后面就是使用 cut 命令对支持语言的类型(KNOWN——LANGS ,类似字符串)做字符处理,返回结果。
                     

   3).重构/自定义:可用来格式化并输出日志、配置文件等内容。



122. display_perl_modules() 函数

   1).作用:显示已安装的 perl 模块的状态。

   2).分析:

   3).重构/自定义:


123. display_propfiles() 函数

   1).作用:处理并显示 fileprop_list 文件列表特定列。

   2).分析:只有一行命令:

                    awk -F'/' '{ print $NF }' "${RKH_FILEPROP_LIST}" | sort | uniq

   3).重构/自定义:


124. display_rootkits() 函数

   1).作用:用于rkhunter在终端显示已经检查过的rookits。

   2).分析:调用了display函数,并使用test命令。

   3).重构/自定义:


125. get_lock() 函数

   1).作用:获得文件锁,若未成功则隔10秒重试,直到超时。

   2).分析:shell与进程之间的关系。比如用gedit打开一个文件,shell要获得锁怎么做。

   3).重构/自定义:


126. help() 函数

   1).作用:在终端显示帮助菜单。

   2).分析:全部都是 echo 命令。

   3).重构/自定义:






注:

        按照脚本结构分出若干功能模块,全局函数等各部分的作用和处理过程的细节慢慢研究。这篇文章清明假期完不成了,只能后面慢慢补。

        一个函数、一个函数来吧。目标是通过研究该脚本及原理,写出属于自己的 rkhunter。并且通过学习的过程,提高写脚本的水平(重构、自定义部分)。

        没有太多时间投到这个上,所以只能抽时间了,呵呵。



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
rootkit后门检测工具RKHunter RKHunter是一款专业的检测系统是否感染rootkit的工具,它通过执行一系列的脚本来确认服务器是否已经感染rootkit。在官方的资料中,RKHunter可以作的事情有: MD5校验测试,检测文件是否有改动 检测rootkit使用的二进制和系统工具文件 检测特洛伊木马程序的特征码 检测常用程序的文件属性是否异常 检测系统相关的测试 检测隐藏文件 检测可疑的核心模块LKM 检测系统已启动的监听端口 下面详细讲述下RKHunter的安装与使用。 1、安装RKHunter RKHunter的官方网页地址为:http://www.rootkit.nl/projects/rootkit_hunter.html,建议从这个网站下载RKHunter,这里下载的版本是rkhunter-1.4.0.tar.gz。RKHunter的安装非常简单,过程如下: 1 2 3 4 5 6 7 [root@server ~]# ls rkhunter-1.4.0.tar.gz [root@server ~]# pwd /root [root@server ~]# tar -zxvf rkhunter-1.4.0.tar.gz [root@server ~]# cd rkhunter-1.4.0 [root@server rkhunter-1.4.0]# ./installer.sh --layout default --install 这里采用RKHunter的默认安装方式,rkhunter命令被安装到了/usr/local/bin目录下。 2、使用rkhunter指令 rkhunter命令的参数较多,但是使用非常简单,直接运行rkhunter即可显示此命令的用法。下面简单介绍下rkhunter常用的几个参数选项。 [root@server ~]#/usr/local/bin/rkhunter–help Rkhunter常用参数以及含义如下所示。 参数 含义 -c, –check必选参数,表示检测当前系统 –configfile 使用特定的配置文件 –cronjob作为cron任务定期运行 –sk, –skip-keypress自动完成所有检测,跳过键盘输入 –summary显示检测结果的统计信息 –update检测更新内容 -V, –version显示版本信息 –versioncheck检测最新版本 下面是通过rkhunter对某个系统的检测示例: 1 2 3 4 5 6 7 8 9 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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 [root@server rkhunter-1.4.0]# /usr/local/bin/rkhunter -c [ Rootkit Hunter version 1.4.0 ] #下面是第一部分,先进行系统命令的检查,主要是检测系统的二进制文件,因为这些文件最容易被rootkit攻击。显示OK字样表示正常,显示Warning表示有异常,需要引起注意,而显示“Not found”字样,一般无需理会 Checking system commands... Performing 'strings' command checks Checking 'strings' command [ OK ] Performing 'shared libraries' checks Checking for preloading variables [ None found ] Checking for preloaded libraries [ None found ] Checking LD_LIBRARY_PATH variable [ Not found ] Performing file properties checks Checking for prereq

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光明矢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值