阅读:1404回复:8
在VXD中,怎么样得到自己的ProcessID?
我做了个拦截文件操作的VXD,但在VXD中也使用了R0级别的文件操作,现在想使VXD本身可以对文件进行操作,因此需要得到VXD自身的进程ID,以便与ioreq结构中的ir_pid进行比较,希望各位大侠能帮帮忙,很急!!!
|
|
最新喜欢:![]() |
沙发#
发布于:2002-11-28 21:00
呵呵!我已经知道了一点了,在应用程序里面获得进程的句柄永远都是一个常数!就是0x7fffffff,线程句柄也是,而在RING0里面获得的就是真正的进程对象地址了!这个地址跟一个常数异或就是这个进程或者线程的ID了!可以这样来得到,就是用应用程序先获得本进程的ID,然后传给驱动程序,驱动程序获得本应用程序的进程句柄,之后两个数进行异或,就可以得到这个常量了!以后的应用程序的ID就都可以得到了
|
|
板凳#
发布于:2002-04-25 16:27
写错了一点点:
线程数据库address=ThreadId^num; 进程数据库address=[线程数据库address+偏移08h];//偏移可能与版本有关 ProcessId=进程数据库address^num; ―――――――――――――――――――――――――――――――――――― 当然可由Handle得到Id,Handle只是进程句柄表的一个索引罢了。你应首先在应用程序中找到进程句柄表――就在进程数据库的0x44偏移处。比如指针PDB(PULONG类型)指向进程数据库,对象的Handle是handle,则对象指针为point=PDB[handle/4];此point就指向你想要的对象(比如进程对象,而9x中进程对象就是该进程的进程数据库);现在在那个进程的进程数据库^num就是它的Id啦。 注意num每次重启不一样,所每次得重新取。 |
|
地板#
发布于:2002-04-25 15:51
想再问一下,如果得到了进程的HANDLE,可否得到进程的ID?谢谢!
|
|
地下室#
发布于:2002-04-25 10:16
可行,但好久没接触9x的核了,很多东西记不清了。
想了想,只回忆了个笨办法,还不知容不容易实现: 先用Get_Cur_Thread_Handle得到TCB地址(Edi中),TCB结构: struct tcb_s { ULONG TCB_Flags; // 00 Thread status flags ULONG TCB_Reserved1; // 04 Used internally by VMM ULONG TCB_Reserved2; // 08 Used internally by VMM ULONG TCB_Signature; // 0C \'THCB\' (0x42434854) ULONG TCB_ClientPtr; // 10 register images for this thread ULONG TCB_VMHandle; // 14 VM that contain this thread USHORT TCB_ThreadId; // 18 Unique Thread ID USHORT TCB_PMLockOrigSS; // 1A Original SS before stack lock ULONG TCB_PMLockOrigESP; // 1C Original ESP before stack lock ULONG TCB_PMLockOrigEIP; // 20 Original EIP before stack lock ULONG TCB_PMLockStackCount; // 24 count of stack locks for this thread USHORT TCB_PMLockOrigCS; // 28 original CS before stack lock USHORT TCB_PMPSPSelector; // 2A PSP selector ULONG TCB_ThreadType; // 2C DWORD passed to VMMCreateThread USHORT TCB_pad1; // 30 padding UCHAR TCB_pad2; // 32 padding UCHAR TCB_extErrLocus; // 33 extended error Locus USHORT TCB_extErr; // 34 extended error Code UCHAR TCB_extErrAction; // 36 extended error Action UCHAR TCB_extErrClass; // 37 extended error Class ULONG TCB_extErrPtr; // 38 extended error pointer }; // 3C 注意TCB_ThreadId,这是线程Id。 Windows9x中进、线程Id XOR上一个数就是进、线程数据库的地址,所以可通过ThreadId找到进程数据库,从而找到ProcessId。 线程数据库address=ThreadId|num; 进程数据库address=[线程数据库address+偏移08h];//偏移可能与版本有关 ProcessId=进程数据库address|num; 现在就是找num,以前写过9x内核分析程序,可惜记不得了,对98你可这样: hId=GetCurrentThreadId(); _asm{ mov eax,FS:[18h] mov num,eax } num-=8; num=num^hId; 于是得到num。对95似乎不同,将8改为16?WinMe又为?呵呵,自己去试吧。 还有个办法就是从GetCurrentThreadId中获得,具体不记的了,只知挺简单。 good luck |
|
5楼#
发布于:2002-04-24 22:41
是的,不知道是否可行?
|
|
6楼#
发布于:2002-04-24 20:11
Vxd中操作文件的进程?你想得到当前活动进程的ID,即发文件请求进程的ID?
|
|
7楼#
发布于:2002-04-24 18:46
加载Vxd的用户进程的ID应该没有用的,因为我的文件操作不是在Ring3级进行的,而是在Vxd本身进行的,就是说应该得到Vxd中操作文件的进程的ID,不知道哪位大侠知道怎么做,谢谢!!
|
|
8楼#
发布于:2002-04-24 10:24
不知道你要干什么
不过若你要得到加载Vxd的用户进程的ID的话,可以在Ring3Get之后传给Vxd. |
|