LazyIDA源码阅读

LazyIDA是一款IDA插件,项目地址GitHub - L4ys/LazyIDA: Make your IDA Lazy!

外部引用

from __future__ import division
from __future__ import print_function
from struct import unpack
import idaapi
import idautils
import idcfrom PyQt5.Qt import QApplication

from __future__ import division: 这行代码是用于确保Python 2和Python 3之间的兼容性。在Python 2中,除法运算默认是整数除法,而在Python 3中,除法运算默认是浮点数除法。通过这行代码,你可以确保在Python 2中使用浮点数除法。

from __future__ import print_function: 这行代码是为了确保在Python 2中使用print作为函数而不是语句。在Python 3中,print是一个函数,而在Python 2中,它是一个语句。这行代码是为了让Python 2的print行为更接近于Python 3

from struct import unpackstruct模块用于在Python中处理C结构。unpack函数用于将打包的二进制数据解包为Python数据类型。

import idaapi: 这行代码导入了IDA Pro的API,允许你使用IDA Pro的功能和插件。

import idautilsidautils模块包含了一些实用的工具函数,用于处理和操作IDA Pro中的数据。

import idcidc是IDA Pro的核心模块,提供了与IDA Pro数据库交互的功能

from PyQt5.Qt import QApplication:这行代码从PyQt5的Qt模块导入了QApplication类。PyQt5是一个用于创建图形用户界面(GUI)的Python库,而QApplication类是所有PyQt5 GUI应用程序的入口点。

全局变量和函数

这部分定义了一些元组和字符串,之后要说的重点是u16,u32和u64这三个函数

ACTION_CONVERT = ["lazyida:convert%d" % i for i in range(10)]
ACTION_SCANVUL = "lazyida:scanvul"
ACTION_COPYEA = "lazyida:copyea"
ACTION_GOTOCLIP = "lazyida:gotoclip"
ACTION_XORDATA = "lazyida:xordata"
ACTION_FILLNOP = "lazyida:fillnop"ACTION_HX_REMOVERETTYPE = "lazyida:hx_removerettype"
ACTION_HX_COPYEA = "lazyida:hx_copyea"
ACTION_HX_COPYNAME = "lazyida:hx_copyname"
ACTION_HX_GOTOCLIP = "lazyida:hx_gotoclip"u16 = lambda x: unpack("<H", x)[0]
u32 = lambda x: unpack("<I", x)[0]
u64 = lambda x: unpack("<Q", x)[0]ARCH = 0
BITS = 0

u16,u32,u64函数

这三个函数涉及的库函数解读和lambda表达式在下文,还有一个demo,这里概述一下三个函数的作用

这三个函数都接受一个x作为参数

然后调用unpack函数将pack函数打包成的bytes对象解包

<表示的是小端序,H表示的是两个字节,16位

I表示的是四个字节,32位

Q表示的八个字节,64位

lambda表达式

例如u16

lambda表达式,定义了一个函数u16

lambda x:表示接受的变量是x

函数的操作是unpack("<H", x)[0]

unpack函数

在上文from struct import unpack中导入了unpack

官网解释

struct — Interpret bytes as packed binary data — Python 3.12.1 documentation

This module converts between Python values and C structs represented as Python bytes objects. 

这个库是用字节码实现在Python的值和C的结构体之间的转换

unpack

struct.unpack(format, buffer)

这个函数用于解包由 pack 函数打包过的 buffer。其中,format 是打包时使用的格式字符串(Format string),buffer 是打包后的字节串。

calcsize

struct.calcsize 返回与格式字符串 format 对应的结构体(以及由 pack(format,…)生成的 bytes 对象)的大小。

Format string

格式字符串描述了在打包和解包数据时的数据布局。它们由格式字符构建,这些格式字符指定了正在打包/解包的数据类型。此外,特殊字符还控制字节顺序、大小和对齐方式。每个格式字符串由一个可选的前缀字符组成,该字符描述数据的整体属性,以及一个或多个格式字符,这些字符描述实际的数据值和填充。

