看了一些代码 发现在找这个偏移的时候 大都是先判断当前操作系统类型 然后硬编码。
然后就想了这么个方法 通用性可能会好些
仅测试xp sp3 其他没有测试 应该没什么问题吧。
//获取EPROCESS结构中 ImageFileName 的偏移
int GetNameOffset(PEPROCESS pEproc)
{
for(int i=0; i<0x250; i++)
{
if (_stricmp("system", ((char *)pEproc + i)) == 0)
{
return i;
}
}
return 0;
}
//检查是否是一个完整的双向链表,并根据之前获得的进程名 判断是否存在Explorer.exe进程
BOOLEAN CheckIsListEntry(PLIST_ENTRY pl, int iOffset, int iNameOffset)
{
BOOLEAN bRet = FALSE;
PLIST_ENTRY pStart = pl->Blink;
for ( ;pStart != NULL && pStart != pl; pStart = pStart->Blink)
{
//DbgPrint("ProcName:%s", (char *)pStart - iOffset + iNameOffset);
if (_stricmp("explorer.exe", (char *)pStart - iOffset + iNameOffset) == 0)
{
bRet = TRUE;
}
}
if (pStart == pl && bRet)
{
return 1;
}
return 0;
}
//各操作系统通用代码 获取EPROCESS中ActiveProcessLinks的偏移
int GetLinkOffset(PEPROCESS pEproc)
{
int iNameOffset = GetNameOffset(pEproc);
for (int iOffset = 0; iOffset<0x200; iOffset++)
{
PLIST_ENTRY pList = (PLIST_ENTRY)((unsigned int)pEproc + iOffset);
if (!MmIsAddressValid(pList->Blink))
{
continue;
}
if (!MmIsAddressValid(pList->Blink->Flink))
{
continue;
}
if (!MmIsAddressValid(pList->Flink))
{
continue;
}
if (!MmIsAddressValid(pList->Flink->Blink))
{
continue;
}
if (pList->Blink->Flink == pList && pList->Flink->Blink == pList && CheckIsListEntry(pList, iOffset, iNameOffset))
{
return iOffset;
break;
}
}
return 0;
}
[2023春季班]《安卓高级研修班(网课)》月薪两万班招生中~