首页
社区
课程
招聘
[讨论]简单获取PspCidTable地址
发表于: 2011-1-6 14:46 7130

[讨论]简单获取PspCidTable地址

2011-1-6 14:46
7130
这样好像也可以简单的获取 PspCidTable的地址,我的机器是WinXP+SP3,这样会有什么问题呢?如果没有问题那就不用搜索内存特征字符了

ULONG GetPspCidTableAddr()
{
        //取得PspCidTableAddr的地址
        UNICODE_STRING vStrFunName;
        RtlInitUnicodeString(&vStrFunName,L"PsLookupProcessByProcessId");
        PVOID vPsLookupProcessByProcessIdAddr=MmGetSystemRoutineAddress(&vStrFunName);
        if(NULL==vPsLookupProcessByProcessIdAddr)
        {
                KdPrint(("Get PsLookupProcessByProcessId Failed...\n"));
                return 0;
        }
        ULONG vPspCidTable=*(ULONG*)((ULONG)vPsLookupProcessByProcessIdAddr+sizeof(ULONG)*22);//我通过Windbg dd PspCidTable 和 dd PsLookupProcessByProcessId发现,PspCidTable的地址在PsLookupProcessByProcessId的地址偏移
                                                                                              //23个ULONG的位置处,所以直接取了,虽然PspCidTable地址会变,但是重启或者换一台机器,这个23个便宜不变
        return vPspCidTable;
}

我测试好长时间,好像完全没有问题啊....抹掉进程在这里的痕迹就方便了

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
本来PspCidTable就是这么获得的呀!!!
所说的<搜索内存特征字符>,指的是PsLookupProcessByProcessId会用到PspCidTable,但是各个系统PspCidTable出现的地方不一样,值也不一样,可以根据PspCidTable前后的特征来实现搜索。
你直接取是可以的,但是不通用啊,说不定WINDOWS一个补丁你这个方法就失效了呢,还是搜索的的通用性强。
2011-1-6 15:10
0
雪    币: 1157
活跃值: (847)
能力值: ( LV8,RANK:150 )
在线值:
发帖
回帖
粉丝
3
原来这样啊,我还以为自己独创了一种呢,见笑,不过也是俺自己想出来的,呵呵,你说系统打补丁 这个会变吗??我看看SP2下,这个偏移是不是变化了
2011-1-6 16:09
0
雪    币: 1157
活跃值: (847)
能力值: ( LV8,RANK:150 )
在线值:
发帖
回帖
粉丝
4
不知道为什么要用0xff35 和0xe8作为特征串。。。。这个特征串和PspCidTable的地址关系是怎么样的呢??这种关系 “铁” 吗??
2011-1-6 16:11
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
打补丁可能会变,这个是微软的补丁,会不会变不是我们能说了算了的,呵呵,你可是试试其他系统。0xff35 和0xe8是指令啊,呵呵你想想啊,系统是怎么用PspCidTable的呀,PspCidTable是个变量,系统用ExEnumHandlTable来枚举的,那么系统可以这么实现:
push PspCidTable
call    ExEnumHandlTable

所以呢,搜索的时候可以看哪个地方有push且下一个指令是call的,由于PsLookupProcessByProcessId的第一个call就是ExEnumHandlTable,所以可以以此来确定PspCidTable的地址。
不过这两个特征码(0xff35和0xe8)在2K-2003是适合的,在WIN7下是不适用的。自己Windbg看就知道了。
2011-1-6 17:31
0
雪    币: 1157
活跃值: (847)
能力值: ( LV8,RANK:150 )
在线值:
发帖
回帖
粉丝
6
那这样也不准确了,要是微软以后这样实现ExEnumHandleTable的实现改了,比如参数变了,不再只有一个PspCidTable作为参数,那搜索也没有用了,呵呵
2011-1-6 17:55
0
雪    币: 4817
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
是啊,没说这个就100%准确啊,但是比你的硬编码准确,不是么?再说啦,这种方法商业也在用,实践证明,这种方法还是比较可靠的呀。
当没有100%的方法的时候,我们难道就只能放弃了,而不能用比较准确的方法了么?

还有,ExEnumHandleTable本来就不止一个参数,我没说只有一个参数啊
2011-1-6 18:41
0
雪    币: 1157
活跃值: (847)
能力值: ( LV8,RANK:150 )
在线值:
发帖
回帖
粉丝
8
其实我是想说调用ExEnumHandleTable的时候,参数不再这么传递了,比如以后可能两个参数的顺序变了,之类的.....恩,这个问题基本也就这样了,不过我好像抹掉PspCidTable中的内容,断掉链条,还是被检测了出来,难道他们真的这样:
for(int i=0;i<65535;i++)
{
    HANDLE hHandle=OpenProcess(..,i,..);//遍历打开??
    if(hHandle!=INVALID_HANDLE_VALUE)
    {
         //存在
    }
}

还是有其他的检测方法呢??请教
2011-1-6 19:34
0
雪    币: 7651
活跃值: (523)
能力值: ( LV9,RANK:610 )
在线值:
发帖
回帖
粉丝
9
方法太多,请参考以下内容:
http://hi.baidu.com/ep0cring/blog/item/98c2e45808eb8f222934f0dc.html
2011-1-6 20:46
0
雪    币: 88
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
教主果然给力啊
2011-1-6 22:01
0
游客
登录 | 注册 方可回帖
返回
//