- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
鬼影3分析报告,鬼影病毒分析,鬼影实录分析,邪降3鬼影随行,鬼影实录,瘦长鬼影,鬼影面具,鬼影病毒,瘦长鬼影降临,迷雾鬼影
鬼影3分析报告
鬼影驱动hello_tt.sys
驱动DriverEntry进去后,创建了一个内核线程,主要做了以下事情,删除beep.sys,创建文件c:\alg.exe,并且从磁盘的后几百个扇区里把鬼影exe(mb.exe)执行时放在那里的alg.exe读取出来,然后创建run启动项,设置为c:\alg.exe。
驱动还会挂钩atapi的DriverObject的StartIo函数,修改成hello_tt.sys里的一段代码,这段代码主要是防止别人尝试恢复MBR,经测试,在hello_tt.sys存在的情况下,修复MBR会失败。
鬼影主程序MB.exe
鬼影主程序MB.exe里面很多花指令,但是主要做的工作比较简单,主要做了读取物理磁盘容量,读取真实MBR,将MBR的数据进行循环左移3位加密,然后将MBR和alg.exe和hello_tt.sys一起写入到,物理磁盘的倒数0x34600个字节处,然后释放alg.exe到c:\目录,并调用winexec运行,并且释放hello_tt.sys并加载运行。
alg.exe
这个主要是弹出各种广告之类的,没太大顽固性
修复方法
MBR修复
鬼影对MBR的修改只是单纯的修改了磁盘最开始的1个扇区,对于分区表之类的没有做修改,修复方法为:
主要是读取磁盘倒数0x34600处的512个字节,然后进行解密,但是首先要patch调驱动里对atapi的hook,这个很简单。
void ROR(unsigned char * pChar, char bits)
{
__asm
{
mov ebx,pChar
mov al,byte ptr [ebx]
mov cl,bits
ror al,cl
mov [ebx],al
}
}
void DecodeMbr(unsigned char * pMbr)
{
int i;
for(i = 0 ;i 512; i++)
{
ROR(pMbr + i,3);
}
}
void FixMbr()
{
HANDLE hFile = INVALID_HANDLE_VALUE;
DISK_GEOMETRY DiskGeometry = {0};
DWORD dwBytesReaded = 0;
ULONGLONG uTotalBytes = 0;
ULARGE_INTEGER uFileOffset = {0};
unsigned char uMbr[512];
hFile = CreateFile(_T(\\\\.\\PhysicalDrive0),
GENERIC_ALL,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
printf(Open Disk Failed!!\n);
goto __Cleanup;
}
if(!DeviceIoControl(hFile,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL,
0,
DiskGeometry,
sizeof(DISK_GEOMETRY),
dwBytesReaded,
NULL))
{
printf(DeviceIoControl Failed\n);
goto __Cleanup;
}
uTotalBytes = DiskGeometry.Cylinders.QuadPart * DiskGeometry.TracksPerCylinder * DiskGeometry.SectorsPerTrack * DiskGeometry.BytesPerSector;
uFileOffset.QuadPart = uTotalBytes - 0x34600;
uFileOffset.QuadPart += 0x2400;
SetFilePointer(hFile,uFileOffset.LowPart,(PLONG)uFileOffset.HighPart,FILE_BEGIN);
if(!ReadFile(hFile,uMbr,512,dwBytesReaded,NULL)
|| dwBytesReaded != 512)
{
printf(ReadFile Failed\n);
goto __Cleanup;
}
DecodeMbr(uMbr);
__asm int 3;
dwBytesReaded = 0;
dwBytesReaded = SetFilePointer(hFile,0
文档评论(0)