为什么我写的驱动运行之后电脑CPU占用率直接100%?

mjssw 2012-05-05 04:42:44
我写的过TP保护的驱动在虚拟机下运行完全正常,为什么拿到物理机上面直接CPU占用率100%?
什么情况?
...全文
585 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
cw10406 2012-06-06
  • 打赏
  • 举报
回复
#include "DDK_ShenMing.h"


///////------------函数声明区域-------------------
int InitialDDK(PDRIVER_OBJECT pDriverObject);
int DDK_Unload(PDRIVER_OBJECT p);
NTSTATUS DispatchRoutine(PDEVICE_OBJECT pDevObj,PIRP pIrp);
void Hook();
void Unhook();
//声明函数指针
typedef NTSTATUS (_stdcall *NTTERNIMATEPROCESS)(HANDLE ProcessHandle,NTSTATUS ExitStatus); //定义一个函数指针
NTTERNIMATEPROCESS ImitateNTerminateProcess;//定义一个函数

extern PServiceDescriptorTable KeServiceDescriptorTable; //导出 KeServiceDescriptorTable

NTSTATUS MyNtTerminateProcess(HANDLE ProcessHandle,NTSTATUS ExitStatus);//自己的假冒函数
///////-------------函数声明结束-------------------



#pragma code_seg("INIT")
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObject,PUNICODE_STRING B)
{
KdPrint(("-----进入了驱动主函数。------\n"));
InitialDDK(pDriverObject);
Hook();

pDriverObject->DriverUnload=DDK_Unload;

pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]=DispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CREATE]=DispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_CLOSE]=DispatchRoutine;
pDriverObject->MajorFunction[IRP_MJ_READ]=DispatchRoutine;
return STATUS_SUCCESS;
}

#pragma code_seg("PAGE")
int InitialDDK(PDRIVER_OBJECT pDriverObject)
{
NTSTATUS status;
PDEVICE_OBJECT pDevObj;
UNICODE_STRING DevName,SysName;

RtlInitUnicodeString(&DevName,L"\\Device\\MyDevice");
RtlInitUnicodeString(&SysName,L"\\??\\1111");
status=IoCreateDevice(pDriverObject,0,&DevName,FILE_DEVICE_UNKNOWN,0,TRUE,&pDevObj);
if( status<0) //如果创建设备失败
{
Initial_Status=CREATE_FAILD;
return 0;
}
pDevObj->Flags |=DO_BUFFERED_IO;

status=IoCreateSymbolicLink(&SysName,&DevName);
if(status<0)
{
IoDeleteDevice(pDevObj);
Initial_Status=CREATE_FAILD;
return 0;
}
Initial_Status=CREATE_SUCCESS;
return 1;
}

#pragma code_seg("PAGE")
int DDK_Unload(PDRIVER_OBJECT p)
{
KdPrint(("-----驱动被卸载了------\n"));
if(Initial_Status==CREATE_SUCCESS)
{
PDEVICE_OBJECT pDevObj;
UNICODE_STRING SysName;

RtlInitUnicodeString(&SysName,L"\\??\\1111");
pDevObj=p->DeviceObject;
IoDeleteDevice(pDevObj);
IoDeleteSymbolicLink(&SysName);
if(IS_HOOH==HOOK_SUCCESS)
Unhook();
}

return 1;
}


#pragma code_seg("PAGE")
NTSTATUS DispatchRoutine(PDEVICE_OBJECT pDevObj,PIRP pIrp)
{
ULONG mf,CTL_code;
PIO_STACK_LOCATION stack=IoGetCurrentIrpStackLocation(pIrp);
mf=stack->MajorFunction;
CTL_code=stack->Parameters.DeviceIoControl.IoControlCode;
switch(mf)
{
case IRP_MJ_DEVICE_CONTROL:
{
switch(CTL_code) //判断控制码
{
case hook_code:
{
void *hProcess=(void*)(pIrp->AssociatedIrp.SystemBuffer);
}
case Unkook_code:
{
Unhook();
}
default: break;
}

}//IRP_MJ_DEVICE_CONTROL
case IRP_MJ_CREATE:
{
KdPrint(("调用了IRP_MJ_CREATE事件\n"));
}
default: break;
}
pIrp->IoStatus.Information=4;
pIrp->IoStatus.Status=STATUS_SUCCESS;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}

#pragma code_seg("PAGE")
void Hook()
{
if(IS_HOOH != HOOK_SUCCESS)
{
ULONG Addr;
Addr=(ULONG)(KeServiceDescriptorTable->ServiceTableBase) + 257*4;
NT_Address= *((ULONG*)Addr);
if( *((ULONG*)Addr)==NT_Address ) //如果读取地址正确
{
KdPrint(("---成功的读取了SSDT地址:%x ---\n",NT_Address));
IS_HOOH=HOOK_SUCCESS;//如果地址保存在变量中,就OK。

ImitateNTerminateProcess=(NTTERNIMATEPROCESS)NT_Address;//真的函数指向了RealNTerminateProcess
CloseProtect(); //去掉内存保护
*((ULONG *)Addr)=(ULONG)MyNtTerminateProcess;//替换为我们的函数
OpenProtect (); //恢复内存保护
return ;
}
else
{
KdPrint(("读取SSDT时出错了\n"));
return ;
}

}

}

#pragma code_seg("PAGE")
void Unhook()
{
if(IS_HOOH==HOOK_SUCCESS)//如果hook的地址是真正的地址。
{
ULONG Addr;
Addr=(ULONG)(KeServiceDescriptorTable->ServiceTableBase) + 257*4;
CloseProtect();
*((ULONG*)Addr)=NT_Address;
OpenProtect ();
IS_HOOH=HOOK_UNHOOK; //设置为已经取消了HOOK
KdPrint(("SSDT HOOK取消成功\n"));
}

}


