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

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. android charles 抓不到https包,翻了2天资料总算是找到答案了

    问题, android7.0以上有权限限制,导致很多机子无法用Charles 抓ssl的包. 以下是我自己的坑请大家参考 原因一: 用Charles 工具上的地址去安装 chls.pro/ssl 原因 ...

  2. centos安装docker显示 No package docker-ce available

    温馨提醒,docker内核版本必须是3.10+以上的版本 查看方式 uname -r 1. 卸载老版本的 docker 及其相关依赖 sudo yum remove docker docker-com ...

  3. ceph 因权重问题导致pgs active+clean+remapped 状态

    1.现象: 2.原因:是因为前期权重调整不合理导致,调整回来就正常了 3.操作步骤: ceph osd crush reweight osd.2 0.98317    # osd 位置. 权重值 权重 ...

  4. 如何卸载powermill?怎么把powermill彻底卸载删除干净重新安装的方法【转载】

    如何卸载powermill?怎么把powermill彻底卸载删除干净重新安装的方法.powermill显示已安装或者报错出现提示安装未完成某些产品无法安装的问题,怎么完全彻底删除清理干净powermi ...

  5. Javaheima13

    Java Stream流 salary 薪水 bonus 奖金 top performer 优秀员工 punish 处罚 1员工信息至少包含了(名称.性别.工资.奖金.处罚记录) 2开发一部有4个员工 ...

  6. vim入门与快捷键使用

    1.移动 上下左右 jkhl 2.模式选择 命令模式 插入模式 字符选择模式 3.剪切复制 粘贴:p 复制 y 选择 v 进入选择模式 4. 撤销恢复 撤销 u 恢复 ctrl + r 5. 删除 d ...

  7. IT工具知识-11:一种安卓投屏到Win10失败的解决方法

    软硬件平台 电脑:WIN10 LTSC 手机:红米K30Pro/MIUI 11.0.26 投屏软件:安卓端-自带投屏,WIN10-自带投屏(连接) 故障描述 之前还能用的,但是在换了个路由器之后就不能 ...

  8. 论 C++、C语言中指针的实用价值(一)

    指针的价值在于哪里?单纯为了迷惑别人?其实并非如此.本系列长期总结一些必须用指针或者用指针很好的场合: 写任何的代码都必须有一定的动机.而不是想怎么写就怎么写 写代码不是纯灵感的行为.也不是纯机械的行 ...

  9. 1006.Django模型基础01

    一.Django的ORM简介 1. ORM概念:对象关系映射(Object Relational Mapping): 2. ORM优势:不用直接编写SQL代码,只需像操作对象一样从数据库操作数据. d ...

  10. 京东薅羊毛脚本-Docker

    一.安装好docker,然后创建容器: 注1:如果是旁路由,建议用--network host \代替-p 5678:5678 \这一行. 注2:如果想要看到lxk0301大佬的js脚本,并且重新部署 ...