windows驱动读取gdtr_构建内核HOOK框架

构建内核HOOK框架

2015-01-05 15:45:20

阅读:0次

感谢白帽子@0x01f的投稿,以下内容供安全爱好者参考学习,本文获得投稿奖励500元,即将打入作者账户,投稿请发送邮件至 huangyuan#360.cn。

分析漏洞或者提取病毒行为,调试器是必不可少的,不过面对rootkit或者其它有驱动辅助的程序,OD或者windbg硬上可能会蓝屏,驱动级的anti还是不容小觑的;此外不少企业或者团队还希望有自己的模拟器,可以去半自动跑一些样本。不管怎么说,内核HOOK框架都是必不可少的。

内核HOOK需要关注的类型并不多:SSDT、ShadowSSDT、IDT内核关口HOOK;文件系统过滤,可以自建控制设备和卷设备过滤,也可以使用MiniFilter;网络控制,TDI/WPF驱动必不可少,甚至需要自己的NDIS驱动;重点当然是内核入口,现在的主流是KiFastCallEntry,我们也是处理了这个点。

单纯的HOOK这些点以及加一些过滤是没有意义的,重要的还是人为地参与和控制。首先需要重载内核,即加载磁盘文件,而不使用系统正在使用的内核,考虑到磁盘文件可能也有问题,可以根据操作系统版本号加载自己的文件;调试框架也需要自己重新构建,最好自己定义结构采集进程信息,仿造windows的DebugPort;文件和注册表重定位,这个是比较重要的,也是记录行为的关键;驱动和应用层通信,通信可以有很多种方式,可以简单实用DeviceIoControl。

作为一个HOOK框架

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用MDK(Keil uVision)来读取L3GDTR陀螺仪传感器的设备ID,你可以参考以下代码示例: ```c #include "stm32f10x.h" #include "stdio.h" #define L3GD20TR_ADDRESS 0xD7 // L3GD20TR I2C地址 #define L3GD20TR_WHO_AM_I 0x0F // 设备ID寄存器地址 void I2C_Init(void); uint8_t I2C_Read(uint8_t device_address, uint8_t reg_address); int main(void) { uint8_t deviceID; I2C_Init(); deviceID = I2C_Read(L3GD20TR_ADDRESS, L3GD20TR_WHO_AM_I); printf("Device ID: 0x%X\n", deviceID); while(1); } void I2C_Init(void) { I2C_InitTypeDef I2C_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; // 开启I2C外设时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE); // 开启GPIOB时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 配置PB6和PB7引脚为复用推挽输出 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_OD; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); // I2C外设配置 I2C_InitStructure.I2C_Mode = I2C_Mode_I2C; I2C_InitStructure.I2C_DutyCycle = I2C_DutyCycle_2; I2C_InitStructure.I2C_OwnAddress1 = 0x00; I2C_InitStructure.I2C_Ack = I2C_Ack_Enable; I2C_InitStructure.I2C_AcknowledgedAddress = I2C_AcknowledgedAddress_7bit; I2C_InitStructure.I2C_ClockSpeed = 100000; I2C_Init(I2C1, &I2C_InitStructure); // 使能I2C外设 I2C_Cmd(I2C1, ENABLE); } uint8_t I2C_Read(uint8_t device_address, uint8_t reg_address) { uint8_t data; // 发送开始信号 I2C_GenerateSTART(I2C1, ENABLE); // 等待起始信号发送完毕 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // 发送设备地址(写模式) I2C_Send7bitAddress(I2C1, device_address, I2C_Direction_Transmitter); // 等待设备地址发送完毕 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_TRANSMITTER_MODE_SELECTED)); // 发送寄存器地址 I2C_SendData(I2C1, reg_address); // 等待寄存器地址发送完毕 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_TRANSMITTED)); // 重新发送起始信号 I2C_GenerateSTART(I2C1, ENABLE); // 等待起始信号发送完毕 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_MODE_SELECT)); // 发送设备地址(读模式) I2C_Send7bitAddress(I2C1, device_address, I2C_Direction_Receiver); // 等待设备地址发送完毕 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_RECEIVER_MODE_SELECTED)); // 禁用ACK I2C_AcknowledgeConfig(I2C1, DISABLE); // 清除ADDR标志位 __disable_irq(); (void)I2C1->SR2; __enable_irq(); // 发送停止信号 I2C_GenerateSTOP(I2C1, ENABLE); // 等待数据接收完毕 while(!I2C_CheckEvent(I2C1, I2C_EVENT_MASTER_BYTE_RECEIVED)); // 读取数据 data = I2C_ReceiveData(I2C1); return data; } ``` 上述代码使用STM32F10x系列微控制器通过I2C接口与L3GD20TR陀螺仪传感器通信。使用`I2C_Init`函数来初始化I2C外设,`I2C_Read`函数用于读取设备ID寄存器的值。在主函数中,我们调用`I2C_Read`函数来读取设备ID,并通过串口打印出来。 请注意,此代码是针对STM32F10x系列微控制器的,如果你使用的是其他系列的STM32微控制器,需要根据具体的芯片型号和引脚配置进行相应的修改。另外,此代码假设你已经将L3GD20TR正确连接到STM32微控制器的I2C引脚上,并正确配置了外设时钟和GPIO引脚。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值