刚刚学习驱动编程,实现一个hook ssdt中对ntopenrocess这个函数的hook,通过进程名判断是否ntopenprocess是否是对一个特定进程(以notepad.exe为例)进行打开操作,如果是,那么就返回null,不是就正常执行
在网上也查了一下,找到2种方法实现这种转换
1.通过PsLookupProcessByProcessId
NTSTATUS status=PsLookupProcessByProcessId((ULONG)pClientId,&EProcess);
LPTSTR ProcessName = (LPTSTR)EProcess + 0x1FC;
strlwr(ProcessName);//转换成小写
if(memcmp(ProcessName,L"notepad.exe",22)==0)
{
pProcessHandle=NULL;
rc=STATUS_ACCESS_DENIED;
}
编译通过了,但是一start就蓝,调试中发现是在PsLookupProcessByProcessId一直循环
请教一下是为什么?
2.通过ZwQueryInformationProcess函数
这个不知怎么实现,希望高手能给出用这个函数实现由进程句柄得到进程名的源代码
谢了
在网上也查了一下,找到2种方法实现这种转换
1.通过PsLookupProcessByProcessId
NTSTATUS status=PsLookupProcessByProcessId((ULONG)pClientId,&EProcess);
LPTSTR ProcessName = (LPTSTR)EProcess + 0x1FC;
strlwr(ProcessName);//转换成小写
if(memcmp(ProcessName,L"notepad.exe",22)==0)
{
pProcessHandle=NULL;
rc=STATUS_ACCESS_DENIED;
}
编译通过了,但是一start就蓝,调试中发现是在PsLookupProcessByProcessId一直循环
请教一下是为什么?
2.通过ZwQueryInformationProcess函数
这个不知怎么实现,希望高手能给出用这个函数实现由进程句柄得到进程名的源代码
谢了
解决方案 »
- 在ComboBox控件中能否在光标选中某一项的同时触发一个函数?
- 分析传真的核心技术
- 创建DLL出现的问题!
- 我的机器重装了,可是不想装msdn该怎么设置???
- 如何实现以下的功能,分数不够送分。。。
- 怎样把对话框关闭叉叉变为无效?多多指教
- 如何实现定制的CDC?
- 用COleCurrency的成员函数Format()为什么总出问题?而用此类的其它成员函数却正常.
- 作过CControlBar的请进来,没做过的别说话!
- 使用ADODC和DATAGRID如何做数据更新?
- vc++中编译后0 error(s), 0 warning(s),可执行时:一个或更多文件已过时!是什么原因呢?望指点!
- 关于ID3DXFont.DrawText和窗口最小化的问题
不要随便拷贝来就用另外,EPROCESS中的进程名好像是16个字节长度的字符串,它通常是文件名的前16个字符检查一下这两个地方,应该问题就在这
你用strlwr(ProcessName);对把整个EPROCESS都搞乱了
我的系统是xp+sp2,那偏移应该是?
第二个问题应该怎么解决
修改了该处,以及去掉了strlwr(ProcessName);LPTSTR ProcessName = (LPTSTR)EProcess + 0x174; if((memcmp(ProcessName,L"notepad",14)==0)||(memcmp(ProcessName,L"NOTEPAD",14)==0))
{
pProcessHandle=NULL;
rc=STATUS_ACCESS_DENIED;
}
但是还是蓝啊
把代码贴出来,帮忙看看吧
#include <ntddk.h>
NTSTATUS PsLookupProcessByProcessId(IN ULONG ulProcId,OUT PEPROCESS * pEProcess);
#pragma pack(1)
typedef struct _SystemServiceDescriptorTable
{
PVOID ServiceTableBase;
PULONG ServiceCounterTableBase;
ULONG NumberOfService;
ULONG ParamTableBase;
}SystemServiceDescriptorTable,*pSystemServiceDescritorTable;
#pragma pack()extern pSystemServiceDescritorTable KeServiceDescriptorTable;
ULONG RealServiceAddress;void hook();
void unhook();
void OnUnload(IN PDRIVER_OBJECT DriverObject);typedef NTSTATUS (_stdcall *NTOPENPROCESS)(OUT PHANDLE pProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES pObjectAttributes,
IN PCLIENT_ID pClientId);NTOPENPROCESS RealNtOpenProcess;NTSTATUS _stdcall MyNtOpenProcess(OUT PHANDLE pProcessHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES pObjectAttributes,
IN PCLIENT_ID pClientId)
{
NTSTATUS rc,status;
PEPROCESS EProcess;
pSystem_Processes pSystemInformation=NULL;
LPTSTR ProcessName;
rc=RealNtOpenProcess(pProcessHandle,DesiredAccess,
pObjectAttributes,pClientId);
//判断打开的进程是不是我的进程
// 主要看看这里
status=PsLookupProcessByProcessId((ULONG)pClientId,&EProcess);
ProcessName = (LPTSTR)((ULONG)EProcess + 0x174);
DbgPrint("\nprocess name is :%s\n",ProcessName); /* if((memcmp(ProcessName,L"notepad",14)==0)||(memcmp(ProcessName,L"NOTEPAD",14)==0))
{
pProcessHandle=NULL;
rc=STATUS_ACCESS_DENIED;
}*/ return rc;
}
NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
PUNICODE_STRING RegistryPath)
{
DriverObject->DriverUnload=OnUnload;
hook();
return STATUS_SUCCESS;
}void OnUnload(IN PDRIVER_OBJECT DriverObject)
{
unhook();
}
不过你可以参考这个方案,将整个EPROCESS结构的页面都DUMP出来,就知道进程名所在偏移量了。
// 仅供参考
ULONG GetLocationOfProcessName()
{
ULONG ul_offset;
PEPROCESS CurrentProc = PsGetCurrentProcess(); for(ul_offset = 0; ul_offset < PAGE_SIZE; ul_offset++)
{
if( !strncmp( "System", (PCHAR) CurrentProc + ul_offset,
strlen("System")))
{
return ul_offset;
}
}
return (ULONG) 0;
}
应该是*pClientId才对吧而且你没有对status=PsLookupProcessByProcessId((ULONG)pClientId,&EProcess); 的返回值判断
因为你前面ID的错误,你这个函数实际上是失败了,应该找不到对应的进程所以EProcess可能指向非法内存地址,你对其操作可能导致蓝屏
对,为了省事没有判断
谢谢vocanicy 的热心帮助。
不过还是没有解决啊。
pClientId结构是:
typedef struct _CLIENT_ID
{
PVOID UniqueProcess;
PVOID UniqueThread;
} CLIENT_ID, *PCLIENT_ID;
第一项才是pid多谢 vocanicy 的帮助结账了可是还有ZwQueryInformationProcess函数 不会