阅读:1579回复:5
麻烦问下大家,在98 VXD中如何根据32位进程句柄得到进程名
我使用ONCREATEPROCESS可以得到32位的进程句柄(是句炳么。。。他写的是ProcessToken.......)(我是使用DS),我想根据句柄获得进程名,请问我该怎么做呀,谢谢大家(不一定非要DS的方法,其他直接使用DDK的标准函数也可以的,毕竟DS其实最后还是使用DDK嘛,HOHO,谢谢大家了)
|
|
最新喜欢:![]() |
沙发#
发布于:2005-07-13 14:47
只能自己顶了呀
|
|
板凳#
发布于:2005-07-13 16:10
我以前回答过这个问题,你搜一下以前的帖子
|
|
地板#
发布于:2005-07-14 09:43
VWIN32_GetCurrentProcessHandle返回的进程句柄,实际上是一个指向PEB结构的指针,
通过这个指针可以获取进程路径, 但是在OnCreateProcess中只能获取进程ID,所以还需要通过进程ID来获取进程句柄, 具体的方法就是(进程ID ^ 进程句柄 = 常数),这个常数在系统起来后就不会变化,但是每次系统启动后这个数都不是相同的(有点拗口) PS:微软被人骂,不是没有道理的,呵呵,不知在windows系统中,人为地设置了多少障碍 所以解决的方法就是: 在win32下获取当前进程的进程id,然后通过device io把这个进程id传给vxd,在vxd中获取当前进程句柄, 然后把这个两个数异或,得到一个数g_dwObfuscator,以后可以通过这个g_dwObfuscator,在OnCreateProcess中 通过进程id获取进程句柄,然后再获取进程路径 // pid: 进程id // ppath: 缓冲区,保存进程路径 BOOL GetProcessName(DWORD pid, CHAR *ppath) { DWORD dwAddress; if (g_dwObfuscator != 0) { dwAddress = pid ^ g_dwObfuscator; dwAddress += 0x40; if ((dwAddress = *(DWORD *)dwAddress) != 0) // PEB->ProcessParameters { dwAddress += 0x8; if ((dwAddress = *(DWORD *)dwAddress) != 0) // PEB->ProcessParameters->ImageFile { sprintf(ppath, (CHAR *) dwAddress); return TRUE; } } } sprintf(ppath, "???"); return FALSE; } |
|
地下室#
发布于:2005-07-14 16:48
倒塌。。。楼上的老大们,问题是现在不允许任何RING 3程序与之交互。。。。只能自己通过一个PROCESS TOKEN来得到进程名。。。。。。
|
|
5楼#
发布于:2005-07-14 17:59
我查看了一下,ON CREATE PROCESS得到的的确是ID。。。。。我记得ID应当是全局PDB的一个索引???能否用其他方式获得PDB呢。。。这样是不是就好做了。。。顺便提一下,我发现在我用做开发的机器上的常数是放在固定位置的。。。30:1e66c,不知道是每台机器都一样还是不一样。。。。
|
|