破坏主板?如何破坏笔记本电脑的主板
一、如何破坏笔记本电脑的主板
电脑主板实体破坏必然会造成经济损失,不推荐使用。破坏主板可以做到没有经济损失,只要是通过虚拟破坏的即可,下面用一个小案例来说明虚拟破坏电脑主板的好处。
案例:虚拟破坏电脑主板。
步骤:
1.打开3ds Max场景文件,选择主板模型。
2.按Delete键删除模型,场景中将没有任何物体存在。形式上做到了电脑主板的破坏,实际上运行3ds Max的电脑并没有被破坏(破坏了的话就不能运行3ds Max软件),破坏的只是3ds Max里的电脑主板模型。该做法可以不浪费金钱(电费或电费+网费除外),又实现了最终目标。
二、如何破坏电脑硬件
这已经是超出我本行的事了,不过还是给你解决了吧,觉得游泳就采纳我!
自己打个CIH病毒。用吸铁石在硬盘运行时放上去,必坏。CPU和内存要搞坏从外部都能看出来的。主板最简单,拿铅笔涂2到3电容。
最有效的就是静电发了,但是了能要开机箱,我就中过招,装机时没卸静电,每个硬件摸了一遍,全部报废……
倒水应该不会被人发现,只要不要太多。
把机箱捂死,散热遭破坏,不过应该只会不停重启!
把CPU超频在极端以上,CPU就会烧坏。
破坏电脑的几大因素:
带电插拔。
过于用力地晃动或震动。
电压不稳定,特别是大电流。
散热不好。
灰尘多。
主要几点:
1.CPI超频
超外频、加电压破坏CPU、显卡、内存等:目前新型主板采用“软跳线”的越来越多,这正好给病毒以可乘之机。所谓“软跳线”是指在BIOS中就能改动CPU的电压、外频和倍频。病毒可以通过改BIOS参数,加高CPU电压使其过热而烧坏,或提高CPU的外频,使CPU和显卡、内存等外设超负荷工作而过热烧坏。这类事件的前兆就是死机。所以,如果发现机器经常死机,就要赶紧到CMOS中看看以上参数是否有改动。可喜的是,目前很多主板都有CPU温度监测功能,超温后立即降频报警,可以基本杜绝烧坏硬件的情况发生。
2.破坏显示器
众所周知,每台显示器都有自己的带宽和最高分辨率、场频。早期生产的14英寸彩色显示器,带宽大约只有35-45MHz,对应的最高分辨率为1024×768场频;目前的14英寸彩色显示器,带宽大都有60MHz,对应的最高分辨率为1024×768场频;15英寸彩色显示器,带宽有110MHz,对应的最高分辨率为1280×1024场频。大家可以查看一下显示器的说明书,上面都有场频与最高分辨率的配合。若其中有一项超过,就会出现花屏,严重了就会烧坏显示器。病毒可以通过篡改显示参数来破坏显示器。虽然新型显示器有DDC标准化与系统联络,但病毒想钻空子并不难。所以大家如果发现在使用过程中显示器出现了花屏,要立即关掉显示器的电源,重新启动后进入安全模式再找原因。
3.破坏光驱
光驱中的光头在读不到信号时就会加大激光发射功率,这样长期下去对光驱的寿命极为不利。有人做实验,让正常的光驱不停的读取一张划痕很多,信号较弱的光盘,28小时以后光驱就完蛋了。病毒可以让光头走到盘片边缘无信号区域不停的读盘,结果光头读不到信号,便加大发射功率不停地读,要不了几天,光驱就要“No Disc”了。所以要经常注意光驱灯的闪亮情况,判断光驱是否在正常工作。
4.超“显频”破坏显卡
目前很多中高档显卡等都可以手动改变其芯片的频率,并且改的方法更简单:在Windows注册表里改。病毒改动了“显频”,显卡也就容易超负荷工作而烧坏。这种事件的前兆也是死机。所以,死机时也不要忽视对“显频”的检查。
5.破坏硬盘
大家都知道,分区、高级格式化对硬盘都没有什么损伤,惟独低级格式化对硬盘的寿命有较大的影响。据说硬盘做上10次低级格式化就会报废。如果出现一种病毒,不停的对硬盘的0磁道做低格式化,0道坏了再做1道……你的硬盘容量就会一点一点地被蚕食,而且0、1、2……道坏了,要想再使用该硬盘,就得在BIOS中重新设定起始磁道,再低级格式化,非常麻烦。
6.破坏主板、显卡的Flash BIOS
这就是现在的CIH病毒破坏主板的方式。病毒用乱码冲掉了BIOS中的内容,使机器不能启动。不过现在很多主板都有带有Flash BIOS写保护跳线,可以有效的防止CIH病毒破坏主板。但是不要忘了,很多显卡也有Flash BIOS,说不定哪一天就会冒出一种破坏显卡BIOS的病毒。所以还是小心一点为好,这可没有什么特效药啊。
硬件的弱点分析:
1.硬盘--最怕震动
运送带硬盘的电脑不能简单把它们搬运到某个地方,要注意防止一些大的震动的产生。因为硬盘是复杂的机械装置,装在电脑内部,容忍度有限。大的震动会让磁头组件碰到盘片上,引起硬盘读写头划破盘表面,这样可能损坏磁盘面,潜在地破坏存在的硬盘上数据(你的心血哟!),更严重的还可能损坏读写头,永久的使硬盘无法使用。所以,我们一定要把读写头安置在盘的安全区,然后才能搬动;在搬动的过程中一定要动作轻;如果打算用车来运输它,最好把它放在车厢的后面位置上;如果是通过邮寄,请将它很好地包裹起来。
2.主板--最怕静电和形变
静电可能会蚀化主板上BIOS芯片和数据,损坏各种基于mos晶体管的接口门电路,它们一坏,所有的“用户”(插在它上面的板卡或设备)都互相找不到了,因为它们的联系是靠总线、控制芯片组、控制电路来协调和实现的。所以,我们要尽量用柔软、防静电的物品包裹主板,注意用手触摸它时,要先触摸一下导体,使手上的静电放出,再轻拿轻放。另外,主板的变形可能会使线路板断裂、元件脱焊,主板上的线路可是密得很,断裂了你根本就找不到。以致于,我携带主板时尽量不要让其它物品放在主板上面,最好将其放入主板包装盒中携带;在安装主板时,一定要仔细将其平稳的安装在机箱上,不要一边高一边低;在插显卡、声卡或其它卡时,注意一定要压力适中,平衡施力。
3.内存--最怕超频
因为内存与CPU有着直接的联系,所以内存是CPU提速最难解决的瓶颈。外频越高,工作的速度也就越快,同时,内存由于需要工作在CPU的相同外频下,所以当CPU超频时,内存是否同外频保持一致,是超频成功的关键,最重要是超频一旦使内存达不到所需频率,极易出现黑屏,甚至发热损坏。
4. CPU--最怕高温和高电压
虽然CPU有小风扇保护,但随着耗用电流的增加所产生的热量也随之增加,从而使CPU的温度将随之上升。高温容易使内部线路发生电子迁移,导致电脑经常死机,缩短CPU的寿命,高电压更是危险,很容易烧毁你的CPU。预防上述情况的发生,方法有加装辅助散热风扇,散热风扇要保持干净,定期做预防保养;打雷下雨天,不打开电脑,且将电脑的电源插头拨下;配用稳压器;超频时应尽可能不要用提高内核电压来帮助超频,因为这是得不偿失的。
5.光驱--最怕灰尘、震动和粗劣的光盘
光驱出现读盘速度变慢或不读盘的故障,主要是激光头出现问题所致。除了激光头自身寿命有限的原因外,无孔不入的灰尘也是影响激光头寿命的主要因素。灰尘不仅影响激光头的读盘质量和寿命,还会影响光驱内部各机械部件的精度。所以保持光驱的清洁显得尤为重要。对于光驱的机械部件一般使用棉签酒精擦拭即可,但激光头不能使用酒精和其他清洁剂,可以使用气囊对准激光头吹掉灰尘。由上可知,灰尘是激光头的“杀手”,但震动同样会使光头“打碟”,损坏光头。所以,我们在先择光驱时,震动大小也是一个重要的参考要素,同时,在安装光驱时,尽量将光驱两旁的螺丝扭紧,让其固定在机箱上,也可以减小其震动。另外粗劣的光盘也是光驱的大敌,它会加大光头伺服电路的负担,加速机芯的磨损,加快激光管的老化。不知道你信不信,现在市面上流行的DVCD是光驱最危险的敌人,因为它的光点距离与普通光驱设计标准点距小的多,光驱读它就像近视眼人看蝇头小字一样困难,说不定哪天就“瞎眼了”。
6.键盘--最怕潮气、灰尘、拉拽
现在大部分的键盘都采用塑料薄膜开关,即开关由三线塑料薄膜构成,中间一张是带孔的绝缘薄膜,两边的薄膜上镀上金属线路和触点,受潮腐蚀、沾染灰尘都会使键盘触点接触不良,操作不灵。发现这种情况后应很仔细地打开键盘的后盖用棕刷或吸尘器将赃物清除出来。拖拽易使键盘线断裂,使键盘出现故障。所以,我们要尽量保持工作场所的干净整洁,特别是键盘边上要干净;不要在电脑附近吸烟;不要在键盘附近吃东西;不要把喝水的杯子放在键盘附近;不要带电地插拔键盘;定期地用纯酒精擦洗键盘;使用键盘时,尽量不拖拽键盘;键盘不用时,要盖上保护罩。
7.鼠标--最怕灰尘、强光、拉拽
现在大多数人使用的都还是基于轨迹球的鼠标,这类鼠标价格便宜、使用方便,但有个最大的问题,就是容易脏,小球和滚轴上沾上灰尘会使鼠标机械部件运作不灵。另外,强光会干扰光电管接受信号,拉拽同样会使“鼠尾”断裂,使鼠标失灵。所以,我们要定期清洗鼠标的小球和滚轴;尽量使用专用鼠标垫,定期清洁鼠标垫,鼠标垫要根据不同的材料选择不同的清洁剂,能用清水解决问题最好;避免在阳光下打开、使用鼠标。
8.显示器--最怕高温、高压等
显示器是与人进行交流的界面,也是整个电脑系统中的耗电大户,是最容易损坏的部件。它最忌的是冲击、高温、高压、灰尘、很高的亮度和对比度等,由于显像管很精密,瞬间冲击会损伤它,容易发生诸如断灯丝,裂管颈、漏气等问题;高温易使电源开关管损坏,温度越高开关管越容易击穿损坏,所以它的散热片很大;灰尘易使高压电路打火。很高的亮度和对比度会降低荧光粉的寿命,使显示器用不了几年就会“面目无光”,色彩黯淡。
所以我们在使用电脑时,尽量不要频繁地开机、关机,因为显像管的灯丝冷阻很小,刚开机时冲击电流很大,频繁开机不利于保护灯丝,另外对显像管阴极度也有影响;要避免太阳光、高强度电光直接照射显示器,因为它们会提升显示器的温度,加速显示器显像管老化,显示器不用时请用罩布罩好;如长期不用,应定期加电驱潮,防止突然开机产生高压打火,造成烧坏元器件故障;显示器应放置在通风散热良好的地方,顶部的散热孔不要放置其他物品。
父母的钱赚的也不容易,他们不买肯定也是有他们的苦衷的,你不必破坏嘛,你要为他们着想。最可怕的就是你弄坏了他们因为经济等各种条件不给你买了,那么就完了……
如果觉得有用的就采纳我。
祝您开心,春节快乐!
三、怎样破坏电脑硬件
对于一个经常写程序的人来说,写驱动不是一件困难的事情。因为网络上有很多现成的
代码,要实现某个功能,直接 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里,什么代码都出来了。