阅读:2973回复:9
关于KPROCESS和EPROCESS问题
问题的提出:如何在驱动程序中得到当前进程的完整路径名?
我看了一些资料,发现目前常用的方法就是使用EPROCESS的基址加上一定的偏移量,得到成员ImageFileName的地址。但是EPROCESS的第一个成员是KPROCESS结构,而关于这个结构的定义,我目前看见有3、4个版本,每一个版本的定义都不一样,显然大小也不一样(常见的有0x68和0x6C两种),直接导致上面的偏移量也不一样。 我的问题:如何知道当前驱动程序所在的操作系统的KPROCESS大小? |
|
最新喜欢:![]() |
沙发#
发布于:2002-12-06 10:52
简单的问题没有人回答,难的问题也没有人回答... :mad: :mad: :mad:
|
|
板凳#
发布于:2002-12-06 13:10
使用windgb可以把这个结构看到的。
!kdev2x86!strct eprocess,好像是这个命令。 详细看下Inside win2k吧。 |
|
|
地板#
发布于:2002-12-06 14:29
可以用filemon的方法,在DriverEntry里面取PsGetCurrentProcess()的EPROCESS结构比如叫ep,然后在里面找\"System\"串,这个串相对与&ep的差就是进程名在整个EPROCESS的偏移量。
得到偏移量之后,得到其他进程的名字就不难了吧。 |
|
地下室#
发布于:2002-12-06 14:42
简单的问题没有人回答,难的问题也没有人回答... :mad: :mad: :mad: ft,你把它归于哪一类了?:o 各版本不同是正常的,你知道各版本的异同是应该的,既然你知道了版本的不同又知道了得到版本的函数还有什么好说的 |
|
5楼#
发布于:2002-12-06 15:45
To : Axi
这种方法当然可以,但我要的是我在驱动程序中进行判断。 To : wangleo 谢谢,我试试先! To : pjf ???老大每一次回答都很含蓄:D,可是我还是菜鸟啊 :( 老大要是有空再帮看看这个:D:D:D http://www.driverdevelop.com/forum/viewthread.php?tid=27215 |
|
6楼#
发布于:2002-12-06 20:28
不同版本的区别你知道了,一般来说都获得版本号(比如用PsGetVersion(...)等)后采取不同的动作。 另外这段代码运行没错,生成了111122222子键 void CMy1Dlg::OnOK() { DWORD dwRet; HANDLE hSysKey; NT::UNICODE_STRING SysKeyName; NT::OBJECT_ATTRIBUTES KeyObj; ULONG Disposition; NT::UNICODE_STRING SubKeyName; HANDLE hSubKey; NT::OBJECT_ATTRIBUTES SubKeyObj; NT::RtlInitUnicodeString(&SysKeyName,L\"\\\\Registry\\\\Machine\\\\Software\"); InitializeObjectAttribute(&KeyObj,&SysKeyName,OBJ_CASE_INSENSITIVE,NULL,NULL); dwRet = NT::ZwCreateKey(&hSysKey,KEY_ALL_ACCESS,&KeyObj,0,NULL,REG_OPTION_NON_VOLATILE,&Disposition); if(dwRet != 0) return; NT::RtlInitUnicodeString(&SubKeyName,L\"111122222\"); InitializeObjectAttribute(&SubKeyObj,&SubKeyName,OBJ_CASE_INSENSITIVE,hSysKey,NULL); dwRet = NT::ZwCreateKey(&hSubKey,KEY_ALL_ACCESS,&SubKeyObj,0,NULL,REG_OPTION_NON_VOLATILE,&Disposition); if(dwRet != 0) return; } |
|
7楼#
发布于:2002-12-06 21:43
To : pif
1、关于KEPROCESS和EPROCESS问题,已经采用Filemon里边的方法,搞定了。 2、关于NtCreateKey, 我真是碰到鬼了!!!我分别在VC和BCB里边测试我原来的代码了,都提示“内存访问分配无效”。 你贴出的代码跟我的代码有一点差别,那就是我是动态调用函数的,而你是静态连接的,会不会是这个问题引起错误??? 我这里静态连接编译错误太多,所以一直使用动态调用的方式!没有办法测试静态调用的情况。 ======== 先给分 :D |
|
8楼#
发布于:2002-12-06 22:29
1、关于KEPROCESS和EPROCESS问题
//ImageFileName并非你开始说的“完整路径名”,若你只要它自然无需知道系统version。 2、关于NtCreateKey, 我真是碰到鬼了!!! //有可能。你的代码亦运行的很好。 void CMy1Dlg::OnOK() { HINSTANCE hInst; hInst = GetModuleHandle(\"NtDll.Dll\"); NTCREATEKEY NtCreateKey = (NTCREATEKEY)GetProcAddress(hInst, \"NtCreateKey\"); NTDELETEKEY NtDeleteKey = (NTDELETEKEY)GetProcAddress(hInst,\"NtDeleteKey\"); /////// DWORD dwRet; HANDLE hSysKey; UNICODE_STRING SysKeyName; OBJECT_ATTRIBUTES KeyObj; ULONG Disposition; UNICODE_STRING SubKeyName; HANDLE hSubKey; OBJECT_ATTRIBUTES SubKeyObj; RtlInitUnicodeString(&SysKeyName,L\"\\\\Registry\\\\Machine\\\\Software\"); InitializeObjectAttributes(&KeyObj,&SysKeyName,OBJ_CASE_INSENSITIVE,NULL,NULL); dwRet = NtCreateKey(&hSysKey,KEY_ALL_ACCESS,&KeyObj,0,NULL,REG_OPTION_NON_VOLATILE,&Disposition); if(dwRet != 0) return; RtlInitUnicodeString(&SubKeyName,L\"111122222\"); InitializeObjectAttributes(&SubKeyObj,&SubKeyName,OBJ_CASE_INSENSITIVE,hSysKey,NULL); dwRet = NtCreateKey(&hSubKey,KEY_ALL_ACCESS,&SubKeyObj,0,NULL,REG_OPTION_NON_VOLATILE,&Disposition); if(dwRet != 0) return; } |
|
9楼#
发布于:2002-12-06 22:46
1、关于KEPROCESS和EPROCESS问题
//ImageFileName并非你开始说的“完整路径名”,若你只要它自然无需知道系统version。 ========= 呵呵,只要ImageFileName就可以了。 2、关于NtCreateKey, 我真是碰到鬼了!!! //有可能。你的代码亦运行的很好。 ============ 那我就是真的碰到鬼了! :( TNND,不管它了。 |
|