格式字符串的第一个字符可用于指示打包数据的字节顺序、大小和对齐方式

Native byte order取决于host system

标准大小仅取决于格式字符;请参阅“格式字符”部分中的表格

demo

from struct import *
print(pack("<i", 1))
print(pack(">i", 1))'''
运行结果
b'\x01\x00\x00\x00'
b'\x00\x00\x00\x01'
'''

函数和类

copy_to_clip

def copy_to_clip(data):QApplication.clipboard().setText(data)

设置剪贴板内容

clip_text

def clip_text():return QApplication.clipboard().text()

返回剪贴板的内容

parse_location

def parse_location(loc):try:loc = int(loc, 16)except ValueError:try:loc = idc.get_name_ea_simple(loc.encode().strip())except:return idaapi.BADADDRreturn loc

try中将输入的数字转换成16进制

否则就用idc.get_name_ea_simple获取函数名对应的地址

如果都不是就返回BADADDR异常

hotkey_action_handler_t

这个类用于处理IDA pro中的动作

ida_kernwin API documentation

class hotkey_action_handler_t(idaapi.action_handler_t):"""Action handler for hotkey actions"""def __init__(self, action):idaapi.action_handler_t.__init__(self)self.action = actiondef activate(self, ctx):if self.action == ACTION_COPYEA:ea = idc.get_screen_ea()if ea != idaapi.BADADDR:copy_to_clip("0x%X" % ea)print("Address 0x%X has been copied to clipboard" % ea)elif self.action == ACTION_GOTOCLIP:loc = parse_location(clip_text())if loc != idaapi.BADADDR:print("Goto location 0x%x" % loc)idc.jumpto(loc)return 1def update(self, ctx):if idaapi.IDA_SDK_VERSION >= 770:target_attr = "widget_type"else:target_attr = "form_type"if ctx.__getattribute__(target_attr) in (idaapi.BWN_DISASM, idaapi.BWN_DUMP):return idaapi.AST_ENABLE_FOR_WIDGETelse:return idaapi.AST_DISABLE_FOR_WIDGET

可以看到 hotkey_action_handler_t这个类继承了 action_handler_t类,并重写了activate这个函数

action_handler_t类

def activate(self, ctx)

激活一个动作。这个函数实现了动作的内核行为。当动作被触发时,它会被调用,无论是从菜单、弹出菜单、工具栏还是通过程序。

返回:非零值:所有IDA窗口将刷新。

def update(self, ctx)

这个函数是一个更新函数,通常在图形用户界面(GUI)编程中用于更新动作的状态。这个函数的名字是 "update",它接受一个名为 "ctx" 的参数,这个参数通常包含了与当前上下文相关的信息。

函数的目的是根据上下文的变化来更新动作的一些属性,例如标签、图标等。此外,这个函数还让 IDA(可能是一个软件的名字)知道该动作是否启用,以及何时再次查询动作的可用性。

需要注意的是,这个回调函数不用于改变应用程序的状态,除非通过调用这个动作上的 "update_action_*()" 函数来实现。这意味着该函数的主体只用于更新动作的属性,而不用于改变其他与应用程序状态相关的内容。

总的来说,这个 "update" 函数是一个用于更新动作状态和属性的回调函数,它在 UI 上下文变化时被调用。

重写的activite函数

ACTION_COPYEA = "lazyida:copyea"在前面已经定义了

get_screen_ea()是获取光标所在的位置的地址(address)

jumpto函数

将光标跳转到一个地址

重写的update函数

慢慢看,持续更新

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/233018.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【函数调用需要哪些开销,内联函数又做了什么?】

系列文章目录 欢迎大家订阅我的《计算机底层原理》、《自顶向下看Java》专栏&#xff0c;我会持续为大家输出优质内容&#xff0c;能够帮助到各位就是对我最大的鼓励&#xff01; 目录 系列文章目录 前言 一、函数调用需要哪些开销 1.压栈于弹栈开销&#xff1a; 2.寄存器保存于…

