首页
社区
课程
招聘
[讨论]x64的SSDT怎么声明?
发表于: 2013-9-9 17:55 14829

[讨论]x64的SSDT怎么声明?

2013-9-9 17:55
14829
RT
现在已经能加载驱动 关了PG 想试试SSDT HOOK

但是以前X86声明SSDT表的方法好像不能用了

我的声明如下:
#pragma pack(push, 1)
typedef struct _SERVICE_DESCRIPTOR_TABLE
{
        PULONG        ServiceTable;
        PULONG        ServiceCounterTable;
        ULONG        NumberOfService;
        ULONG        ParamTableBase;
}SERVICE_DESCRIPTOR_TABLE,*PSERVICE_DESCRIPTOR_TABLE;
#pragma pack(pop)

//Extern Symbol
extern PSERVICE_DESCRIPTOR_TABLE KeServiceDescriptorTable;

编译时候提示的错误:
1>1>drv.obj : error LNK2001: unresolved external symbol KeServiceDescriptorTable
1>1>d:\desktop\pg_test\pg_test\drv.obj : error LNK2001: unresolved external symbol KeServiceDescriptorTable
1>1>d:\desktop\pg_test\pg_test\objchk_win7_amd64\amd64\PG_Test.sys : fatal error LNK1120: 1 unresolved externals
1>1>d:\desktop\pg_test\pg_test\objchk_win7_amd64\amd64\pg_test.sys : error LNK1120: 1 unresolved externals

这里为啥会有2001这个错误? 难道X64声明SSDT的方法和X86不一样么 求指教。

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

收藏
免费 0
支持
分享
最新回复 (24)
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
汗死……64位下,tmd ssdt表就没有导出……
2013-9-9 18:22
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
刚吃饭回来 查了一下 的确是个悲剧  找方法拙计ing
2013-9-9 18:33
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
1.内核SSDT没有导出 只能用ZW函数找特征
2.有PG在...你能干嘛
2013-9-9 18:39
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
PG可以日掉的

还有inline hook 在64位下比 ssdt hook稳定
2013-9-9 18:40
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
干掉PG会导致严重的安全问题..
所以是无法商业化的..自己用就随便了

为啥64位下inline反而稳定呢?
2013-9-9 18:42
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
7
PG已经干掉了 就是找下SSDT而已~
2013-9-9 18:47
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
你要这样想哦,自己的电脑,关了PG,自己想怎么搞自己的系统,就怎么搞,但是,其他软件因为不知道
有没有关PG,所以不敢乱搞
2013-9-9 20:20
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
9
兄弟给指点下 SSDT有啥比较方便快捷的获取方式 我考虑了一下还是觉得  比INLINE舒服点。
反正我也是自己电脑折腾
2013-9-9 20:37
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
10
你真懒啊,下次得百度一下啊~

我搜索了2篇文章,可以看看
http://www.m5home.com/bbs/thread-6289-1-1.html
http://www.kanliuxing.com/thread-1128-1-1.html

貌似PDB文件解析KeServiceDescriptorTable这个符号,x64下就能获取地址~

或者搜索特征码,
2013-9-9 22:08
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
11
http://blog.csdn.net/lziog/article/details/6059409

这篇文章也不错~~~
2013-9-9 22:12
0
雪    币: 53
活跃值: (23)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这篇文章挺好,, 哇咔咔,小K...大雄可是和我们同一个时代的人呐..

