熊猫烧香
基本信息
报告名称:熊猫烧香病毒报告
作者:Pawn
文件名:xiongmao.exe
样本类型:EXE文件
样本文件大小:30,001 字节
样本文件的MD5校验值:512301c535c88255c9a252fdf70b7a03
样本文件SHA1校验值:ca3a1070cff311c0ba40ab60a8fe3266cfefe870
壳信息:FSG 2.0
相关漏洞:弱密码
基础动静态分析
PEiD信息
![](https://i-blog.csdnimg.cn/blog_migrate/f4849ff0708732234e5dc3236e3a0e6a.png)
程序加了壳,壳为FSG 2.0
脱壳
使用OllyDBG插件 OllyDump可以轻松找到OEP为 0040D278,使用ImpREC修复注册表发现只有kernal32.dll,可能是自动修复导入表失败
所以查看脱壳存根构建的IAT
根据FSG2.0壳的特点 搜索JMP DWORD PTR DS:[EBX+0xC] 指令(一般为跳转OEP指令),设置断点,向上寻找LoadLibrary和GetProcAddress函数。
![](https://i-blog.csdnimg.cn/blog_migrate/7c03a911e2932d64d6ae4665b5ec614e.png)
可以看到 导入表 不同库函数之间被填充为了7FFFFFFF,导致自动修复IAT失败。所以将7FFFFFFF填充为00000000。使用OllyDump脱壳修复导出表
导入表函数
使用Dependency walker查看导入表函数
![](https://i-blog.csdnimg.cn/blog_migrate/80fceaa4c469a78dec11c38ea060d029.png)
KERNEL32.DLL中导入了关于文件读写的API函数,猜测病毒创建了文件,并写入。
ADVAPI.DLL中导入了关于注册表操作的相关API函数,猜测病毒修改了注册表
WS2_32.DLL和WININET.DLL提供了与网络操作相关的API函数,猜测函数连接外部网络
使用windows xp(service pack3)系统兼容模式启动
发现恶意代码关闭了安全中心服务
![](https://i-blog.csdnimg.cn/blog_migrate/44d5e8938cb8fb45ef477aa40f85f2d5.png)
运行后发现多了一个进程spo01sv.exe
![](https://i-blog.csdnimg.cn/blog_migrate/a286fc67727844faac583c54410aafad.png)
在C:\Windows\System32\drivers\目录下,创建了spo0lsv.exe
查看spo0lsv的md5值,发现和xiongmao.exe相等,所以推测病毒将xiongmao.exe复制到此目录下
![](https://i-blog.csdnimg.cn/blog_migrate/173b95e50e879a40c98a8f2b4077c99a.png)
使用regshot工具对比运行前后的注册表变化(详见/熊猫烧香分析报告.asset/运行前后注册表对比.txt)
注册表删除的键:
![](https://i-blog.csdnimg.cn/blog_migrate/9b1e7d5898a43f22fa43a74a522f92f7.png)
此注册表键代表了windows的安全防护服务,恶意代码关闭了windows的安全防护服务
注册表添加的键:
![](https://i-blog.csdnimg.cn/blog_migrate/88a02bd4b843469e22ac716f60e77137.png)
Tracing键是跟踪日志和跟踪文件的路径、文件名和其他设置。
注册表添加的键值:
![](https://i-blog.csdnimg.cn/blog_migrate/e050a53537012ff88cc4e8d7facd8e1f.png)
恶意代码设置HKU\S-1-5-21-3607991960-4000027800-3246950079-1000\Software\Microsoft\Windows\CurrentVersion\Run\svcshare键值为"C:\Windows\system32\drivers\spo0lsv.exe" 添加了自启动功能
注册表删除的键值
![](https://i-blog.csdnimg.cn/blog_migrate/be528da77d6e3f447f5a57559ad2cddb.png)
可以看到spo0lsv.exe尝试删除了很多自启动项,通过检索这些名称,推测为恶意代码会删除和杀毒软件相关得自启动项
Internet Settings应该是浏览器的一些信息
文件操作
恶意代码创建了大量的desktop_.ini文件,里面存储了时间信息
恶意代码打开了大量的exe文件,结合观察到的一些文件图标变为“熊猫烧香”的图标,推测为恶意代码便利文件目录并将exe等文件图标改为“熊猫烧香”的图标
恶意代码打开了cmd.exe,可能执行了一些命令
![](https://i-blog.csdnimg.cn/blog_migrate/4e424119c720bf71b1a87b8fd04a17e6.png)
网络操作
![](https://i-blog.csdnimg.cn/blog_migrate/82c3ce03d48d5829000341aa87e6f180.png)
查看网络操作可以看到,因为本机的ip地址为192.168.40.129所以可以看到恶意代码尝试连接局域网的其他主机。
进程和线程信息
只看到恶意代码创建了一些线程,没有特别有用的信息
其他
尝试打开任务管理器和注册表闪退,推测恶意代码阻止用户打开windows自带的工具
总结
恶意代码首先将自身复制到系统C:\Windows\System32\drivers\目录下,并设置了自启动注册表键值
恶意代码关闭了安全防护的服务
恶意代码将杀毒软件的开机启动键值删除
恶意代码阻止用户打开任务管理器和注册表等
恶意代码连接局域网
恶意代码遍历文件系统,将一些文件的图标改为“熊猫烧香”图标,如exe文件,每个目录下创建desktop_.ini文件,记录时间信息
恶意代码创建了关于自身运行的相关注册表键
详细分析
静态分析设置和技巧
首先脱壳后发现恶意代码是使用Delphi 6.0-7.0编写的恶意代码,Delphi使用fastcall调用约定,但是与Windows的fastcall略有不同,参数顺序为eax为第一个参数、edx为第二个参数、ecx为第三个参数,大于3个的参数通过堆栈传递,大于三个的堆栈顺序从左到右依次压栈,堆栈由被调用者恢复。我们使用IDR和IDA PRO对此恶意代码进行反汇编分析。
对ida进行一些设置:
Options–>Compiler:Compiler(Delphi)、Calling convention(FastCall)
View–>Open Subviews–>Signatures–>Apply new Signatures:选择delphi相关Signatures
恶意代码初始化
程序开始OEP调用了InitExe和LStrAsg函数,应为一些初始化函数。
![](https://i-blog.csdnimg.cn/blog_migrate/2a8dc373e09250e865ba0007d685dc58.png)
解码
函数有三个参数并将40D8A0处的数据,xboy,第一个局部变量。
![](https://i-blog.csdnimg.cn/blog_migrate/359f55b7129216156e2acda14427aa2e.png)
进入00405250分析
结合Ollydbg和IDA分析,此函数为解密函数,将“xboy”和“'"++戊+缓"叛聋+肛+删"蚊苜+兆++*'”以某种顺序取字符异或,解密
![](https://i-blog.csdnimg.cn/blog_migrate/a3a87c794d6eeec3a02fa998239169d7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b733194130601b28ea9fc2124fbbdd02.png)
解密后的字符串与*武*汉*男*生*感*染*下*载*者* 对比,相同则跳转,不同则退出。然后继续解密,对比,相同则跳转,不同则退出
![](https://i-blog.csdnimg.cn/blog_migrate/2f14b4002ff300e270d450ed8397d73b.png)
综合查看start中所有流程,图中的三个call应该为病毒的主功能调用。我们先进入sub_40819C分析
![](https://i-blog.csdnimg.cn/blog_migrate/0fbe6fef258ddb2ab8fba014353a1a1e.png)
主体功能函数 一
删除Desktop_.ini文件
首先判断通过程序的目录,查看目录下Desktop_.ini文件是否存在。有则执行
![](https://i-blog.csdnimg.cn/blog_migrate/e16dc8747012592cde5bb711d4a6a8f9.png)
存在Desktop_.ini文件,则会更改文件属性为NORMAL,然后删除 Desktop_.ini
![](https://i-blog.csdnimg.cn/blog_migrate/00401001af4bba826b19538bc3d1afd8.png)
判断是否为被感染的程序
这一段代码内容一直没搞明白是什么内容,直到看到下图的的分支,我测试了源程序和C:\Windows\System32\drivers\spo0lsv.exe函数的分支都没有实现跳转,然后我测试了被感染文件的这个判断,发现执行了跳转,然后测试前面的程序的数据流,明白了Writre_PE_Dictionary函数的作用
![](https://i-blog.csdnimg.cn/blog_migrate/1e29d89ceca8cb46b072f73a72e08d20.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a2833f2c56fde53104a3a5eb941ba79e.png)
被感染程序的特征码为类似
其实感染特征码为WhoBoy+源文件名+.exe+2+源文件大小+1
![](https://i-blog.csdnimg.cn/blog_migrate/8aa3ba5d3b7a76b56da30ad2f56ce3f1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d28939a7123aba3b49d57e9ab9abfef2.png)
判断是否为C:\Windows\system32\drivers\spo0lsv.exe
将程序绝对地址转换为大写字符,然后与系统根目录路径cat上drivers\spo0lsv.exe(本系统为C:\Windows\System32)对比,然后有两条执行路径。
根据先前的基础分析,我们猜测
如果程序不是drivers\spo0lsv.exe则可能复制文件到此处,再运行;
如果程序是drivers\spo0lsv.exe则可能执行我们基础分析的相关功能;
![](https://i-blog.csdnimg.cn/blog_migrate/098da5475a727f06fe451397f0753a10.png)
不是感染文件且不是\spo0lsv.exe程序
首先判断系统是否纯在spo0lsv.exe进程,有则结束掉进程,然后复制spo0lsv.exe到C:\Windows\System32\drivers\目录下并运行。
查看C:\Windows\System32\driver目录下,发现了spo0lsv.exe函数验证猜想
![](https://i-blog.csdnimg.cn/blog_migrate/b86654cb6a99ca0afd12aca9c89f712c.png)
其中@Judge_process_kill程序分析流程如下
将SPO0LSV.EXE与循环取出进程名对比,去除进程名有关的API函数为CreateToolhelp32Snapshot、Process32First、Process32Next等函数
![](https://i-blog.csdnimg.cn/blog_migrate/5dfdfe152723ab28b1e20c3d8020ea33.png)
然后改为分析系统目录下的spo0lsv.exe文件跳转到另一个分支,这个分支会和感染程序的分支汇合形成另一个分支
是dirvers\spo0lsv.exe
右边的分支直接清栈返回
![](https://i-blog.csdnimg.cn/blog_migrate/10029ca572ebc168b39d28ffa41b4f8f.png)
是感染文件
感染后的文件由[ 病毒文件+原文件+感染特征值]组成。所以我们分析程序可知程序将原文件复制到一个新文件中,新文件与感染后的文件有相同的属性
之后,病毒在C:\Users\Pawn\AppData\Local\Temp下生成批处理块,格式为“数字+$$“,内容如下
`:try1
del "源程序绝对地址"
if exist "源程序绝对地址" goto try1
ren "源程序绝对地址+后缀名" "源程序名称"
if exist "源程序绝对地址+后缀名" goto try2
"源程序绝对地址"
:try2
del %0`
具体作用为
删除位于 "源程序绝对地址" 的文件。
如果文件被成功删除,执行下一步操作;如果删除失败,跳转到标签 ":try1" 重新执行删除操作。
将 "源程序绝对地址+后缀名" 重命名为 "源程序名称"。
如果重命名成功,执行下一步操作;如果重命名失败,跳转到标签 ":try2" 删除当前脚本文件。
启动 "源程序"。
删除当前脚本文件。
这条分支的作用是如果只是表面杀死病毒没有将所有文件恢复,运行未恢复的文件就会再次感染。
![](https://i-blog.csdnimg.cn/blog_migrate/437841be0e5cbad701eb49626abf1816.png)
![](https://i-blog.csdnimg.cn/blog_migrate/fd1f1eb1e08a17ca0f830b81d8b109e1.png)
![](https://i-blog.csdnimg.cn/blog_migrate/2e85382e56673fbe6b45968b33e6f1f9.png)
主体功能函数 二
三个call 分被为
创建线程,本地感染
使u盘等移动介质可以传播病毒
连接局域网网络,传播病毒
![](https://i-blog.csdnimg.cn/blog_migrate/5081ac21fa8a9a967a6e51d256920ff6.png)
第一个call,创建线程,本地感染
![](https://i-blog.csdnimg.cn/blog_migrate/8afd02cfa521d9ebe2ae10eeb542cdff.png)
线程其实地址为 sub_40A48C,将盘符转化为字符串,遍历盘符,排除A和B盘符
![](https://i-blog.csdnimg.cn/blog_migrate/fe1bfeb63f22dba9ad8c9ea314f15cda.png)
遍历所有文件 感染
![](https://i-blog.csdnimg.cn/blog_migrate/8ae60bff66d875be74f3b7d31bfe6dde.png)
Infect函数分析
如果为目录文件则判断目录名称,以排除一些名称
排除WINDOWS、WINNT、system32、Documents and Settings 、 System Volume Information 、Recycled 、 Windows NT 、 WindowsUpdate 、Windows Media Player 、 Outlook Express、Internet Explore 、 NetMeeting 、Common Files 、Complus Applications 、Common Files 、 Messenger 、InstallShield Installation Information等目录
![](https://i-blog.csdnimg.cn/blog_migrate/731a39aecf53df855e51bbfba1d0b831.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3d6c29a167e6009f3000b3484a53aec2.png)
判断Desktop_.ini文件是否存在来判断是否感染
![](https://i-blog.csdnimg.cn/blog_migrate/07e3960403646add19347998fb45e01c.png)
不存在则创建Desktop_.ini
![](https://i-blog.csdnimg.cn/blog_migrate/25e69f26073775b5e50ceffd41f93877.png)
Desktop_.ini写入日期
![](https://i-blog.csdnimg.cn/blog_migrate/2cbe90a8a1059e1fc36112ee19075511.png)
Desktop_.ini存在则更新日期
![](https://i-blog.csdnimg.cn/blog_migrate/865fc3780b2dd63b8ae9fa621407d1cf.png)
如果为普通文件,则先判断是不是GHO文件,如果为GHO文件则删除
![](https://i-blog.csdnimg.cn/blog_migrate/394d7309e904a2790417109fa0b5750a.png)
然后判断是不是setup.exe或者NTDETECT.COM文件,是则跳过
![](https://i-blog.csdnimg.cn/blog_migrate/70100f741b3b4011ab947d3770fc8c9a.png)
然后判断感染文件类型程序,会判断后缀名是否为EXE、SCR、PIF、COM文件,是的话则执行Infect_file函数感染
![](https://i-blog.csdnimg.cn/blog_migrate/84a8d569c0b36f709db58d0e4b47bd51.png)
进入Infect_file函数
首先判断程序是否在执行,执行中退出,然后判断文件是否为病毒自身,如果为自身退出;然后将原文件和爆破字典写入内存以便感染,然后判断是否已经感染,如果已经感染则退出
否则执行感染过程
![](https://i-blog.csdnimg.cn/blog_migrate/72a6660ba3021b22a72c96adf250724a.png)
首先复制病毒本体,
![](https://i-blog.csdnimg.cn/blog_migrate/aeb3e75c16c8157c0a3f0f26911eb774.png)
然后生成感染特征值,连接病毒文件和原文件,再连接感染特征值
![](https://i-blog.csdnimg.cn/blog_migrate/bb921ec9632d6565b6e21575136ef742.png)
判断感染类型,判断是否为htm、html、asp、php、jsp、aspx
![](https://i-blog.csdnimg.cn/blog_migrate/12418438b6c0699cac872f956d394af3.png)
是则执行感染函数Infect_Web_File
首先将要写入的内容解码,然后判断是否已经感染。
![](https://i-blog.csdnimg.cn/blog_migrate/ce808470f9f5a5fba6d4f4673a738ab4.png)
然后将上文的内容与\n和\r连接写入网页文件
![](https://i-blog.csdnimg.cn/blog_migrate/579f49b339b939bae21da956820555b7.png)
第二个call,使u盘等移动介质可以传播病毒
设置了一个时间为1770h的ms的计时器,然后执行TimerFunc函数
![](https://i-blog.csdnimg.cn/blog_migrate/500af5ba9af9ad87c42eea2f775c4bdf.png)
TimeFunc函数
首先也是获得盘符并且跳过A、B盘符
![](https://i-blog.csdnimg.cn/blog_migrate/d3d8d9fc7c61bae6eba19b9625b10a37.png)
然后判断setup.exe文件是否存在
![](https://i-blog.csdnimg.cn/blog_migrate/62bc979ad371237069ec0b4eb5dc59e3.png)
不存在则创建,并复制病毒本体到setup.exe
![](https://i-blog.csdnimg.cn/blog_migrate/781a796e1768174663c804c89e081971.png)
存在则判断是否为病毒文件,不是则删除,并创建setup.exe并复制病毒本体
![](https://i-blog.csdnimg.cn/blog_migrate/9801326740688d088142e7bba35b104a.png)
之后判断autorun.inf与setup.exe几乎一致,不过autorun.inf的内容为 [AutoRun]\r\nOPEN=setup.exe\r\nshellexecute=setup.exe\r\nshell\\Auto\\command=setup.exe\r\n
之后就是设置文件属性和退出
![](https://i-blog.csdnimg.cn/blog_migrate/53fa0eb866583fea979f0dccc4cad702.png)
第三个call,连接局域网网络,传播病毒
函数创建了10个线程
![](https://i-blog.csdnimg.cn/blog_migrate/ec463c0ecc43f60c1ebb25ac34f76034.png)
线程起始地址
![](https://i-blog.csdnimg.cn/blog_migrate/df58fe41e595334694f7c5b0ec328ba4.png)
动态调试发现 call edx 的edx的值为40BA8C,跳转到 40BA8C查看
![](https://i-blog.csdnimg.cn/blog_migrate/2179671dae473fb173046884a41bdc7f.png)
查看主函数功能
主功能函数
首先查看网络连接状态
![](https://i-blog.csdnimg.cn/blog_migrate/d595019c42a77d0e494788cd973a9f68.png)
尝试感染端口139和445
![](https://i-blog.csdnimg.cn/blog_migrate/8c22dc2eedfbace9cb741a00f9bfad58.png)
连接成功后感染
![](https://i-blog.csdnimg.cn/blog_migrate/b4ee3a214254357d01f1d18513a081ad.png)
主体功能函数 三
函数设置了6个定时器
![](https://i-blog.csdnimg.cn/blog_migrate/25bb8903c7554c674a96b8abe17171a0.png)
第一个定时器 1s 关闭杀毒软件,注册表添加病毒自启动
sub_406E2C创建了一个线程,会尝试关闭各种作者列举的杀毒软件和windows安全防护,与基础静态分析相符
第一个定时器比较简单,将C:\Windows\System\dirvers\spo0lsv.exe添加到
SOFTWARE\Microsoft\Windows\CurrentVersion\run
SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced\Folde
即设置自启动和添加到受系统保护的文件
![](https://i-blog.csdnimg.cn/blog_migrate/e8e53fbad1481a4da146a1fd9b455445.png)
第二个计时器 1200s 下载文件,可能会二次感染其他病毒
创建的线程首先会冒充qq下载http://www/ac86.cn/66/up.txt
![](https://i-blog.csdnimg.cn/blog_migrate/1b761071c27eeb19022bd62f7d7d1d88.png)
猜测将下载的文件解码然后拼接,运行某程序
![](https://i-blog.csdnimg.cn/blog_migrate/c22da96c203a04769c22e5866b1893b6.png)
第三个计时器 10s 关闭所有盘符的网络共享
创建了2个线程,第一个线程与第二个计时器的功能相同
第二个线程为cmd执行命令关闭所有盘符的网络共享
![](https://i-blog.csdnimg.cn/blog_migrate/f09aaa516ca871316674a598aa492370.png)
第四个计时器 6s 关闭安全服务,删除一些杀毒软件自启动
第四个计时器关闭了一些服务,删除了一些自启动注册表项,
![](https://i-blog.csdnimg.cn/blog_migrate/6c926e7d9f0e015cd134117b8244be19.png)
第五个计时器 10s 解码一些网站,打开?
解码了一些网站,并下载一些内容?
![](https://i-blog.csdnimg.cn/blog_migrate/2c4ccb334c8f372bee15faa7c64baa20.png)
第六个计时器 1800s 下载文件,与二一致
与第二个计时器类似 只不过下载http://update.whboy.net/worm.txt
总结
![](https://i-blog.csdnimg.cn/blog_migrate/c2300b03093bee7f9b0cb896a22ceece.png)
参考
delphi中的一些与字符串处理相关的函数:https://www.cnblogs.com/RbtreeLinux/articles/2353454.html
chatgpt