首页
社区
课程
招聘
[原创]各操作系统 获取EPROCESS中ActiveProcessLinks的偏移
发表于: 2012-2-9 15:21 11340

[原创]各操作系统 获取EPROCESS中ActiveProcessLinks的偏移

2012-2-9 15:21
11340

看了一些代码  发现在找这个偏移的时候  大都是先判断当前操作系统类型 然后硬编码。
然后就想了这么个方法 通用性可能会好些

仅测试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;
}


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 8
支持
分享
最新回复 (5)
雪    币: 1708
活跃值: (586)
能力值: ( LV15,RANK:670 )
在线值:
发帖
回帖
粉丝
2
学习......
2012-2-9 15:40
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
3
学习......
2012-2-9 16:10
0
雪    币: 52
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
学习了
不过我又在想 遍历链表查找explorer.exe会不会麻烦 简单点判断ImageFileName 偏移的第一个字节是不是英文 不知行不行
2012-2-9 17:13
0
雪    币: 458
活跃值: (421)
能力值: ( 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;
}
2012-2-9 21:27
0
雪    币: 12
活跃值: (701)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
偏移都到0x448了...
2022-8-27 22:40
0
游客
登录 | 注册 方可回帖
返回
//