首页
社区
课程
招聘
[求助]读微软符号文件 获取内核函数地址 64位系统遇到问题
发表于: 2015-10-28 01:03 8704

[求助]读微软符号文件 获取内核函数地址 64位系统遇到问题

2015-10-28 01:03
8704
原帖地址
http://bbs.pediy.com/showthread.php?t=140160

大概原理就是像winDBG一样。。从
srv* xxxx *bedK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3#2K6k6r3I4Q4x3X3g2E0K9h3y4J5L8%4y4G2k6Y4c8Q4x3X3g2U0L8$3#2Q4x3V1k6V1L8%4N6F1L8r3!0S2k6q4)9J5c8Y4y4&6L8h3u0G2L8s2x3`.
下载符号表。,。。 然后获取内核函数地址。。

我照抄了源码。。弄出个成品 。。  在XP系统 和 Win7  32位下  一切正常。。

但是在win7 64位下。好像有问题   地址不正常 ,难道要别的计算?。。。。。因为是抄的源码,我也不知道原因   哪位大神帮忙解答下

下面是效果图。。。



上面这个是XP系统的。。。一切正常    函数名正确    地址正确



win7   32位系统。。。依旧一切正常     函数名正确    地址正确



win7   64位系统。。。函数名正确。。地址却不正确。。。。地址是 16位的整数,,获取到的却是8位。。。  还要经过什么计算么?

-

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 5
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
回调函数是这么写的

BOOLEAN CALLBACK EnumSymRoutine(
        PSYMBOL_INFO psi,
        ULONG     SymSize,
        PVOID     Context)
{

        printf("name = %s   address = %llx   \n", psi->Name, psi->Address);

        return TRUE;
}
2015-10-28 03:25
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
我记得从x64 SSDT中得到的也是32位的地址,是相对SSDT的地址,用表地址加上相对地址就得到函数地址。不知道符号表是怎么样的,试一试呗。
2015-10-28 11:21
0
雪    币: 5
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好像不是。。。ssdt是表地址 + 偏移。。。。。所以表地址肯定一样。。。俩偏移相减  等于  俩真实函数地址的差。。。。

我从符号表获取俩函数地址  相减。。。得到的差  和真实俩函数地址的差不等。
2015-10-28 15:35
0
雪    币: 61
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
从那里抄的源码?能传一份吗?
2015-10-30 15:03
0
雪    币: 5
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
可以啊                   1
2015-10-31 02:31
0
雪    币: 70
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
难道你抄来的代码没有计算公式?
ULONGLONG GetSSDT_ADDR(ULONGLONG __F_addr,UINT __Index)
        //函数功能:参数__F__addr为KeServiceDescriptorTable的基地址,参数__Index为要获取地址函数的索引,成功返回函数地址,失败返回0
{
        LONG dwTemp = 0;
        ULONGLONG qwTemp,stb,ret;

               
                stb = __F_addr;
                //以下通过传入的基地址计算函数的偏移,再计算出函数的真实地址。
                qwTemp = stb + 4 *__Index;
                dwTemp = *(PLONG)qwTemp;
                dwTemp = dwTemp >> 4;
                ret = stb + (LONG64)dwTemp;
                return ret;

}
2015-11-1 11:22
0
雪    币: 5
活跃值: (127)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
我已经解决了。。。64位系统编译成64位程序就行了。。代码不用改。。。
不过您知道怎么用32位读取64位系统么
2015-11-13 16:19
0
游客
登录 | 注册 方可回帖
返回