你们都比我积极多了。
2013-9-9 22:25
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
13
//true:ssdt
//false:shadowssdt
PSERVICE_DESCRIPTOR_TABLE GetSsdtExTable(unsigned char *ZwCloseProcBase,BOOLEAN SsdtType)
{
        UNICODE_STRING FunctionName;
        LDE Ldex64=NULL;
        int nIndex;
        DWORD64 OpcodeLength;
        BOOLEAN IsFound;
        LONG ImmTemp;
        DWORD_PTR UsignedImmTemp;
        unsigned char * KiServiceInternal;
        DWORD_PTR KeServiceDescriptorTableShadow;

        if (ZwCloseProcBase == NULL)
        {
                return NULL;
        }
        Ldex64=(LDE)ExAllocatePool(NonPagedPool,sizeof(LdeCode));
        if (Ldex64==NULL)
        {
                return FALSE;
        }
        RtlCopyMemory(Ldex64,LdeCode,sizeof(LdeCode));

        IsFound=FALSE;
        for (nIndex=0;nIndex<30;nIndex++)
        {
                if(MmIsAddressValid(ZwCloseProcBase))
                {
                        OpcodeLength=Ldex64((DWORD64)ZwCloseProcBase,64);
                        if (OpcodeLength==5)
                        {
                                if(ZwCloseProcBase[0]==0xe9)
                                {
                                        IsFound=TRUE;
                                        break;

                                }
                        }
                        ZwCloseProcBase+=OpcodeLength;
                }
        }
        if (!IsFound)
        {
                LogDebug("get ZwCloseProcBase call failed\n");
                return NULL;
        }
        ImmTemp=*(LONG*)(&ZwCloseProcBase[1]);

        UsignedImmTemp=(DWORD_PTR)ImmTemp;
        KiServiceInternal=(unsigned char *)((DWORD_PTR)ZwCloseProcBase+5+UsignedImmTemp);

        LogDebug("KiServiceInternal:%p\n",KiServiceInternal);

        /*
        fffff800`03c8ffea 83e720          and     edi,20h
        fffff800`03c8ffed 25ff0f0000      and     eax,0FFFh
        nt!KiSystemServiceRepeat:
        fffff800`03c8fff2 4c8d1547782300  lea     r10,[nt!KeServiceDescriptorTable (fffff800`03ec7840)]
        fffff800`03c8fff9 4c8d1d80782300  lea     r11,[nt!KeServiceDescriptorTableShadow (fffff800`03ec7880)]
        */
        IsFound=FALSE;
        for (nIndex=0;nIndex<150;nIndex++)
        {
                if(MmIsAddressValid(KiServiceInternal))
                {
                        OpcodeLength=Ldex64((DWORD64)KiServiceInternal,64);
                        if (OpcodeLength==5)
                        {
                                if (KiServiceInternal[0]==0x25&&
                                        KiServiceInternal[1]==0xff&&
                                        KiServiceInternal[2]==0x0f&&
                                        KiServiceInternal[3]==0x00&&
                                        KiServiceInternal[4]==0x00)
                                {
                                        KiServiceInternal+=OpcodeLength;

                                        OpcodeLength=Ldex64((DWORD64)KiServiceInternal,64);
                                        if (OpcodeLength==7)
                                        {
                                                //4c 8d 15
                                                if (KiServiceInternal[0]==0x4c&&
                                                        KiServiceInternal[1]==0x8d&&
                                                        KiServiceInternal[2]==0x15)
                                                {
                                                        //get ssdt
                                                        if (SsdtType)
                                                        {
                                                                IsFound=TRUE;
                                                                break;
                                                        }
                                                        KiServiceInternal+=OpcodeLength;

                                                        OpcodeLength=Ldex64((DWORD64)KiServiceInternal,64);
                                                        if (OpcodeLength==7)
                                                        {
                                                                //4c 8d 1d
                                                                if (KiServiceInternal[0]==0x4c&&
                                                                        KiServiceInternal[1]==0x8d&&
                                                                        KiServiceInternal[2]==0x1d)
                                                                {
                                                                        //__debugbreak();
                                                                        IsFound=TRUE;
                                                                        break;
                                                                }
                                                        }
                                                }
                                               
                                        }

                                }
                        }
                        KiServiceInternal+=OpcodeLength;
                }

        }
        if(!IsFound)
        {
                return NULL;
        }
        ImmTemp=*(LONG*)(&KiServiceInternal[3]);
        UsignedImmTemp=(DWORD_PTR)ImmTemp;

        KeServiceDescriptorTableShadow=(DWORD_PTR)KiServiceInternal+7+UsignedImmTemp;

        LogDebug("SSDTEx Table:%p\n",KeServiceDescriptorTableShadow);

        return (PSERVICE_DESCRIPTOR_TABLE)KeServiceDescriptorTableShadow;
}
2013-9-9 22:50
0
雪    币: 371
活跃值: (72)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
14
好找法~,

2级找法,
先找一个导出函数,再在里面找未导出函数,最后搜索特征码,继续找到我们的结构~
2013-9-9 23:12
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
15
就算不知道有木有关。也不能动SSDT吧。。。只能用微软建议的回调啊
2013-9-10 07:00
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
16
各种感谢  百度不给力 还是GG比较吊。
2013-9-10 09:54
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
17
吃泡面  看代码
我好好读读~ 嘿嘿
2013-9-10 09:58
0
雪    币: 140
活跃值: (125)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
18
难得啊 你也冒泡。
2013-9-10 10:13
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
因为不需要硬编……
2013-9-10 18:13
0
雪    币: 220
活跃值: (117)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
20
64位下获取ssdt函数 通过zw同名函数可以直接得到指针存放位置.修改即可..不用非要找到ssdt基地址然后+偏移吧
2013-9-11 09:28
0
雪    币: 63
活跃值: (28)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
mark
2013-9-11 11:57
0
雪    币: 11
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
好吧……这也是个办法
不过研究在64位下hook没意思

要研究的是在win8下如何修改内核不蓝屏
2013-9-11 18:52
0
雪    币: 1392
活跃值: (5207)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
23
LDE 这个结构函数 自己定义的还是在哪里,或者是某个开源库里头的?求指导
2014-4-17 09:51
0
雪    币: 1392
活跃值: (5207)
能力值: ( LV13,RANK:240 )
在线值:
发帖
回帖
粉丝
24
哇咔咔 找到了哟~~~
2014-4-17 09:57
0
雪    币: 32
活跃值: (34)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
25
求分享啊。
2014-11-19 00:27
0
游客
登录 | 注册 方可回帖
返回
//