slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
阅读:2974回复:9

关于KPROCESS和EPROCESS问题

楼主#
更多 发布于:2002-12-05 11:01
问题的提出:如何在驱动程序中得到当前进程的完整路径名?

我看了一些资料,发现目前常用的方法就是使用EPROCESS的基址加上一定的偏移量,得到成员ImageFileName的地址。但是EPROCESS的第一个成员是KPROCESS结构,而关于这个结构的定义,我目前看见有3、4个版本,每一个版本的定义都不一样,显然大小也不一样(常见的有0x68和0x6C两种),直接导致上面的偏移量也不一样。

我的问题:如何知道当前驱动程序所在的操作系统的KPROCESS大小?

最新喜欢:

flyfoxflyfox
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-12-06 10:52
简单的问题没有人回答,难的问题也没有人回答... :mad: :mad: :mad:
Axi
Axi
驱动牛犊
驱动牛犊
  • 注册日期2002-02-05
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-12-06 13:10
使用windgb可以把这个结构看到的。
!kdev2x86!strct eprocess,好像是这个命令。
详细看下Inside win2k吧。
举世而誉之而不加劝,举世而非之而不加沮,定乎内外之分,辩乎荣辱之境,斯已矣。
wangleo
驱动牛犊
驱动牛犊
  • 注册日期2002-01-23
  • 最后登录2003-08-24
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-12-06 14:29
可以用filemon的方法,在DriverEntry里面取PsGetCurrentProcess()的EPROCESS结构比如叫ep,然后在里面找\"System\"串,这个串相对与&ep的差就是进程名在整个EPROCESS的偏移量。

得到偏移量之后,得到其他进程的名字就不难了吧。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-12-06 14:42
简单的问题没有人回答,难的问题也没有人回答... :mad: :mad: :mad:


ft,你把它归于哪一类了?:o
各版本不同是正常的,你知道各版本的异同是应该的,既然你知道了版本的不同又知道了得到版本的函数还有什么好说的
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
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
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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;
}
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-12-06 21:43
To : pif

1、关于KEPROCESS和EPROCESS问题,已经采用Filemon里边的方法,搞定了。

2、关于NtCreateKey,

我真是碰到鬼了!!!我分别在VC和BCB里边测试我原来的代码了,都提示“内存访问分配无效”。

你贴出的代码跟我的代码有一点差别,那就是我是动态调用函数的,而你是静态连接的,会不会是这个问题引起错误???

我这里静态连接编译错误太多,所以一直使用动态调用的方式!没有办法测试静态调用的情况。

========

先给分 :D
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
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;
}
slwqw
驱动大牛
驱动大牛
  • 注册日期2002-07-18
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分7分
  • 威望197点
  • 贡献值0点
  • 好评度147点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-12-06 22:46
1、关于KEPROCESS和EPROCESS问题
//ImageFileName并非你开始说的“完整路径名”,若你只要它自然无需知道系统version。

=========

呵呵,只要ImageFileName就可以了。

2、关于NtCreateKey,
我真是碰到鬼了!!!
//有可能。你的代码亦运行的很好。

============

那我就是真的碰到鬼了! :(

TNND,不管它了。
游客

返回顶部