前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >64位内核第一讲,和32位内核的区别

64位内核第一讲,和32位内核的区别

作者头像
IBinary
发布2018-03-30 12:11:12
1.5K0
发布2018-03-30 12:11:12
举报
文章被收录于专栏:逆向技术逆向技术

          64位内核第一讲,和32位内核的区别

双击调试配置请查看 连接: https://www.cnblogs.com/aliflycoris/p/5877323.html

一丶编译的区别.

首先,还是使用WDK7.1.7600编写. 但是编译的时候,要使用x64来编译. 其代码框架不变.

1.驱动加载

  驱动加载的程序还是使用普通的驱动加载即可.但是64位(win7),微软推出了两种新的方式.

1.DSE

2.KPP

  DSE: 这个机制是 驱动强制签名,也就是说你编写的驱动,都要进行签名.才可以加载.

  KPP: 内核补丁保护, 比如我们说的SSDT表,(ring3 -> ring0 中专表)在XP下是可以HOOK的,现在,这些都被保护了,只要你更改了系统的核心源码,直接蓝屏.

2.去掉KPP保护.

在编写的64为内核驱动, 如果我们的系统是安全模式启动,则没有DSE保护.也就是说不用签名.

现在有工具可以直接去使用.

第一个选项是,点击之后,你的系统启动则是在安全模式启动.

第二个选项是, 点击之后,你的驱动可以添加一个测试签名.

3.注意的问题

如果进行了上面来了两个步骤,我们的驱动还是不能加载,那么这也是一个坑. 微软说了,在PE文件中,你的驱动必须有签名检查.

正确的姿势:

  首先,编写驱动的source文件加上命令行选项.

  LINKER_FLAGS = /INTEGRITYCHECK

且必须放在最下面, 加了这个选项,那么你的驱动,可以使用微软提供的HOOK函数了.

二丶64位GDT表

 首先,地址变大了,变成了48位的地址,其高位是FFFF,属于是符号扩展.

IDT 也是变大了.

其内核中的结构体也变大了.

不光这个结构体,还有里面的,有兴趣的自己解析一下查看.

三丶SSDT表的寻找,以及SSDT加密

我们知道 ring3 -> ring0 会通过SSDT表进行中专,

其EIP 会存放在 msr寄存器中.  xp下是174 175 176

现在查看AMD的CPU指令,会发现. 进0环会调用SystemCall命令.

其MSR寄存器是在 C0000081  C0000082 C0000083

其EIP会存放在82里面.

那么我们可以 使用指令.

代码语言:javascript
复制
rdmsr C0000082

读取三环进0环的地址. 对其解析.

因符号文件没有下载完全.所以还暂时没有办法解析.

SSDT加密算法是 模块首地址 + 当前表中的地址>>4  .我们要计算地址的时候.只需要将SSDT表中的内容的函数地址<<4位加上模块首地址即可.

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-02-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  •           64位内核第一讲,和32位内核的区别
    • 一丶编译的区别.
      • 1.驱动加载
      • 2.去掉KPP保护.
      • 3.注意的问题
    • 二丶64位GDT表
      • 三丶SSDT表的寻找,以及SSDT加密
      相关产品与服务
      对象存储
      对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档