快一年没更新了,累,工作累,各种累,想换个工作,突然发现找不到合适的工作了,哎,自己往火坑里跳,怪不得别人。

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 驱动时的函数识别插件的更多相关文章

  1. 注册驱动时如何调用probe函数 ?

    platform_driver_register       driver_register             bus_add_driver    //把驱动放入总线的驱动链表里         ...

  2. WDF驱动的编译、调试、安装

    编译和调试使用WDK编译,源代码应包括wdf.h,ntddk.h以及KMDF_VERSION=1,编译使用/GS.KMDF包括以下库:1). WdfDriverEntry.lib(编译时绑定):驱动入 ...

  3. Linux gadget驱动分析2------设备识别过程

    设备连上主机之后,设备驱动做了的事. 设备连上host的port之后,主机端会有一套策略发送请求获取device的一系列描述符.进行枚举过程.找到适合该device的驱动. 这样就可以与device进 ...

  4. platform驱动之probe函数

    驱动注册的probe函数 probe函数在设备驱动注册最后收尾工作,当设备的device 和其对应的driver 在总线上完成配对之后,系统就调用platform设备的probe函数完成驱动注册最后工 ...

  5. linux下实现在程序运行时的函数替换(热补丁)

    声明:以下的代码成果,是参考了网上的injso技术,在本文的最后会给出地址,同时非常感谢injso技术原作者的分享. 但是injso文章中的代码存在一些问题,所以后面出现的代码是经过作者修改和检测的. ...

  6. redhat 6.7 安装nvidia显卡驱动时出现的问题

    一.给Redhat装Nvidia驱动时,出现类似ERROR: The Nouveau kernel driver is currently in use by your system. 的错误,这是应 ...

  7. module_init宏解析 linux驱动的入口函数module_init的加载和释放

    linux驱动的入口函数module_init的加载和释放 http://blog.csdn.net/zhandoushi1982/article/details/4927579 void free_ ...

  8. 编译驱动时出现"Cannot open file trace.h"错误

    编译驱动时出现"Cannot open file trace.h"错误 如题,用VS2013编译驱动是出现上述错误,原来是开启了WPP追踪导致的: 解决方案: 右键项目名-属性-W ...

  9. 关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题

    关于iOS中用AudioFile相关API解码或播放AAC_HE_V2时仅仅能识别单声首22.05k採样率的问题 在官方AQPlayer Demo 和 aqofflinerender中.都用了Audi ...

  10. Ubuntu16.04安装NVIDIA驱动时的一些坑与解决方案

    这几天在新购置的笔记本上部署工作环境,在安装NVIDIA驱动的时候遇到了不少坑,重装了很多次,在Ubuntu论坛以及其他资料源看了很多大牛的分析,最终终于解决了一个又一个问题,过程比较艰辛,所以决定写 ...

随机推荐

  1. 编辑器(Editor) vs 集成开发环境(Integrated Development Environment,下文简称 IDE)

    编辑器(Editor) vs 集成开发环境(Integrated Development Environment,下文简称 IDE) 经常看到一些程序员拿编辑器和 IDE 进行比较,诸如 Vim 比 ...

  2. react intl 国际化

    方案描述:由于采用单页面,所以按钮切换时会刷新页面 1.安装 react-intl  babel-plugin-react-intl json-loader npm i react-intl babe ...

  3. 20201003--统计数字字符个数(奥赛一本通 P98 1--字符类型和字符数组)

    输入一行字符,统计出其中数字字符的个数 输入:一行字符串,总长度不超过255 输出:一行,输出字符串里面数字字符的个数. 样例输入:Peking University is set up at 189 ...

  4. ansible使用笔记:长期更新

    ansible使用笔记 ##将/home/system.sh文件拷贝到所有服务器的/home/system.sh ansible all -m copy -a "src=/home/syst ...

  5. 2月22日javaweb学习之Maven

    Maveb是专门用于管理和构建java项目的工具,它的主要功能有: 1.提供一套标准化的项目结构. 2.提供一套标准化的构建流程(编译.测试.打包.发布......) 3.提供了一套依赖管理机制 Ma ...

  6. Verilog中端口的连接规则

    摘自于(15条消息) Verilog中端口应该设置为wire形还是reg形_CLL_caicai的博客-CSDN博客, 以及(15条消息) Verilog端口连接规则_「已注销」的博客-CSDN博客_ ...

  7. 量化交易 - matplotlib画candle图

    需要mplfinance包 pip install mplfinance --upgrade   from matplotlib import style import pandas as pd im ...

  8. getchar()函数的详解以及使用时需要注意的一些细节-C语言基础

    这篇文章要探讨的是"getchar()函数的详解以及使用时需要注意的一些细节".涉及getchar()函数的应用和需要注意的问题.属于C语言基础篇(持续更新). 在C语言的学习过程 ...

  9. 基于4g智能路由器的充电桩远程监测管理应用

    随着我国电动车保有量的持续增加,充电桩的需求也水涨船高,成为城市发展必备的基础设施之一.相较加油站,充电桩分布更广泛,部署场景更多样,与场景的融合程度也更深,诸如各类停车与充电二合一的站点.因此,对于 ...

  10. 创建function函数sys_guid时报错

    创建function函数sys_guid时报错 执行下面的命令 show variables like 'log_bin_trust_function_creators';set global log ...