#pragma code_seg("PAGE")
NTSTATUS MyNtTerminateProcess(HANDLE ProcessHandle,NTSTATUS ExitStatus)//假冒函数
{
NTSTATUS status=0;
PEPROCESS process; //接受通过ProcessHandle返回的进程
char *pName; //接受进程的进程名
char *ProcessName="TestPass.exe"; //要保护的进程名字

status=ObReferenceObjectByHandle(ProcessHandle,FILE_READ_DATA,0,KernelMode,&process,NULL); //获取进程

if(status==STATUS_SUCCESS)
{
int Ix=0;
int n;
pName = (char*)PsGetProcessImageFileName(process); //获取进程名
KdPrint(("得到的进程名:%s保护的进程:TestPass.exe\n",pName));
KdPrint(("进程句柄:%x\n",process));
ObfDereferenceObject(process);
for(n=0;(pName[n]!='\0') && (ProcessName[n]!='\0');n++)
{
if(pName[n]!=ProcessName[n])
Ix++;
}

if(Ix<1);
{
KdPrint(("是我们要保护的进程……\n"));
KdPrint((" ACESS Process Name:%s--\n",(PTSTR)((ULONG)process+0x174)));

return STATUS_ACCESS_DENIED;
}

}
else
{
KdPrint(("没有执行保护!\n"));
return (NTSTATUS)ImitateNTerminateProcess(ProcessHandle,ExitStatus);
}
}
我的也是,驱动运行后就CPU 50%多了。
Lactoferrin 2012-05-07
  • 打赏
  • 举报
回复
你是不是希望有小学的
zO_Oz 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 的回复:]

引用 40 楼 的回复:
lz还在上学?我去,膜拜。


我大二学生
[/Quote]
是学生也就罢了,为什么都是大二的???
mjssw 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 的回复:]
lz还在上学?我去,膜拜。
[/Quote]

我大二学生
mjssw 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 的回复:]
引用 48 楼 的回复:

引用 45 楼 的回复:
你是不是希望有小学的


现在的小学初中生老牛逼了,都是搞易语言的,我这个驱动就是我表弟娃找我帮他写的,他要自己搞外挂,听他讲一些做外挂的术语,我真心觉得我老了,现在的初中学生不得了

哈哈,要不是英语的原因,现在中国的软件也不会不及印度阿三。
[/Quote]

还有个原因就是国内太推崇JAVA平台的开发了,天天都在对学生鼓吹JAVA,JAVA教学成本低,教学难度小,这些就削弱了对于底层开发的重视,国内的学校基本全教这些,学校大部学生都重视J2EE之类的。数据结构啊,操作系统啊,高等数学啊,这些课都不重视,天天都在那里搞JAVA,我们寝室就是这个情况,他们丢掉了本科生的学习内容,去学职业学校的东西,简直是本末倒置。
zO_Oz 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 48 楼 的回复:]

引用 45 楼 的回复:
你是不是希望有小学的


现在的小学初中生老牛逼了,都是搞易语言的,我这个驱动就是我表弟娃找我帮他写的,他要自己搞外挂,听他讲一些做外挂的术语,我真心觉得我老了,现在的初中学生不得了
[/Quote]
哈哈,要不是英语的原因,现在中国的软件也不会不及印度阿三。
mjssw 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 的回复:]
引用 43 楼 的回复:

引用 40 楼 的回复:
lz还在上学?我去,膜拜。


我大二学生

是学生也就罢了,为什么都是大二的???
[/Quote]

你也大二的?
那握个抓哈
zO_Oz 2012-05-07
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 的回复:]

你是不是希望有小学的
[/Quote]
暂时不会发生这种事,我儿子他妈还不知道在哪里。
chen870201 2012-05-06
  • 打赏
  • 举报
回复
有点奇怪
不过虚拟机的很多设备都是通用设备,而实体机的设备存在更多的型号
mjssw 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 37 楼 的回复:]
PsOpenProcess这些代码可能被交换到硬盘,这样关掉写保护再读写就会出问题
不过这个的概率很小
[/Quote]

终于弄好了,果然是写保护的问题。被坑惨了
Lactoferrin 2012-05-06
  • 打赏
  • 举报
回复
PsOpenProcess这些代码可能被交换到硬盘,这样关掉写保护再读写就会出问题
不过这个的概率很小
可可西外 2012-05-06
  • 打赏
  • 举报
回复
lz还在上学?我去,膜拜。
i945800687 2012-05-06
  • 打赏
  • 举报
回复
果断悲剧
yrnaaa 2012-05-06
  • 打赏
  • 举报
回复
安心调试,没有思路就去个安静的地好好想想
Lactoferrin 2012-05-05
  • 打赏
  • 举报
回复
这是多任务的系统,当然要用对系统干扰小的
mjssw 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 的回复:]
那你用mdl的方式改写
[/Quote]

我讨厌mdl方式改写保护。。。
Lactoferrin 2012-05-05
  • 打赏
  • 举报
回复
那你用mdl的方式改写
mjssw 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]
版本都是什么,是否安装了安全软件
[/Quote]

我把取消写保护的代码去掉就没问题了,怎么回事?
难道真的是按了金山毒霸的原因?我在只装了360的机子上也是这么起的。
Lactoferrin 2012-05-05
  • 打赏
  • 举报
回复
版本都是什么,是否安装了安全软件
mjssw 2012-05-05
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 的回复:]
检查系统的ntoskrnl版本是否一样
[/Quote]
我是依照物理机的PsOpenProcess的反汇编写的,反而在虚拟机上能运行,物理机上不能
加载更多回复(30)

21,597

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