JJJ:组合数据类型2

文章目录 字典的创建和删除 p50字典的创建方式 字典元素的访问及遍历 p51字典操作的相关方法 p52字典生成式集合的创建与删除 p54集合的操作符 p55集合的操作方法、集合的遍历 p56列表、元组、字典、集合的区别 Python 3.11新特性结构模型匹配字典合并运算符 |同步迭代 字典的创…

element-ui 抽屉里面嵌套弹窗

当我们在element-ui 的Drawer 抽屉里面嵌套弹窗时&#xff0c;有时会出现关闭弹窗后&#xff0c;抽屉依然被遮罩层挡着的情况&#xff0c;解决方法是 在 Drawer 里面写 :append-to-body"true" 和 :close-on-click-modal"false"&#xff0c;在弹窗里面写 :a…

vue中的事件修饰符、表单双向数据绑定和计算属性

目录 一、事件修饰符 二、表单双向数据绑定 模拟双向数据绑定&#xff08;双向数据绑定底层原理&#xff09; 三、计算属性 计算属性和methods方法区别&#xff1f; 计算属性和watch区别&#xff1f; 一、事件修饰符 stop 阻止事件冒泡 prevent 阻止事件默认行为 ca…

Java常见原子性操作

在Java语言中&#xff0c;对基本数据类型的变量读取赋值操作都是原子性的&#xff0c;对引用类型的变量读取和赋值的操作也是原子性的&#xff0c;因此诸如此类的操作是不可被中断的&#xff0c;要么执行&#xff0c;要么不执行&#xff0c;正所谓一荣俱荣一损俱损。 原子操作…

Linux线程——互斥锁

概念 互斥量&#xff08;mutex&#xff09;从本质上来说是一把锁&#xff0c;在访问共享资源前对互斥量进行加锁&#xff0c;在访问完成后释放互斥量上的锁。对互斥量进行加锁后&#xff0c;任何其他试图再次对互斥量加锁的线程将会被阻塞直到当前线程释放该互斥锁。 如果释放…

【HCIP学习记录】OSPF之DD报文

1.OSPF报文格式 24字节 字段长度含义Version1字节版本&#xff0c;OSPF的版本号。对于OSPFv2来说&#xff0c;其值为2。Type1字节类型&#xff0c;OSPF报文的类型&#xff0c;有下面几种类型&#xff1a; 1&#xff1a;Hello报文&#xff1b;● 2&#xff1a;DD报文&#xff1…

美国联邦机动车安全标准-FMVSS

FMVSS标准介绍&#xff1a; FMVSS是美国《联邦机动车安全标准》&#xff0c;由美国运输部下属的国家公路交通安全管理局(简称NHTSA)具体负责制定并实施。是美国联邦政府针对机动车制定的安全标准&#xff0c;旨在提高机动车的安全性能&#xff0c;减少交通事故中的人员伤亡。F…

ubuntu无 root 权限安装 screen

网上的方法主要是如下图的方法&#xff0c;源码安装&#xff0c;但是我一直 make install失败显示没有权限 然后选择放弃&#xff0c;然后随便试了一下方法 2&#xff0c;成功 方法 1 方法 2 pip3 install screen结果&#xff1a;

生物识别应用指纹的算法是什么样的?有什么性能?

方案特点 • 采用金融级安全芯片 ACH512 的指纹模组&#xff0c;指纹和密码安全存储&#xff0c;云端数据安全传输 • 采用高性能指纹专用安全MCU芯片ACM32FP4&#xff0c;支持小点阵图像算法处理 • 支持80*64、88*112、96*96、160*160、192*192等像素传感器 • 已适配传…

Ubuntu系统使用Nginx搭建RTMP服务器

环境&#xff1a; 推流端 rockpi s 主控rk3308 运行ubuntu系统 服务端 ubuntu 播放器 VLC播放器 服务端安装依赖&#xff1a; apt-get install build-essential libpcre3 libpcre3-dev libssl-dev创建nginx编译目录&#xff1a; mkdir my_nginx_rtmp cd my_nginx_rtmp/下载 …

【Python基础】文件读写

文章目录 [toc]打开文件open()函数参数解析示例 文件路径绝对路径示例 相对路径示例 打开文件的模式常用模式 读文件示例 写文件示例 按行读写文件readline()示例 readlines()示例 writelines()示例 关闭文件示例finally语句示例 上下文管理器示例 自定义读写类示例 打开文件 …

计算机网络:物理层(编码与调制)

今天又学会了一个知识&#xff0c;加油&#xff01; 目录 一、基带信号与宽带信号 1、基带信号 2、宽带信号 3、选择 4、关系 二、数字数据编码为数字信号 1、非归零编码【NRZ】 2、曼彻斯特编码 3、差分曼彻斯特编码 4、归零编码【RZ】 5、反向不归零编码【NRZI】 …

查找Apple Watch的序列号有重要意思,主要有两种方法

如果你打算购买二手Apple Watch&#xff0c;你可能需要检查它的序列号或IMEI号&#xff0c;来确保可靠性。以下是如何从Apple Watch和iPhone中查找序列号。 在Apple Watch上查找序列号和IMEI 1、在Apple Watch上&#xff0c;按下手表表面的数字皇冠以打开应用程序网格或列表。…

【设计模式--行为型--访问者模式】

设计模式--行为型--访问者模式 访问者模式定义结构案例优缺点使用场景扩展分派动态分派静态分派双分派 访问者模式 定义 封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这些元素的新操作。 结构 抽象访问者角色&…

晶体管的工作状态判断和工作条件

晶体管是模拟电路中基础的器件&#xff0c;对于电子工程师来说&#xff0c;了解晶体管工作的条件和判断晶体管的工作状态都是非常基础的&#xff0c;本文将带大家一起学习或回顾一下。 一、晶体管工作的条件 1.集电极电阻Rc&#xff1a; 在共发射极电压放大器中&#xff0c;…

在Linux中遇到“没有可用软件包”的情况

1. 旧的或不完整的软件源 更新你的软件源列表 对于Ubuntu/Debian系统 sudo apt-get update 对于RHEL/CentOS系统&#xff0c;使用命令 sudo yum update 或 sudo dnf update&#xff08;取决于你的系统版本&#xff09; 添加其他软件源&#xff1a; 例如&#xff0c;你可以安…

HPM6750系列--第十篇 时钟系统

一、目的 上一篇中《HPM6750系列--第九篇 GPIO详解&#xff08;基本操作&#xff09;》我们讲解了HPM6750 GPIO相关内容&#xff0c;在进一步讲解其他外设功能之前我们有必要先讲解一下HPM6750的时钟系统。 时钟可以说是微控制器系统中的心脏&#xff0c;片上外设模块必须依赖时…

爱普生手机打印助手Epson Smart Panel下载分享

新一代智能打印Epson Smart Panel为您提供一站式打印服务&#xff0c;人性化装机助手&#xff0c;智能联网&#xff0c;快速开启远程微信打印&#xff0c;全新交互式设计&#xff0c;打印体验焕新升级&#xff1b; 根据手机不同可选下列不同下载方式&#xff1a; 人性化智能装机…

《每天一分钟学习C语言·一》

1、转义字符&#xff1a;\n换行&#xff0c;\t前进一个tab键&#xff0c;\b退格键 2、八进制前面有0&#xff0c;%o或者%#o表示八进制&#xff0c;十六进制前有0X&#xff0c;%0x或者%#0x表示十六进制 3、%u打印无符号数&#xff0c;%g显示小数&#xff0c;类似于%f&#xff…