首页
社区
课程
招聘
读取SSDT表当前地址的疑问.
发表于: 2013-5-26 00:20 5774

读取SSDT表当前地址的疑问.

2013-5-26 00:20
5774
结构体的定义
typedef struct Service_Descriptor_Table  
{  
	PVOID Service_Table_Base; 
	PVOID Service_Counter_Table; 
	unsigned int  Services_Number;  
	PVOID Param_Table_Base;  
}*STRU_Z_SSDT;
extern STRU_Z_SSDT [COLOR="Red"]KeServiceDescriptorTable[/COLOR];


代码部分
	LONG *J_Target;
	LONG J_Base;  
	LONG J_Unit; 

	J_Base=(LONG)[COLOR="Red"]KeServiceDescriptorTable[/COLOR]->Service_Table_Base; //获取SSDT表的地址  

	J_Target=(PLONG)(J_Base+(0x19*4)); //转换成LONG指针

	J_Unit=*J_Target;	
	KdPrint(("当前地址为0x%X \n",J_Unit));


很奇怪为什么一定要用KeServiceDescriptorTable.他只是个自定义的变量名称而已.
我换成其他变量名称后.报错error LNK2001: 无法解析的外部符号.

这个问题折腾了我一下午.
不晓得哪位前辈知道这个原因吗?

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

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 95
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
KeServiceDescriptorTable只是一个自定义的变量名吗? struct只是定义个结构类型,或者是一段内存区域的存储结构。据我观察,你所定义的KeServiceDescriptorTable变量是带有extern属性的外部变量,外部变量的实体应该实在其它dll或者exe中表述的,其中文件中也包含它的链接名,在编译之后的链接过程外部变量是通过链接名判断存在性的,你用的变量链接名不对,即会提示找不到的外部变量。你可以MSDN一下 PE结构和函数调用约定,其中也有链接过程中对函数或者变量名的链接名生成规则,虽然KeServiceDescriptorTable是个特殊的变量,并非普通的声明方法声明,但原理应该是类似的
2013-5-26 03:49
0
雪    币: 1560
活跃值: (1806)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wbs
3
我也纠结这个问题  顶一下
2013-5-26 05:50
0
雪    币: 200
活跃值: (1240)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
因为微软有个Symol 文件里是这样 命名的吧,如果命成其他名字,就认不出来了,不用太纠结这个了。
2013-5-26 07:35
0
雪    币: 2120
活跃值: (73)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
你都写extern了 说明肯定外部定义了这个变量 你现在只是声明了它而已 如果你换了名字 就肯定找不到那个变量了
2013-5-26 11:02
0
雪    币: 1088
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
原来如此.感谢解惑.
2013-5-26 11:26
0
雪    币: 95
活跃值: (16)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
是symbol文件 符号的那个单词 不过你的说法是不对的 或者是因果关系反了 不是因为有symbol才要是这个名字 而是因为编写系统核心的时候程序员写的是那个名字 symbol中最后才是那个名字

其实呢 为什么叫symbol文件 具体我没研究过 也或许和pe的导出函数和到处函数有关? 但应该不是 因为在编译时 不仅仅是导入函数和到处函数 都是会有链接名生成的 因为到一个个的cpp编译成成obj之后 各个obj在通过链接生成 可执行文件Portable Executive 大概是这样的吧 也就是pe文件(对于计算机一般exe,dll或lib 对于单片机或者嵌入式系统 可能四hex、 bin等等 其实不过都是汇编语言对应的机器码而已 ) 在链接的过程中 外部函数的调用 是通过链接名来识别的 C语言的函数链接名好像是函数名前面加_? 总之是不包含函数的参数信息的,也就是不包含函数参数的个数和大小,因为链接名不包含函数参数的信息,那么不同的参数的同名函数函数的链接名是一样的 无法区分, 而对于链接的过程需要对参数压栈,比如要知道参数个数,也因为这个原因导致C语言不支持函数重载。
symbol文件对于经常开发程序的程序员应该并不陌生,因为symbol文件就是程序的调试信息文件,里面包含了,exe文件和源代码之间的关系,有了这个文件才能进行源代码级别的断点调试,symbol文件一般是在IDE生成程序时自动生成的,只是很多软件发布时不会发布这个罢了, 难道要方面你们调试破解么?呵呵
2013-5-28 02:21
0
雪    币: 117
活跃值: (15)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
32bit ssdt这方面资料很多可以去搜索一下,64bit的较少。
2013-5-28 12:05
0
游客
登录 | 注册 方可回帖
返回
//