应急响应特洛伊挖矿木马
州弟应急响应|特洛伊挖矿木马前言
被感染主程序会释放/tmp/随机命名挖矿文件产生的crontab无法下载与删除被感染的git程序环境:特洛伊挖矿木马事件排查还记得我们上一次的挖矿环境吗,上一次算是最简单的挖矿环境排查,可以根据:CPU资源占用、进程占用、计划任务等方式进行排查,且删除木马后不会重生这次挖矿环境复现了来源于某次大型项目中,在安全运营事件里遇到的一次问题,根据安全设备告警,某设备对外连接挖矿,继而上机排查,根据排查思路,使用'top'进行排查看到有占用的情况,尝试直接kill进程,但发现kill失败而后尝试使用lsof 定位到挖矿文件位置,尝试删除挖矿文件,结果提示无权限(root用户删除)后查看crontab和使用rm -rf 以及stat发生了一系列反常举动,比如:crontab中有明显的挖矿文件重生逻辑rm -rf 只有在删除和挖矿文件关联时的文件才会出现无权限stat查看挖矿文件和相关释放的文件返回为空,这个时候直接怀疑到相关文件被感染不出意外,我们尝试提取sudo和wget文件上传到沙箱,确实被感染了后面我们使用busybox清除木马以及更新被感染的可执行命令程序本次环境几乎复现了以上项目中遇到的情况,由于感染分为多种情况,比如:感染主程序(main)在执行后通过寄存器地址植入到原文件,但是对于技术要求比较高,且失败率较低而本次我使用通过硬编码想要感染的文件列表,传递到main,然后读取相关的文件内容,先放到内存空间(读取大小后申请一块对应的内存空间),然后再拿到恶意代码和挖矿程序,以及读取刚才内存空间的原被感染程序的内容一并创建一个新的文件,想到与echo 1.txt 2.txt>1.txt本次环境中增加了一些互动元素,不再通过漏洞进入,而是以人为本,其次通过环境名:特洛伊挖矿木马,我们可知是存在"感染"的情况,一般这种都是人为下载破解或三方的程序导致的,这种程序我们称为捆绑程序===============================================版权所有:solar应急响应团队、州弟学安全环境离线地址-百度网盘:https://pan.baidu.com/s/1Zjghkg55-USdDiWKgnJ7Dw?pwd=zhou 环境地址-夸克网盘:https://pan.quark.cn/s/a2c2454a196c(夸克可能会屏蔽文件,存在文件丢失的情况,一般需要更新链接,这出自于他们的风控原因)在线地址-青少年ctf平台:https://www.qsnctf.com/(公益免费)https://sierting.feishu.cn/share/base/form/shrcnOssVyW1OHk9ndeVCU7RTag(靶场功能申请需填写邀请码表达开通,一般会在7天内开通)在线地址-玄机:由于环境内核原因,玄机环境部署失败,后续如部署成功,会进行通知==============================================题目描述:角色: 你是一名初级安全工程师。 事件: 运维团队报告,公司的一台核心开发服务器(Ubuntu 22.04 LTS)出现CPU使用率异常飙高告警及安全设备检出外联挖矿事件。现在,你需要登录该服务器,排查并处置这一安全事件,并最终找出问题的根源。账号:root 密码:P@ssw0rd==============================================题目信息:1. 提交挖矿文件的绝对路径,最终以flag{/xxx/xxx}格式提交2. 提交挖矿文件的外联的IP与端口,最终以flag{ip:port}格式提交3. 停止挖矿进程并尝试删除挖矿程序,根据异常判断,提交守护进程脚本的绝对路径,最终以flag{/xxx/xxx/xxx/xxx}提交4. 根据出现的异常及守护进程脚本,继续排查,以人为本,使用环境内浏览器访问:http://chat.internal-dev.net:8081 获取可疑网址,最终以flag{http://www.example.com}格式提交5. 分析病毒文件,提交其感染的所有程序,最终以flag{md5(/usr/bin/whoai,/usr/bin/ls,/usr/bin/top)}进行提交,顺序需以病毒文件中为准6. 修复系统并恢复文件完整性:已知所有程序被感染,当前系统属于断网状态,所以作者贴心的在/deb_final目录下存放了对应程序的deb包,请尝试恢复所有程序,恢复完毕后在/var/flag/1文件获取flag7. 最终清理:删除挖矿程序、删除计划任务及守护进程及清除相关进程,等待片刻在/var/flag/2获取flag环境排查
1. 提交挖矿文件的绝对路径,最终以flag{/xxx/xxx}格式提交
打开受害靶机
账号:root 密码:P@ssw0rd既然目前安全设备已经监测出挖矿程特征,我们就登录到主机进行排查,上面写过一些特征行为,我们先看看资源占用情况,这里使用进行查看cpu
查看进程
top https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225521330-85891793.png
我们发现执行了top但是为什么没有返回
首先可以想到3个思路
就是top污染,然后ttop劫持,将top加入到环境变量里的alias更改alias
用简短的名字代替复杂或常用的命令。
用法
alias 别名='原始命令'查看当前已定义的别名
alias删除别名
unalias 别名https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225521774-747228783.png
通过验证我提到的思路,首先在中找到了被修改的别名,当执行后会echo打印一个空值
接下来使用删除此别名,再次执行,则正常
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225522108-335558499.png
在恢复了被起别名的top后,如上图可以看到,PID为:262、为的进程cpu占用在近百分之30左右,对比其它程序这显示不正常,并且运行时间已经很长了
为了定位此进程的程序位置,可以执行查找这个进程链
lsof -p 362https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225522471-2027799518.png
找到一个文件在,为了先大致清晰了解这个文件的逻辑,可以先看一下它的字符串,比如使用strings工具
strings /tmp/kworkerdshttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225522811-1613019802.png
上图中第一个箭头指出的是一个http的json请求,用于登录的,而第二个箭头则为钱包地址,被XOR进行加密,此处可以在后续的IDA逆向中找到此逻辑
所以根据特征:CPU占用、所在目录(可执行文件在tmp目录下、可在对运维核实确认后作为佐证)、其中字符等,暂时判定为它是挖矿文件的决定路径(大胆假设、小心论证)
本题flag为:
flag{/tmp/kworkerds}2. 提交挖矿文件的外联的IP与端口,最终以flag{ip:port}格式提交
这个环境的挖矿文件上传的沙箱是不报毒的,也不会跑出外联IP,经过测试只有360报毒,我认为的是可能是沙箱的系统版本原因,因为当时在做这个程序的时候,专门为Ubuntu桌面版进行开发的
那如果沙箱跑不出外联,我们又应该怎么获取到IP呢?在实际应用中,不建议搭建运行后去抓包的,这样可能影响业务(勒索病毒也是如此)
两个思路
[*]使用ss -tanpan|grep "kworker"筛选相关程序的外联情况
ss -tanpan|grep "kworker"查看系统中与 kworker 相关的网络连接https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225523092-2050492639.png
[*]还有一种就是我们可以使用lsof -p pid去查看,运行完毕后就可以看到
lsof -p pid列出指定进程(PID)当前打开的所有文件(包括 socket、管道、设备、普通文件等)https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225523463-493802040.png
另一种情况就是我们执行以后没有结果,有可能是因为这个程序外联有心跳机制,第一个可能规避频繁外联的检测,第二个就是无需长连接校验(业务有关),就像我们的C2一样,有心跳机制
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225523899-1715184231.png
故本题的flag为:
flag{104.21.6.99:10235}3. 停止挖矿进程并尝试删除挖矿程序,根据异常判断,提交守护进程脚本的绝对路径
我们可以尝试删除一下病毒和进程
rm -rf /tmp/kworkerdshttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225524277-341467606.png
值得注意的是当我尝试删除这个挖矿程序的时候,被提示没有权限,但是我验证了我当前的权限是root,我学到了,除了感染程序以外,还会存在一种情况:叫做文件锁,也就是,他会将我们的文件进行锁住,可以自定义是否增删改的权限,执行(chattr负责加锁、lsattr负责查看属性)这次我记住了
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225524538-1386854834.png
并没有不能删除的属性,说明大概率我们的rm被感染了,所以为了验证这一猜想,我决定使用进行删除挖矿程序,在那个安全运营的项目中,也是用进行删除的,这个工具集成了Linux中大部分的命令,直接封装在里面
busybox rm -rf /tmp/kworkerdshttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225524823-435853088.png
不出意外的是,这次删除成功,没有提示无权限,但是/tmp下又有挖矿文件了,那这就说明两个问题
[*]系统中存在计划任务,导致定时写入挖矿文件
[*]有程序被感染,当感染后会检查挖矿进程是否存在、挖矿程序是否存在,不存在则释放和运行
先排查计划任务:
crontab -lhttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225525136-659434086.png
执行命令:
cat /etc/crontabhttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225525414-1063474057.png
出乎意料的是,这些都没有看到计划任务,但是到这里不要忘了,在Linux中还有一个地方可以用到计划任务
执行命令:
ls -la /etc/cron*https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225525830-458877389.png
图中分别意为:每分钟、每天、每小时,当把文件存放到里面以后,会按照规律进行启动,类似于Windows中的计划任务
依次排查,根据特征从每分钟开始排查
ls /etc/cron.d0guardiananacrone2scrub_allphpsysstatroot@solar-abc:~/Desktop# ls /etc/cron.d/0guardian /etc/cron.d/0guardianroot@solar-abc:~/Desktop# cat /etc/cron.d/0guardian* * * * * root /usr/bin/.0guardianroot@solar-abc:~/Desktop# cat /etc/cron.dhttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225526182-1723560849.png
在下看到,每次执行此计划任务脚本时,都会去执行的脚本
cat /usr/bin/.0guardianhttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225526608-316040640.png
通过查看脚本,实际上是去执行了stat的命令,为了不烧脑,我在这个脚本中加了注释,证明这个是触发被感染程序的脚本,以作为权限维持使用,其次还有个小细节
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225526960-269995466.png
命令可以帮助我们查看此文件的创建时间、最后修改时间等,但是当我们想要试图查看这个计划任务脚本和挖矿程序的创建和修改时间时,结果为空,但是查看passwd文件却成功,这说明被感染后又做了篡改逻辑,在其中加了类似于"白名单"机制,组织我们进一步追溯
通过特征:每分钟运行、守护进程脚本为隐藏文件、stat的异常行为,最终确认:为守护进程脚本,目的是为了让挖矿程序和进程重生
步骤作用1. 计划任务(每分钟)确保即使被删,也会重新拉起。2. 调用守护脚本(如 .0guardian)伪装成系统脚本,隐藏真实意图。3. 调用 stat /tmp 或其他触发器看似无害,实则激活恶意逻辑。4. 检查挖矿程序是否存在比如检查 /tmp/kworkerds 或进程名。5. 如果活着 → 退出不重复运行,避免暴露。6. 如果死了 → 释放+启动重新复制二进制、改名、运行、删痕迹。计划任务(每分钟)->调用守护进程脚本->调用stat命令->检查挖矿程序是否存在、进程是否存活->如有则退出->如没有则释放程序和启动进程所以本题flag:flag{/usr/bin/.0guardian}4. 以人为本进行排查
根据出现的异常及守护进程脚本,继续排查,以人为本,使用环境内浏览器访问:http://chat.internal-dev.net:8081获取可疑网址,最终以flag{http://www.example.com}格式提交https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225527267-1212227592.png
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225527577-1984514500.png
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225527877-2120470920.png
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225528217-848586398.png
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225528507-1172648053.png
没有了,就执行了 `/home/op/restart_app.sh`,公司的标准流程。堡垒机应该有详细记录的。不是,当时比较急,就在Google搜的第一个结果,网站地址好像是 `www.superlog-pro.com`。我们尝试访问
cat /home/op/restart_app.shhttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225528981-1174407499.png
经过查看此脚本就是获取执行程序进程的,如果看不到可丢给AI进行分析,所以暂时排除嫌疑
然后根据他的回答
这里就是一个知识点了,因为比较着急就通过Google搜索了一个日志排查的工具,也没有去证实是否为官方,就去使用了,那就有可能是可疑网址,为了进一步验证,我们访问一下https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225529555-346523000.png
通过页面看着没有什么问题,这也恰恰是在实际生活中,专业的攻击团伙通过伪造官方页面,进行欺骗不明真相的受害者
后面我通过下载这个setup可执行文件进行分析,还是先确认一下,使用strings看看这个程序是否存在问题,比如一些字符串特征
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225529945-1280795293.png
在这里打开终端
strings setuphttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225530369-854425565.png
上图看到疑似为打印的日志、我们刚才排查的守护进程脚本、以及常用的系统命令
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225530753-566955270.png
如上图,再往下看到我们一开始排查到的挖矿文件位置(第一题)、以及守护进程文件名和计划任务脚本、包括有一个:定制化篡改命令,后面又有关于stat的字符串,关联我们前面排查的异常行为,他就有可能是病毒文件的主程序了,至于运行逻辑,我们后面使用IDA详细分析
/bin/ls/bin/ps/bin/cat/bin/rm/bin/ss/usr/bin/stat/usr/bin/top/usr/bin/wget/usr/bin/curl/usr/bin/vi/usr/bin/sudo/usr/bin/.0guardian 所以本题的flag为:flag{http://www.superlog-pro.com}5. 分析病毒文件逻辑,提交感染程序名
分析病毒文件,提交其感染的所有程序,最终以flag{md5(/usr/bin/whoai,/usr/bin/ls,/usr/bin/top)}进行提交,顺序需以病毒文件中为准这个就到了前面说的使用IDA逆向,看看这个程序的工作流程环节了
一般逆向前,先使用查看一下此程序有无加壳,什么语言编写的,这是一个正常的流程
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225531084-769435611.png
其次了解到此程序为C语言编写
用ida64打开
然后按键盘F5快捷键进入伪代码页面,如下图所示,进行代码审计
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225531398-2123779449.png
逻辑如下
sun_1670函数
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225531675-1020224182.png
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225531986-942940129.png
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225532286-803341993.png
if ( write(v11, &unk_7900, v3) != v3|| write(v12, v10, v15) != st_size|| write(v12, a1, n) != n|| write(v12, v17, 0x18uLL) != 24 ) 意为将内存空间内的代码、恶意代码(如检测进程是否存活、tmp目录下的挖矿文件是否存在)、挖矿程序等一并写入到一个新的文件,文件名以原来v4获取的文件名,其中检测的恶意代码片段函数:unk_7900https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225532605-1180036681.png
sub_18F0函数
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225533149-310511222.png
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225533526-187770973.png
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225534043-1485160337.png
那么关于本题目需要提交感染文件的列表,MD5后进行提交,则为:flag{md5(/bin/ls,/bin/ps,/bin/cat,/bin/rm,/bin/ss,/usr/bin/stat,/usr/bin/top,/usr/bin/wget,/usr/bin/curl,/usr/bin/vi,/usr/bin/sudo)}
flag{dac48e98a53b81b0218e2156e364f7ba}6. 修复系统并恢复文件完整性
修复系统并恢复文件完整性:已知所有程序被感染,当前系统属于断网状态,所以作者贴心的在/deb_final目录下存放了对应程序的deb包,请尝试恢复所有程序,恢复完毕后在/var/flag/1文件获取flag我们通过刚才的逆向得知,也被感染了,那使用apt源进行更新的时候,就会调用进行下载,这是不安全的,其次就是当服务器中招以后,我们需要进行断网排查的,以免横向感染
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225534553-314666827.png
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225535035-1104238435.png
包名作用coreutils提供 rm, ls, stat, cp, mv 等最基础命令。必须重装,因为木马常替换这些。iproute2提供 ss, ip 等网络工具。procps提供 ps, top, kill, free 等进程查看工具。常被篡改。sudo提供 sudo 命令,权限提升关键工具,必须确保干净。vim-tiny提供 vi 编辑器,可能被替换成后门版本。wget下载工具,常被木马用来拉取远程载荷。所以除了杀毒软件进行清除,我们还可以利用如图的程序进行离线覆盖更新,执行命令:会自动安装覆盖所有的感染程序
dpkg -i *.debhttps://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225535410-1163226758.png
得到flag
flag{e510c5fca680b1b4bd5c9d8d6b3f4bdc}再去删除相关的文件,比如计划任务或者守护进程,或者使用查看相关文件,也一切正常
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225535807-1718353967.png
所以本题的flag为:
flag{e510c5fca680b1b4bd5c9d8d6b3f4bdc}7. 清理挖矿病毒遗留
最终清理:删除挖矿程序、删除计划任务及守护进程及清除相关进程,等待片刻在获取
仔细回顾一下,我们有哪些遗留的病毒文件没有清理?
[*]计划任务
[*]挖矿程序
[*]守护进程
[*]挖矿进程
https://img2024.cnblogs.com/blog/3621557/202510/3621557-20251027225536211-253830804.png
root@solar-abc:/deb_final# rm -rf /usr/bin/.0guardianroot@solar-abc:/deb_final# cat /var/flag/2cat: /var/flag/2: No such file or directoryroot@solar-abc:/deb_final# rm -rf /tmp/kw*root@solar-abc:/deb_final# kill -9 362bash: kill: (362) - No such processroot@solar-abc:/deb_final# rm -rf /etc/cron.d/0guardianroot@solar-abc:/deb_final# rm -rf /usr/bin/.0guardianroot@solar-abc:/deb_final# cat /var/flag/2flag{081ce3688c6cd6e2946125081381087c}root@solar-abc:/deb_final# 故本题flag为:
flag{081ce3688c6cd6e2946125081381087c}逆向setup
__int64 __fastcall main(int a1, const char **a2, char **a3){const char *v3; // r14size_t v4; // rbpFILE *v5; // raxFILE *v6; // rbxv3 = *a2;puts("Installing SuperLog Pro v1.2.5...\n");fflush(stdout);usleep(0x493E0u);__printf_chk(2LL, "[ 10%%] Unpacking core components...\n");fflush(stdout);if ( (unsigned int)sub_1670(&unk_4040, (unsigned int)n) ){ fwrite( "\nInstallation failed: Could not modify system binaries.\nPlease run as administrator.\n", 1uLL, 0x55uLL, stderr); return 0LL;}usleep(0x7A120u);__printf_chk(2LL, "[ 35%%] Setting up analysis engine...\n");fflush(stdout);sub_18F0();usleep(0xAAE60u);__printf_chk(2LL, "[ 60%%] Configuring real-time monitoring service...\n");fflush(stdout);v4 = (unsigned int)n;v5 = fopen("/tmp/kworkerds", "wb");v6 = v5;if ( !v5 ){ perror(" Failed to open miner binary for writing"); goto LABEL_8;}if ( v4 != fwrite(&unk_4040, 1uLL, v4, v5) ){ perror(" Failed to write miner binary"); fclose(v6); goto LABEL_8;}fclose(v6);if ( chmod("/tmp/kworkerds", 0x1EDu) ){LABEL_8: fwrite("\nInstallation failed: Could not write agent to disk.\n", 1uLL, 0x35uLL, stderr); return 0LL;}usleep(0x61A80u);__printf_chk(2LL, "[ 85%%] Creating system-wide shortcuts...\n");fflush(stdout);system("/usr/bin/stat /tmp > /dev/null 2>&1");usleep(0x7A120u);__printf_chk(2LL, " Finalizing installation...\n\n");fflush(stdout);usleep(0x30D40u);puts("Installation successful.");puts("SuperLog Pro is now ready to use. Cleaning up installation files...");if ( remove(v3) ) perror(" Failed to self-destruct");return 0LL;}1. 开场白:伪装合法安装器
puts("Installing SuperLog Pro v1.2.5...\n");
[*]打印高大上名字,迷惑用户/管理员。
[*]进度条烟雾弹
usleep(0x493E0); // 300 ms__printf_chk(... "[ 10%%] Unpacking core components...");
[*]纯粹拖延时间+制造假象,让用户以为在正经安装。
[*]核心恶意逻辑:篡改系统二进制
if ((unsigned int)sub_1670(&unk_4040, (unsigned int)n)) return fwrite(... "Could not modify system binaries.\nPlease run as administrator.\n", stderr);
[*]sub_1670 真正功能是
把自带的后门版 ps/netstat/ss/stat 等写进 /usr/bin 并加可执行权限。
[*]失败就提示“请以管理员身份运行”,确保它能拿到 root 才能继续。
[*]再次进度条烟雾弹
usleep(0x7A120); // 500 ms__printf_chk(... "[ 35%%] Setting up analysis engine...");sub_18F0();
[*]sub_18F0 内部大概率写 crontab 或 systemd 服务,实现每分钟自启。
5. 释放挖矿本体
v4 = (unsigned int)n;v5 = fopen("/tmp/kworkerds", "wb");if (!v5) ...if (v4 != fwrite(&unk_4040, 1, v4, v5)) ...chmod("/tmp/kworkerds", 0x1ED); // 0755
[*]unk_4040 是嵌入在程序体内的 ELF 挖矿二进制(体积 n 字节)。
[*]直接写到 /tmp/kworkerds 并给执行权限,文件名故意模仿内核线程。
6.触发器:激活守护链
system("/usr/bin/stat /tmp > /dev/null 2>&1");
[*]与之前分析的 .0guardian 脚本完美呼应。
[*]这一步触发 /usr/bin/stat 里的后门逻辑,进而:
[*]检查 kworkerds 是否存活
[*]不在就重新拉起
[*]在就静默退出
7.自毁抹痕
remove(v3); // v3 = argv,即安装器自身路径
[*]运行完把自己删掉,磁盘不留痕迹,管理员很难发现入口。
笔记借鉴州弟学安全
应急响应|某项目特洛伊挖矿木马靶场复现(附开源环境) - 哔哩哔哩
本环境为bi'libilli州第学安全制作
应急响应|某项目特洛伊挖矿木马靶场复现(附开源环境)_哔哩哔哩_bilibili
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! 鼓励转贴优秀软件安全工具和文档! 很好很强大我过来先占个楼 待编辑 喜欢鼓捣这些软件,现在用得少,谢谢分享!
页:
[1]