IDA 逆 WDF 驱动时的函数识别插件
快一年没更新了,累,工作累,各种累,想换个工作,突然发现找不到合适的工作了,哎,自己往火坑里跳,怪不得别人。
import idautils
import idaapi
import idc print("new ------------------------------------------") #ea = idc.get_curline()
#print(ea) #
def GetWdfVersionBindObject(addr):
for x in XrefsTo(addr,flags=0):
cur_addr = x.frm
cur_asm = GetDisasm(cur_addr)
if (cur_asm.startswith("call")):
pass
else:
continue func_addr = idc.get_func_attr(cur_addr,FUNCATTR_START) pre_addr = cur_addr
while True:
if pre_addr <= func_addr:
break
pre_addr = idc.prev_head(pre_addr)
pre_asm = GetDisasm(pre_addr)
if (pre_asm.startswith("lea")):
t = idc.get_operand_type(pre_addr, 0)
# 寄存器
if (t == 1):
pass
else:
break data = idc.get_operand_value(pre_addr, 0)
# r8
if (data == 8):
t = idc.get_operand_type(pre_addr, 1)
data = idc.get_operand_value(pre_addr, 1)
return data
return 0 # 从模块中找到对应符号地址
fpWdfVersionBind = idc.get_name_ea(0x140000000, "WdfVersionBind")
print('Address : WdfVersionBind : %#x'%fpWdfVersionBind)
# 根据对应符号地址,找到其第三个参数地址
pObject = GetWdfVersionBindObject(fpWdfVersionBind)
print('Address : Wdf Object : %#x'%pObject)
# 获取的版本号
verBig = idaapi.get_dword(pObject + 0x10)
verMin = idaapi.get_dword(pObject + 0x14)
print("version :", verBig, verMin) # 根据函数索引取函数名字
def GetNameByID(id):
return "" def MakeWdfFunctionInfo(addr):
for x in XrefsTo(addr,flags=0):
cur_addr = x.frm
cur_asm = GetDisasm(cur_addr)
if (cur_asm.startswith("mov")):
pass
else:
continue
#print("cur", cur_addr, cur_asm) pre_addr = idc.prev_head(cur_addr)
pre_asm = GetDisasm(pre_addr)
#print("pre", pre_addr, pre_asm)
if (pre_asm.startswith("imul")):
# 第 0 个参数类型是1,所以是寄存器
type0 = idc.get_operand_type(pre_addr, 0)
if (type0 == 1):
pass
else:
break
# 寄存器参数索引是 0,是rax
data = idc.get_operand_value(pre_addr, 0)
if (data == 0):
pass
else:
break # 按理说应该是取操作数1,但是这里1里面没值,所以取的是 2
# 取出来的就是函数索引
data = idc.get_operand_value(pre_addr, 2) # 根据函数索引
func_name = GetNameByID(data) fun_addr = idc.get_func_attr(pre_addr,FUNCATTR_START) if (func_name != ""):
ida_name.set_name(fun_addr, func_name) # 寻找所有使用到的地方,并且修正对应函数名,编程索引对应函数名
MakeWdfFunctionInfo(get_qword(pObject + 0x20))
几十行代码,有注释,一些地方用的是硬编码,需要改一改,但是目前至少能用了,还缺少一个东西,就是数据库,
这个数据库是根据不同版本的 WDF 函数数据库
IDA 逆 WDF 驱动时的函数识别插件的更多相关文章
- 注册驱动时如何调用probe函数 ?
platform_driver_register driver_register bus_add_driver //把驱动放入总线的驱动链表里 ...
- WDF驱动的编译、调试、安装
编译和调试使用WDK编译,源代码应包括wdf.h,ntddk.h以及KMDF_VERSION=1,编译使用/GS.KMDF包括以下库:1). WdfDriverEntry.lib(编译时绑定):驱动入 ...
- Linux gadget驱动分析2------设备识别过程
设备连上主机之后,设备驱动做了的事. 设备连上host的port之后,主机端会有一套策略发送请求获取device的一系列描述符.进行枚举过程.找到适合该device的驱动. 这样就可以与device进 ...
- platform驱动之probe函数
驱动注册的probe函数 probe函数在设备驱动注册最后收尾工作,当设备的device 和其对应的driver 在总线上完成配对之后,系统就调用platform设备的probe函数完成驱动注册最后工 ...
- linux下实现在程序运行时的函数替换(热补丁)
声明:以下的代码成果,是参考了网上的injso技术,在本文的最后会给出地址,同时非常感谢injso技术原作者的分享. 但是injso文章中的代码存在一些问题,所以后面出现的代码是经过作者修改和检测的. ...
- redhat 6.7 安装nvidia显卡驱动时出现的问题
一.给Redhat装Nvidia驱动时,出现类似ERROR: The Nouveau kernel driver is currently in use by your system. 的错误,这是应 ...
- module_init宏解析 linux驱动的入口函数module_init的加载和释放
linux驱动的入口函数module_init的加载和释放 http://blog.csdn.net/zhandoushi1982/article/details/4927579 void free_ ...
- 编译驱动时出现"Cannot open file trace.h"错误
编译驱动时出现"Cannot open file trace.h"错误 如题,用VS2013编译驱动是出现上述错误,原来是开启了WPP追踪导致的: 解决方案: 右键项目名-属性-W ...
- 关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题
关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题 在官方AQPlayer Demo 和 aqofflinerender中.都用了Audi ...
- Ubuntu16.04安装NVIDIA驱动时的一些坑与解决方案
这几天在新购置的笔记本上部署工作环境,在安装NVIDIA驱动的时候遇到了不少坑,重装了很多次,在Ubuntu论坛以及其他资料源看了很多大牛的分析,最终终于解决了一个又一个问题,过程比较艰辛,所以决定写 ...
随机推荐
- Unit Test下使用H2内存数据库
1.Maven引入包 <dependency> <groupId>com.h2database</groupId> <artifactId>h2< ...
- 第14章 身份验证:使用Identity将用户添加到应用程序(ASP.NET Core in Action, 2nd Edition)
本章包括 ASP.NET Core中web应用程序的身份验证工作原理 使用ASP.NET Core标识系统创建项目 向现有web应用添加用户功能 自定义默认ASP.NET Core标识UI 像ASPN ...
- centos 挂载共享目录
共享目录://10.253.47.102/share/文件传递暂用 将共享路径挂载到centos /etc/fstab 添加一行配置,mount -a 生效
- Java中String相关知识
String 1.String概述 String代表字符串,Java程序中所有的字符串文字(例如'abc")都被实现为此类的实例,也就是说,Java中所有的双引号字符串都是String类的对 ...
- mysql explain 优化
explain的使用 使用EXPLAIN关键字可以模拟优化器执行SQL语句,分析你的查询语句或是结构的性能瓶颈.在select语句之前增加explain关键字,Mysql会在查询上设置一个标记,执行查 ...
- egret tween 屏幕震动动画 ts
let orig = { x: this.x, y: this.y }; var dir = 1; var tox = 0; var toy = 0; var count = 40; // if (n ...
- 服务器安装docker
安装命令: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 使用国内 daocloud 一键安装: curl -s ...
- pycharm激活教程
激活地址:https://shimo.im/docs/YW9Gc3vHhJkWtRyQ/read 细节注意:下载版本,在官网下载,选择左下角更多版本,下载2019,3月份版本
- 将 Sql Server 表信息 C# 对象化 小工具_ 张光荣 的 正能量
注: a.此程序所得到的结果是根据本人个人习惯生成,所以,肯定不完全适合所有人使用,重在想法...然后个人根据个人需求作出更进...b.程序中可能会出现数据库连接的错误提示[原因概是在sql 连接过程 ...
- hhtp协议和html标签分类css
HTTP协议四大特性: 1基于请求响应 2 基于tcp/ip协议之上的应用层协议 3 无状态 不能保存用户信息 4 无链接,短链接 二 get和post的区别? 1 get 不安全,get请求没有请求 ...