-
-
Windows内核-X64(九)
-
发表于:
2022-8-24 02:02
8467
-
1.寄存器
2.线性地址
intel规定48位都是有效的,但微软只用了44位
0~47:48位是线性地址
48~63:16位是符号位。这16个位要么全是1要么全是0,否则为非法
3.全局变量地址
实例
000000013F6017E5 + a81b = 013F60C000h
4.vs写64位汇编
1.h
1.asm
参数1保存在rcx
参数2保存在rdx
返回值保存在rax
main.cpp
在项目右键-->生产依赖项-->生成自定义
在1.asm右键属性-->项类型
1.在汇编里面调用c代码
main.cpp
1.h
1.asm
2.函数参数
函数有四个参数:rcx, rdx, r8, r9
函数有六个参数:rcx, rdx, r8, r9,RSP+20H, RSP+28H
1.开启64位模式
2.x64体系
IA-32E:64位模式,并且兼容32位和16位,目前64位用的就是IA-32E模式
IA-64:只能是64位模式,不兼容32位和16位,这种模式被抛弃
3.段
32保护模式下,只有8字节.
64位下代码段与数据段是8字节,系统段是16字节
1.gate.asm
2.x64调用门.cpp
3.修改描述符
1.win7x64分页
PTE基址:FFFFF68000000000 (固定的)
&的数:0x7FFFFFFFF8 (固定的)
2.线性地址
fffff800`03ea3400
3.算法
先求出pte,然后用pte依次求出其它
4.win10的pte基址是动态的
每次开机都会变化,所以要用函数获得
1.Memory.h
2.Memory.c
3.DriverMain.c
X64与X32的区别
KeServiceDescriptorTable不再是导出的,需要通过函数特征去搜索
函数地址仍然是32位的,但是里面存的不再是函数地址,而是一个偏移值
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
最后于 2022-8-24 02:09
被zhang_derek编辑
,原因: