能力值:
( LV5,RANK:60 )
|
-
-
2 楼
送一段代码,XP Professional SP2上测试通过。
DWORD g_dwOrgKiFastCallEntry = 0;
VOID PrintCurrentProcess()
{
char szImageFileName[16] = {0}; // EPROCESS的UCHAR ImageFileName[ 16 ]含结束符
PEPROCESS pCurrentProcess = PsGetCurrentProcess();
memcpy(szImageFileName, (char *)pCurrentProcess + 0x174, 16);
KdPrint(("%s EPROCESS: %08x\n", szImageFileName, pCurrentProcess));
}
VOID __declspec(naked)MyKiFastCallEntry()
{
_asm
{
pushfd;
pushad;
push fs;
push 0x30;
pop fs;
call PrintCurrentProcess;
pop fs;
popad;
popfd;
jmp [g_dwOrgKiFastCallEntry];
}
}
VOID HookKiFastCallEntry()
{
_asm
{
mov ecx, 0x176; // MSR_SYSENTER_EIP
rdmsr;
mov g_dwOrgKiFastCallEntry, eax;
mov eax, MyKiFastCallEntry;
wrmsr;
}
}
VOID UnhookKiFastCallEntry()
{
_asm
{
mov ecx, 0x176; // MSR_SYSENTER_EIP
mov eax, g_dwOrgKiFastCallEntry;
wrmsr;
}
}
|
能力值:
( LV9,RANK:140 )
|
-
-
3 楼
fs:0 得到TEB,TEB0x30偏移处就是PEB了,
PEB结构的0x0c偏移的地方就是_PEB_LDR_DATA,
而_PEB_LDR_DATA结构有一个OrderModuleList成员,
OrderModuleList第一个成员的链表偏移0x8处就是kernel32基址了,
得到kernel32基址就相当于得到了涌泉之水,那你想干嘛就干嘛了.......
|
能力值:
( LV5,RANK:60 )
|
-
-
4 楼
现在在内核中。。FS获得的不是TEB
|
能力值:
( LV5,RANK:60 )
|
-
-
5 楼
[QUOTE=yarpee;1068241]送一段代码,XP Professional SP2上测试通过。
DWORD g_dwOrgKiFastCallEntry = 0;
VOID PrintCurrentProcess()
{
char szImageFileName[16] = {0}; // EPROCESS的UCH...[/QUOTE]
你的代码跟我原先的思路一模一样,但是有个疑惑
push 0x30;
pop fs;
call PrintCurrentProcess;
call前保证FS是0x30我不太明白,我没加这玩意蓝了。。这个是什么原因。给个方向指导下
|
能力值:
( LV5,RANK:60 )
|
-
-
6 楼
u KiFastCallEntry和PsGetCurrentProcess你就知道了,进入KiFastCallEntry时fs是未切换到R0的值的,而PsGetCurrentProcess却要用到它。
|
能力值:
( LV5,RANK:70 )
|
-
-
7 楼
PsGetProcessImageFileName 啊 有这么强大的函数要什么EPROCESS啊!!!
|
能力值:
( LV5,RANK:60 )
|
-
-
8 楼
PsGetProcessImageFileName的参数是PEPROCESS。
|
能力值:
( LV5,RANK:60 )
|
-
-
9 楼
我调试了下,发现如果不加上push 0x30,pop fs,FS原来的值也是0x30,但是这样会蓝,不知道为什么
|
能力值:
( LV3,RANK:30 )
|
-
-
10 楼
exediy
PsGetProcessImageFileName 啊 有这么强大的函数要什么EPROCESS啊!!!
这个不全啊
|
|
|