驱动里有病毒么?
不是。
驱动精灵有流氓捆绑软件,但是不会有导致电脑瘫痪的病毒。火绒和其他安全软件本来也是竞品关系。我觉得要兼听则明。就跟在360软件宝库搜不到腾讯安全管家一样,肯定是互相不对付的。
简介
自己用过驱动精灵的体验是,它的确会有很多地方是默认给用户装捆绑软件的,在安装过程中要注意把那些默认勾选的捆绑取消。其实这种行为很多软件都会有,自己以后安装软件不要无脑下一步,每一步都看看有没有给你安装捆绑软件。
我自己的经验是每次需要装驱动的时候下载安装,去掉捆绑。然后安装检测完驱动,就马上卸载掉。
一般驱动是不会中毒的,是系统被感染,中病毒并不会对你的网络驱动器造成损坏,但可能会破坏掉您机器相关的驱动程序.如果驱动程序损坏的话,请查询网络驱动器的相关型号,并下载重新驱动.
重做一下系统就可以了
代码,要实现某个功能,直接 Ctrl+C和Ctrl+V 就能解决问题。但是写出来了驱动能不能加
载进入内核就是另外一回事了,准确的说是能不能存在于别人的硬盘上就是另外一回事了。
因为很多杀毒软件(特别像360这种没技术含量的)见到后缀名为sys的文件就直接删除,
甚至连调用NtLoadDriver的机会都没有。对于一般的软件来说,给出一个声明说明一下解
决方法就算了。但是对于恶意程序,是不能给出声明的。于是很多恶意软件的作者另辟蹊径,
利用大公司写好的而且有数字签名的驱动来做坏事。
有人说,大公司做好的驱动怎么可能被用来做坏事呢?其实,这是很容易理解的事情。
很多安全类或者系统优化类的软件,甚至系统毫不相关的软件(比如:迅雷)都附带有驱动。
这些驱动都带有一定的通用性。q_lai_a_qu网友在其博客里说:“ComputerZ.sys……没事
逆了逆是鲁大师的驱动,发现这个驱动功能齐全,而且没有调用者验证!既可以读、写Msr
寄存器,也可以用in、out指令读写端口,而且char/short/long数据长度齐全!”。这个是
个人之言,可信度请自行揣度。下面说个可信度比较高的例子:曾经有病毒利用了360的
AntiRK.dll来删除杀毒软件的文件(请自行用谷歌搜索“360 antirk.dll”,会有惊喜发现。
AntiRK.dll虽然不是驱动,但也是被非法利用了)。破坏杀毒软件的病毒已经算是小儿科了,
其实利用某些驱动还能破坏硬件!我最近在笔记本上折腾硬件,“本友会”上的网友给我推
荐了几款软件:SetFSB、ThrottleStop、NvFlash、WinFlash。它们分别是修改CPU外频、设
置CPU倍频(可以调节CPU电压)、读写显卡BIOS和读写主板BIOS的软件。一言概括他们的特性,
就是它们都支持NT x86/x64,它们的驱动都有正规数字签名(特别是最后两个,分别带的是 NVIDIA和ASUS的数字签名)。
最为重要的是,他们的驱动没有加花加壳,没有校验调用者,
如果利用这几个驱动,加上一丁点的逆向知识,就能做出破坏性的病毒(以下摘自我在紫水
晶编程论坛的帖子):
1.SetFSB能调节处理器的外频,如果直接把外频调到600MHz,电脑会瞬间黑屏,可能
会损坏 CPU或主板;
2.ThrottleStop能调节 CPU的倍频(如果CPU没有锁倍频),如果直接把倍频调到 31,
电脑会瞬间黑屏,可能会损坏CPU 或主板;ThrottleStop还能调节CPU的核心电压,如果
把CPU的核心电压调到3V,能直接烧毁CPU 甚至主板;
3.NvFlash、WinFlash等软件能直接读写BIOS(显卡BIOS 和主板BIOS),我们可以把
BIOS全部写零;
4.如果做病毒的话,先写坏显卡BIOS 和主板BIOS,然后通过调节电压烧掉显卡和CPU
(有可能会连同主板一起损坏);
解决方案
由此可见,没有验证调用者的驱动实在是有着巨大的危害。我最近受学院委托,做一个
需要驱动的软件(那个驱动会被加上数字签名)。为了防止上述悲剧发生,我决定在正式写
驱动之前,先解决如何防止自己的驱动被恶意利用。以前我曾经在紫水晶编程论坛上问过这
个问题,网友的回答五花八门,不过大概是可以分成三类:第一类是信息验证,比如应用程
序发个信息给驱动来验证一下是“自己人”;第二类是加壳保护,比如给驱动和应用程序加
上极强难脱的壳,利用VMP加密通信部分(类似XueTr 的做法);还有人提出混合应用,综
合第一类和第二类的做法。
这三种想法看似都不错,但是我认为不妥。第一种:别人只要把驱动全部逆向完毕就行
了;第二种:虽然VMP保护和加保护壳使得破解不容易,但是不是使破解变得不可能。而且
VMP 和保护壳能使程序执行的效率降低,我不太喜欢。最可恶的是,杀毒软件对加了壳(甚
至包括 UPX)和 VMP的程序一律报毒,得不偿失。于是我想出了第三种思路:校验调用者的
特征。如果符合,就执行功能语句,否则不予执行。如何校验调用者的特征码呢?不少人想
到的是使用CRC32 或者 MD5。使用它们不是不可以,不过我还有自己的想法。我的想法是自
己设计一套验证算法,它的规则如下:
1.获得调用者的EPROCESS
2.通过调用者的EPROCESS获得调用者的文件路径
3.获取调用者的文件全部内容,放到字节数组buff里
4.把 buff里所有的元素依次相加减(fb1 + fb2 - fb3...),得到y1
5.把 buff里所有的元素依次异或(0 XOR fb1 XOR fb2 XOR fb3...),得到y2
把 y1和 y2与已经计算出来的数值对比,如果都相同则执行功能代码,如果不相同则不
执行功能代码
获得调用者的EPROCESS直接用 PsGetCurrentProcess()就行了,获得调用者的文件路
径比较麻烦,大家可以使用我以前向高手购买的代码(已经封装为函数,方便调用):
//依据 EPROCESS得到进程全路径
VOID GetFullPathByEprocess( ULONG eprocess, PCHAR ProcessImageName )
{
ULONG object;
PFILE_OBJECT FileObject;
UNICODE_STRING FilePath;
UNICODE_STRING DosName;
STRING AnsiString;
FileObject = NULL;
FilePath.Buffer = NULL;
FilePath.Length = 0;
*ProcessImageName = 0;
//Eprocess->sectionobject(offset_SectionObject)
if(MmIsAddressValid((PULONG)(eprocess+offset_SectionObject)))
{
object=(*(PULONG)(eprocess+offset_SectionObject));
//KdPrint(("[GetProcessFileName] sectionobject :0x%x\n",object));
if(MmIsAddressValid((PULONG)((ULONG)object+0x014)))
{
object=*(PULONG)((ULONG)object+0x014);
//KdPrint(("[GetProcessFileName] Segment :0x%x\n",object));
if(MmIsAddressValid((PULONG)((ULONG)object+0x0)))
{
object=*(PULONG)((ULONG_PTR)object+0x0);
//KdPrint(("[GetProcessFileName]
ControlAera :0x%x\n",object));
if(MmIsAddressValid((PULONG)((ULONG)object+0x024)))
{
object=*(PULONG)((ULONG)object+0x024);
if (NtBuildNumber >= 6000) object=((ULONG)object &
0xfffffff8);
//KdPrint(("[GetProcessFileName]
FilePointer :0x%x\n",object));
}
else
return ;
}
else
return ;
}
else
return ;
}
else
return ;
FileObject=(PFILE_OBJECT)object;
FilePath.Buffer = ExAllocatePool(PagedPool,0x200);
FilePath.MaximumLength = 0x200;
//KdPrint(("[GetProcessFileName]
FilePointer :%wZ\n",&FilePointer->FileName));
ObReferenceObjectByPointer((PVOID)FileObject,0,NULL,KernelMode);
RtlVolumeDeviceToDosName(FileObject-> DeviceObject, &DosName);
RtlCopyUnicodeString(&FilePath, &DosName);
RtlAppendUnicodeStringToString(&FilePath, &FileObject->FileName);
ObDereferenceObject(FileObject);
RtlUnicodeStringToAnsiString(&AnsiString, &FilePath, TRUE);
if ( AnsiString.Length >= 216 )
{
memcpy(ProcessImageName, AnsiString.Buffer, 0x100u);
*(ProcessImageName + 215) = 0;
}
else
{
memcpy(ProcessImageName, AnsiString.Buffer, AnsiString.Length);
ProcessImageName[AnsiString.Length] = 0;
}
RtlFreeAnsiString(&AnsiString);
ExFreePool(DosName.Buffer);
ExFreePool(FilePath.Buffer);
}
以上代码需要三个硬编码,分别是NtBuildNumber(系统版本号)、EPROCESS中的
SectionObject项和UniqueProcessId项的偏移。我测试的操作系统是Windows 2003。所以
我在代码里如下定义:
#define offset_SectionObject 0x124
#define offset_UniqueProcessId 0x94
ULONG NtBuildNumber=3790;
获得进程路径后就校验特征码。由于流程已经说清楚了,所以直接给出代码:
VOID CalcChar(PUNICODE_STRING logFileUnicodeString, LONG *XorChar, LONG
*AnSChar)
{
OBJECT_ATTRIBUTES objectAttributes;
IO_STATUS_BLOCK iostatus;
HANDLE hfile;
NTSTATUS ntStatus;
FILE_STANDARD_INFORMATION fsi;
PUCHAR pBuffer;
ULONG i=0,y1=0,y2=0;
//初始化 objectAttributes
InitializeObjectAttributes(&objectAttributes,
logFileUnicodeString,
OBJ_CASE_INSENSITIVE,//对大小写敏感
NULL,
NULL);
//创建文件
ntStatus = ZwCreateFile(&hfile,
GENERIC_READ,
&objectAttributes,
&iostatus,
NULL,
FILE_ATTRIBUTE_NORMAL,
FILE_SHARE_READ,
FILE_OPEN,//即使存在该文件,也创建
FILE_SYNCHRONOUS_IO_NONALERT,
NULL,
0 );
if (!NT_SUCCESS(ntStatus))
{
dprintf("The file is not exist!\n");
return;
}
//读取文件长度
ntStatus = ZwQueryInformationFile(hfile,
&iostatus,
&fsi,
sizeof(FILE_STANDARD_INFORMATION),
FileStandardInformation);
dprintf("The program want to read %d bytes\n",fsi.EndOfFile.QuadPart);
//为读取的文件分配缓冲区
pBuffer = (PUCHAR)ExAllocatePool(PagedPool,
(LONG)fsi.EndOfFile.QuadPart);
//读取文件
ZwReadFile(hfile,NULL,
NULL,NULL,
&iostatus,
pBuffer,
(LONG)fsi.EndOfFile.QuadPart,
NULL,NULL);
dprintf("The program really read %d bytes\n",iostatus.Information);
//异或计算
for(i=0;i<iostatus.Information;i++)
y1=y1^(LONG)(*(pBuffer+i));
*XorChar=y1;
//加减计算
for(i=0;i<iostatus.Information;i++)
{
if(i%2==0)
y2=y2+(LONG)(*(pBuffer+i));
else
y2=y2-(LONG)(*(pBuffer+i));
}
*AnSChar=y2;
//关闭文件句柄
ZwClose(hfile);
//释放缓冲区
ExFreePool(pBuffer);
}
接下来就要调用了。我们需要编写一个函数VerifyCaller,在此函数里有两个值需要
固化在驱动里,就是合法调用者的两个特征值。为了方便计算这两个特征值,我特地写了个
应用程序,核心代码如下:
Option Explicit
Private Function ReadFile(ByVal strFileName As String, Optional ByVal
lngStartPos As Long = 1, Optional ByVallngFileSize As Long = -1) As Byte()
Dim FilNum As Long
FilNum = FreeFile
Open strFileName For Binary As #FilNum
If lngFileSize = -1 Then
ReDim ReadFile(LOF(FilNum) - lngStartPos)
Else
ReDim ReadFile(lngFileSize - 1)
End If
Get #FilNum, lngStartPos, ReadFile
Close #FilNum
End Function
Private Function WriteFile(ByVal strFileName As String, bytData() As Byte,
Optional ByVal lngStartPos As Long = -1,Optional ByVal OverWrite As Boolean =
True)
On Error GoTo erx
Dim FilNum As Long
FilNum = FreeFile
If OverWrite = True And Dir(strFileName) <> "" Then
Kill strFileName
End If
Open strFileName For Binary As #FilNum
If lngStartPos = -1 Then
Put #FilNum, LOF(FilNum) + 1, bytData
Else
Put #FilNum, lngStartPos, bytData
End If
Close #FilNum
erx:
End Function
Private Sub Command1_Click()
Dim buff() As Byte, i As Long, y As Long, ub As Long
'text1.text is the file name
buff = ReadFile(Text1.Text, 1, -1)
ub = UBound(buff)
'calc xor char
y = 0
For i = 0 To ub
y = y Xor buff(i)
Next
Text2.Text = CLng(y)
DoEvents
'calc add/sub char
y = 0
For i = 0 To ub
If i Mod 2 = 0 Then
y = y + CLng(buff(i))
Else
y = y - CLng(buff(i))
End If
Next
Text3.Text = CLng(y)
End Sub
Private Sub Form_Load()
Me.Icon = LoadPicture("")
End Sub
驱动里的 VerifyCaller代码如下:
LONG VerifyCaller(void)
{
PEPROCESS cur_ep;
char cur_pp[260];
char *nt_cur_pp;
ANSI_STRING asCur_pp;
UNICODE_STRING usCur_pp;
LONG xorc, ansc;
cur_ep=PsGetCurrentProcess();
GetFullPathByEprocess((ULONG)cur_ep, cur_pp);
//在文件名前面加上\??\
nt_cur_pp=cs("\\??\\",cur_pp);
DbgPrint("%s",nt_cur_pp);
RtlInitAnsiString(&asCur_pp, nt_cur_pp);
RtlAnsiStringToUnicodeString(&usCur_pp, &asCur_pp, TRUE);
DbgPrint("%wZ",&usCur_pp);
CalcChar(&usCur_pp, &xorc, &ansc);
DbgPrint("XorChar: %ld; AnSChar: %ld",xorc,ansc);
//这个就是事先算好的合法程序的特征码,【必须】固化在驱动里!
if(xorc==186 && ansc==136176)
return 1;
else
return 0;
}
在 DispatchIoctl函数的每个功能执行之前,都调用VerifyCaller()校验一下调用者:
switch(uIoControlCode)
{
case IOCTL_VERIFY:
{
DbgPrint("[MyDriver] DispatchIoctl - IOCTL_VERIFY");
if(VerifyCaller()==1)
DbgPrint("[MyDriver] {IOCTL_VERIFY} Function code run now!");
else
DbgPrint("[MyDriver] {IOCTL_VERIFY} You're illegal caller!");
status = STATUS_SUCCESS;
break;
}
//下面省略
}
运行测试
3.首先把合法的调用者,非法的调用者(用eXeScope随便把合法的调用者Patch一下,
比如删掉程序的版本信息)和驱动复制到虚拟机
4.用合法的调用者来加载驱动并执行
5.用非法的调用者来加载驱动并执行
6.对比以上两者在DbgView的输出
调用者合法时:
调用者非法时:
写在最后
写完这篇文章,我必须再次重申:只有当驱动程序携带正式数字签名时,验证调用者的
代码才有使用价值。为什么这么说呢?因为别人无法patch 带有正式数字签名的驱动(一旦
驱动被 patch,签名就失效了,就像被破处的女人,不值钱了。这个比喻虽然粗俗,但是很
恰当)。而没有加上签名的驱动,本来就没有使用价值。即使别人要使用,直接把驱动扔到
IDA 里,什么代码都出来了。
许多动物自身含有病毒,为何他们不会被感染?
虽说家里养的动物也存在病毒等,但是只要处理好卫生问题还是没事的。建议家里有小孩子、抵抗力低的老人或者孕妇尽量不要养宠物。世界上有很多动物,那么有哪些动物携带的病毒多呢?老鼠:大家都知道,黑死病的罪魁祸首就是老鼠;秃鹫:这种动物吃腐尸,所以携带病毒机率很大;猪:都听说过猪流感病毒把,所...
中国发现新人畜共患病毒“琅琊”,该病毒有哪些预防措施?
科学家通过研究发现,这种病毒可能由鼩鼱携带,所以我们平时要避免接触这种动物。也要远离蝙蝠等野生动物,因为野生动物身上带有很多病毒,所以要避免接触这些动物。另外病猪也不能碰,因为病猪也可能有这种病毒。养成良好的饮食习惯,不喝生水。生水中可能会携带病毒,生椰汁中也可能会携带病毒,生海枣树汁...
患上新冠病毒的动物会感染其他动物吗?为什么动物没有暴发疫情?
还有一种是自身携带病毒,但无法感染其他生物。这种情况下,只要病毒没有发生变异,基本上该病毒对其他生物不会造成什么影响。第二种情况是携带病毒并发病的生物,它们在感染病毒后,会造成身体机能下降,比如:速度、灵敏度等,会因此而死亡。由于尸体中仍含有大量的病毒,如果此时有别的动物接触该尸体,那...
动物病毒、植物病毒和细菌病毒分别有哪些?
动物病毒:禽流感病毒、疯牛病、HIV、狂犬病毒、肺炎病毒、肝炎病毒等;植物病毒:烟草花叶病毒、郁金香碎色花病毒、大蒜E病毒等;细菌病毒(噬菌体):T2噬菌体、T4噬菌体、T5噬菌体、T7噬菌体、λ噬菌体、P22噬菌体等。
宠物狗一般会有狂犬病毒吗
现在还没有发现任何动物先天带狂犬病毒,狗或猫都是后天被感染的,并且,已经知道如果动物不在传染期内,无法通过咬(抓)伤使得你被感染。健康的动物不传播狂犬病。 1、是所有的猫狗都有狂犬病吗? 当然不是,狗\/猫不会先天携带狂犬病毒,母婴也不能遗传狂犬病:实际上,你的狗、猫想得上狂犬病...
病毒如何从动物中传染给人类?
因为生存的环境不大相同,能够感染人体的病毒和感染动物的病毒的组成会有所不同。病毒是由衣壳蛋白和内部的核酸构成,核酸用于繁殖,而蛋白质衣壳则是它们识别并进入细胞内的关键,所以造成了病毒的宿主会有区别。人类和动物的细胞组成等方面有不少差别,以感染动物为主的病毒一般是很难感染人体的,而且...
野生动物身上那么多病毒,为何古代猎人没有被感染?
一、野生动物传染人类是有概率存在的,而且古代大多数都是煮熟食用,感染的机率比较低 古代猎人为何不容易被传染,要知道病毒其实也存在进化的,现在的病毒之所以那么凶基本上是因为进化了。而且病毒是让感染人类还存在概率,加上在有明火后,猎人捕猎了食物都使煮熟来吃,这样能够减少了感染病毒的情况;很多...
手机中病毒有哪些症状?怎样解决?
如果您使用的是华为手机,可以通过以下方法操作:1. 建议您更新病毒库,重新进行病毒查杀:(1)HarmonyOS :手机管家>齿轮按钮>防病毒软件更新和联网查杀,选择仅连接 WLAN 时或所有网络下。(2)EMUI8.X及以下:点击手机管家 > 病毒查杀 > 齿轮按钮> 手动更新病毒库,并建议您打开自动更新病毒库和仅...
十二生肖里身上有毒液的动物是什么?
狗是身上携带狂犬病病毒的动物。狂犬病是一种致命的疾病,通过狗的咬伤或唾液传播给人类,严重时可导致死亡。二、牛:疯牛病 牛可能携带疯牛病病毒,也称为布鲁氏菌病。这种病毒可以通过接触受感染的牛或其产品传播给人类,引发严重的神经系统疾病。三、鼠:鼠疫 鼠是携带鼠疫杆菌的动物,鼠疫是一种严重...
蝙蝠身上发现一种新病毒,是吗?
”但是Lee警告说,即便V基因有助于让亨尼帕病毒变得如此致命,但它很可能并非唯一应该对此负责的基因。蝙蝠是翼手目动物的总称,翼手目是哺乳动物中仅次于啮齿目动物的第二大类群,现生物种类共有19科185属962种,除极地和大洋中的一些岛屿外,分布遍于全世界。蝙蝠主要依靠回声来辨别物体。
但爱六味: 也有可能是系统盘有毒,以前的番茄花园就有毒,每次重装完以后都要先杀会毒才可以,你假如认为自己电脑有毒,不妨下个杀毒软件杀杀毒 ESET: http://download.eset.com/download/win/ess/ess_nt32_chs.msi 账号获取器: http://www.tudou8.cn/download.asp 安装完后重启,点那个账号获取器,批量获取,然后验证账号,把有效的账号一键导入 接着,等ESET自动更新到最新的,完了之后重启电脑,按F8进安全模式,打开ESET进行杀毒
杭锦后旗13521026721: 这个驱动是病毒吗 - ?
但爱六味: 有驱动并没有病毒,而只是与程序不兼容.还有可能是多余的程序没必要安装
杭锦后旗13521026721: 驱动力也会有病毒吗???刚下载时没有……可在电脑里放了一个月就有啦……被小红伞给杀啦????
但爱六味: 驱动一般没病毒,如果刚下载没有,而且是正规网站下载的话 可能是小红伞误杀 最近出现恶意木马程序的新变种,大部分主流病毒技术都进入了驱动级,与杀毒软件争抢系统驱动的控制权,在争抢系统驱动控制权后,转而控制杀毒软件,使杀毒软件功能失效 驱动级程序是操作系统内优先级最高的程序,它可以获得内核级的系统优先权,可以先于普通应用程序启动并获得系统控制权.
杭锦后旗13521026721: 打印机驱动程序会中病毒吗 - ?
但爱六味: 别的安装程序能打开不能? 打不开是你的电脑中了病毒了吧,杀一下,还有就是修复一下(最好用sreng2内有系统修复第一项文件关联,看有错误的没有,修复一下]]]安全卫士360或者卡卡也可以) 电脑自动识别打印机后,要从安装什么程序,------就是要的打印机驱动程序 下面的不用管它 我还没有WIN驱动盘... 从那里能获得G:\WINDOWS\TVOA\i386呢.....
杭锦后旗13521026721: 视频驱动有病毒吗?
但爱六味: 有,安装前用杀毒扫一下
杭锦后旗13521026721: 蓝牙适配器安装驱动有没有病毒? - ?
但爱六味: 没事的!卖家给的,有些软件就算不是病毒,360也会把他们当作病毒的,比如激活工具,盗版单机游戏的dll文件等等360都会把这些当作病毒,但是他们其实病毒.至于协议是英文那就是说安装的软件本身就是英文版的,不奇怪.
杭锦后旗13521026721: 用软件说加载驱动是有毒么? - ?
但爱六味: 不是,软件驱动是软件的一种保护装置,很多底层软件都要加载驱动.虽然有些病毒也会加载驱动,但并不能说加载驱动了就是病毒,大部分还都是正常程序
杭锦后旗13521026721: 我的电脑驱动光盘(一个小光盘)中木马病毒了?
但爱六味: 我来告诉你标准答案!光盘是只读的,也就是说里面的数据无法修改,如果有病毒的话,你是清理不掉的.如果是买电脑时附带的驱动盘,有病毒的可能性很小,你可以直接选择“信任”操作有可能是杀毒软件误报.
杭锦后旗13521026721: 驱动器中病毒怎么办? - ?
但爱六味: 驱动器只是硬盘工作用的硬件,并不存储数据,所以是不会中病毒的.这只是你的硬盘中出现了病毒.利用金山一类的杀毒软件删除可疑病毒文件就好.
杭锦后旗13521026721: C:\windows\drivers里的文件是病毒吗? - --?
但爱六味: 这...这个文件夹里都是你电脑的硬件的驱动程序,比如显卡,声卡,网卡的驱动等等.NOD32报毒,有两种可能,要么你中毒了,病毒文件隐藏在这里,要么就是误报.其实还是建议你用瑞星,现在也免费了,知识前一段时间的丑闻把瑞星弄得抬不起头....