首页
社区
课程
招聘
用extern和__declspec(dllimport) 为什么不同呢?
发表于: 2018-7-7 10:27 4715

用extern和__declspec(dllimport) 为什么不同呢?

2018-7-7 10:27
4715
x86 下获取shadowssdt地址  用KeAddSystemServiceTable函数搜索获取sssdt表 
开始时用下面的声明方式来获取到 KeAddSystemServiceTable函数地址  
extern BOOLEAN KeAddSystemServiceTable (
IN PULONG_PTR Base,
IN PULONG Count OPTIONAL,
IN ULONG Limit,
IN PUCHAR Number,
IN ULONG Index);
DbgPrint输出 KeAddSystemServiceTable地址是 ba481c8a
调试器观察
------ba481c8a  jmp     dword ptr [DriverTest!_imp__KeAddSystemServiceTable (ba48201c)
------ba481c90   jmp     dword ptr [DriverTest!_imp___except_handler3 (ba482020)]
------ba481c96     jmp     dword ptr [DriverTest!_imp__IoDeleteDevice (ba482024)]
实际 KeAddSystemServiceTable的地址等于[ba48201c]

而用__declspec(dllimport)  导入的方式 
__declspec(dllimport) _stdcall KeAddSystemServiceTable(PULONG, PULONG, ULONG, PUCHAR, ULONG);
就可以直接获取到 KeAddSystemServiceTable的地址 

小弟不解extern那种方式为什么不能直接获取到 KeAddSystemServiceTable的地址呢 ? 怎么修改呢
小白问题 莫嫌弃 感谢了

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 12348
活跃值: (5113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2

感觉这问题都是难,等大牛来回答吧
2018-7-8 09:36
0
雪    币: 52
活跃值: (186)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
extern 导入是地址.
__declspec(dllimport) 导入的是dll全局变量本身
2018-7-8 10:09
0
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
这种东西就是编译器的事情 没有什么为什么
2018-7-8 13:27
0
雪    币: 203
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
extern 一般是给变量用的,比如
extern int data;
意思是告诉编译器,data这个变量在其他位置有定义,这里直接使用。

而__declspec(dllimport) 则告诉编译器这个函数从其他dll导入。

总结,extern针对于变量,而__declspec(dllimport) 针对函数
2018-7-9 11:11
0
雪    币: 12848
活跃值: (9147)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
6
一句话总结:
extern是给编译器看的
__declspec(dllimport)是给链接器看的
2018-7-9 12:56
1
雪    币: 79
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
嗯 基础太差 呵呵 见笑了  extern 加在声明函数前面 属于画蛇添足了 
2018-7-10 16:50
0
雪    币: 191
活跃值: (84)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
extern 是静态链接  需要在.obj文件和.lib文件中找符号
_declspec(dllimport)是动态链接  需要.dll文件和.lib文件

最后于 2018-9-26 01:20 被非止编辑 ,原因:
2018-9-26 01:12
0
游客
登录 | 注册 方可回帖
返回
//