找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 4467|回复: 2

请教问题,Hook函数的时候,偏移量和位移是怎么算...

[复制链接]

9

主题

53

回帖

0

精华

贵宾会员

积分
16
发表于 2016-1-15 15:45:44 | 显示全部楼层 |阅读模式
请教问题,在这里先谢了,顺便祝论坛越办越好。

Hook函数的时候,偏移量和位移是怎么算出来的


ULONGLONG GetSSDTFuncCurAddr(ULONG id)
{
        LONG dwtmp = 0;
        ULONGLONG add = 0;
        PULONG ServiceTableBase = NULL;
        ServiceTableBase = (PULONG)KeServiceDescriptorTable->ServiceTableBase;
        dwtmp = ServiceTableBase[id];
        ShowStuff0(dwtmp);
        dwtmp = dwtmp >> 4;
        add = ((LONGLONG)dwtmp + (ULONGLONG)ServiceTableBase);//&0xFFFFFFF0;
        return add;
}
dwtmp >> 4这句,右移四位,为什么要右移
#define SETBIT(x,y) x|=(1<<y) //将X的第Y位置1
#define CLRBIT(x,y) x&=~(1<<y) //将X的第Y位清0
#define GETBIT(x,y) (x & (1 << y)) //取X的第Y位,返回0或非0

ULONG GetOffsetAddress(ULONGLONG FuncAddr, CHAR ParamCount)
{
        LONG dwtmp = 0, i;
        CHAR b = 0, bits[4] = { 0 };
        PULONG ServiceTableBase = NULL;
        ServiceTableBase = (PULONG)KeServiceDescriptorTable->ServiceTableBase;
        dwtmp = (LONG)(FuncAddr - (ULONGLONG)ServiceTableBase);
        dwtmp = dwtmp << 4;
        //处理参数
        if (ParamCount>4)
                ParamCount = ParamCount - 4;
        else
                ParamCount = 0;
        //获得dwtmp的第一个字节
        memcpy(&b, &dwtmp, 1);
        //处理低四位,填写参数个数
        for (i = 0; i<4; i++)
        {
                bits[i] = GETBIT(ParamCount, i);
                if (bits[i])
                        SETBIT(b, i);
                else
                        CLRBIT(b, i);
        }
        //把数据复制回去
        memcpy(&dwtmp, &b, 1);
        return dwtmp;
}
ParamCount参数为什么要这样处理
       

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2016-1-15 16:14:16 | 显示全部楼层
要么你看看另外一个人的总结:http://www.m5home.com/bbs/thread-8378-1-1.html

9

主题

53

回帖

0

精华

贵宾会员

积分
16
 楼主| 发表于 2016-1-18 11:24:43 | 显示全部楼层
Tesla.Angela 发表于 2016-1-15 16:14
要么你看看另外一个人的总结:http://www.m5home.com/bbs/thread-8378-1-1.html

好的,谢谢
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表