能力值:
( LV15,RANK:670 )
2 楼
学习......
能力值:
( LV7,RANK:100 )
3 楼
学习......
能力值:
( LV3,RANK:20 )
4 楼
学习了
不过我又在想 遍历链表查找explorer.exe会不会麻烦 简单点判断ImageFileName 偏移的第一个字节是不是英文 不知行不行
能力值:
( LV9,RANK:610 )
5 楼
思路2:
1.PsGetCurrentProcess获得system进程的EPROCESS结构
2.PsGetProcessId获得system进程的pid
3.for(int i=pid+4; i<0x8000; i+=4) 直到PsLookupProcessByProcessId成功获得一个EPROCESS止
4.ActiveLink的偏移从1开始试,先判断是否是完整的链,然后后来获得的那个ERPOCESS是否在此链中
//检查p1是否是一个完整的双向链表,并且p2也在 此链表中
BOOLEAN CheckIsListEntry(PLIST_ENTRY p1, PLIST_ENTRY p2)
{
BOOLEAN bExist = FALSE;
PLIST_ENTRY p = p1->Blink;
for(; (p != NULL) && MmIsAddressValid(p->Flink) && MmIsAddressValid(p->Blink) && (p != p->Flink) && (p != p->Blink) && (p!=p1); p = p->Blink)
{
if (p2 == p)
{
bExist = TRUE;
}
}
//p==p1保证是一个完整的双向链表,刚好转了一圈
//bExist保证此双向链表中存在p2节点
if (p == p1 && bExist)
{
return TRUE;
}
return FALSE;
}
//获取EPROCESS中ActiveProcessLinks的偏移
int GetEProcessActiveLinkOffset()
{
__asm int 3
PEPROCESS pEproc = PsGetCurrentProcess();
int iPid = (int)PsGetCurrentProcessId();
PEPROCESS pEproc2 = NULL;
for (int i=iPid+4; i<0x10000; i+=4)
{
NTSTATUS ntStatus = PsLookupProcessByProcessId((HANDLE)i, &pEproc2);
if (STATUS_SUCCESS == ntStatus && pEproc2)
{
break;
}
}
for (int iOffset = 0; iOffset<0x250; iOffset++)
{
PLIST_ENTRY pList = (PLIST_ENTRY)((unsigned int)pEproc + iOffset);
PLIST_ENTRY pList2 = (PLIST_ENTRY)((unsigned int)pEproc2 + iOffset);
if (!MmIsAddressValid(pList->Blink) || !MmIsAddressValid(pList2->Blink) || !MmIsAddressValid(pList->Flink) || !MmIsAddressValid(pList2->Flink))
{
continue;
}
if (CheckIsListEntry(pList, pList2))
{
ObfDereferenceObject(pEproc2);
return iOffset;
break;
}
}
ObfDereferenceObject(pEproc2);
return 0;
}
能力值:
( LV2,RANK:10 )
6 楼
偏移都到0x448了
...