首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 驱动开发 >

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

2012-09-10 
为什么我写的驱动运行之后电脑CPU占用率直接100%?我写的过TP保护的驱动在虚拟机下运行完全正常,为什么拿到

为什么我写的驱动运行之后电脑CPU占用率直接100%?
我写的过TP保护的驱动在虚拟机下运行完全正常,为什么拿到物理机上面直接CPU占用率100%?
什么情况?

[解决办法]
那没法,驱动编起来就这点不方便
双机调试
[解决办法]

探讨

引用:
你是不是希望有小学的


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

[解决办法]
探讨

引用:
引用:

引用:
你是不是希望有小学的


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

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


还有个原因就是国内太推崇JAVA平台的开发……

[解决办法]
#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%多了。

热点排行