LazyIDA源码阅读

news2024/11/18 19:41:43

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 idc

from 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.BADADDR
    return 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 = action

    def 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 1

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

action_handler_t类

def activate(self, ctx)

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

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

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

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

相关文章

idea过往各版本下载

idea过往各版本下载 https://www.jetbrains.com/zh-cn/idea/download/other.html

动手学深度学习2 安装环境

pytorch环境安装 1. windows 环境安装2. mac环境安装3. linux环境安装1. 申请云服务器 链接机器--Ubuntu2. 环境配置 4. 不安装环境直接使用colabQA 课程链接&#xff1a; https://www.bilibili.com/video/BV18p4y1h7Dr?p1&vd_sourceeb04c9a33e87ceba9c9a2e5f09752ef8 1.…

STM32----HAL库函数

1.STM32系统框架 1.1 Cortex-M内核&芯片 1.2 F1系统框架 4个主动单元4个被动单元 AHB&#xff1a;高级高性能总线 APH&#xff1a;高级外围总线 其中 1 为 主动单元 &#xff0c; 2为被动单元 总线时钟频率&…

计算机网络(3):数据链路层

数据链路层属于计算机网络的低层。 数据链路层使用的信道主要有以下两种类型&#xff1a; (1)点对点信道。这种信道使用一对一的点对点通信方式。 (2)广播信道。这种信道使用一对多的广播通信方式。广播信道上连接的主机很多&#xff0c;因此必须使用专用的共享信道协议来协调这…

Springboot项目启动前,使用GUI做初始化配置页面并将Log4j2的日志实时显示在GUI上

Springboot项目启动前&#xff0c;使用GUI做初始化配置页面并将Log4j2的日志实时显示在GUI上 效果预览 Mac Os效果图 Windows 10 效果图 需求分析 做这样的一个功能并不适用于所有系统&#xff0c;主要用于交付给用户的产品&#xff0c;这样方便客户自行维护。传统的服务一般…

Scratch:让少儿编程变得简单有趣

在21世纪这个信息化、数字化的时代&#xff0c;编程已经成为一种重要的技能。然而&#xff0c;对于许多孩子来说&#xff0c;编程可能是一种难以理解和掌握的技能。那么&#xff0c;有没有一种方法&#xff0c;可以让孩子们在轻松愉快的环境中学习编程呢&#xff1f;答案是肯定…

2024年电工(初级)证模拟考试题库及电工(初级)理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年电工&#xff08;初级&#xff09;证模拟考试题库及电工&#xff08;初级&#xff09;理论考试试题是由安全生产模拟考试一点通提供&#xff0c;电工&#xff08;初级&#xff09;证模拟考试题库是根据电工&…

简单的git操作指令

简单的git操作指令 1. git clone2. git add .3. git commit4. git push5. git rm6. git status7. git log8. git pull 1. git clone 如果有小伙伴出现报错的情况&#xff0c;爆出错误fatal: unable to access…not resolve host或者Network is unreachable可以看看这篇文章。 …

第三周:Python能力复盘

资料&#xff1a; 《笨办法学Python》阅读地址&#xff1a;https://www.bookstack.cn/read/LearnPython3TheHardWay 《廖雪峰Python教程》阅读地址&#xff1a;http://t.cn/RK0qGu7 《机器学习numpy与pandas基础》&#xff1a;https://zhuanlan.zhihu.com/p/639733816 《matplo…

手把手教你使用Cypress进行端到端测试

一、引言 Cypress是一个流行的端到端测试框架&#xff0c;它提供了一个全面的解决方案&#xff0c;可以测试任何在浏览器中运行的内容。不论你是想为一个小型项目添加测试&#xff0c;还是在大型企业级应用中进行端到端测试&#xff0c;Cypress都是一个不错的选择。本文将会手…

堆与二叉树(上)

本篇主要讲的是一些概念&#xff0c;推论和堆的实现&#xff08;核心在堆的实现这一块&#xff09; 涉及到的一些结论&#xff0c;证明放到最后&#xff0c;可以选择跳过&#xff0c;知识点过多&#xff0c;当复习一用差不多&#xff0c;如果是刚学这一块的&#xff0c;建议打…

python实现贪吃蛇游戏

文章目录 1、项目说明2、项目预览3、开发必备4、贪吃蛇代码实现4.1、窗口和基本参数实现4.2、绘制背景4.3、绘制墙壁4.4、绘制贪吃蛇4.5、绘制食物4.6、实现长度信息显示4.7、定义游戏暂停界面4.8、定义贪吃蛇死亡界面4.9、实现贪吃蛇碰撞效果4.10、实现添加食物功能4.11、实现…

怎么检测DC-DC电源模块稳定性?电源测试系统测试有什么优势?

DC-DC电源模块稳定性测试 稳定性是衡量DC电源模块的重要指标&#xff0c;电源模块的稳定性直接影响着电源产品和设备的工作稳定性。DC-DC电源模块的稳定性&#xff0c;可以通过检测输出电压、输出电流、负载、波形、效率等参数来评估。 1. 静态测试方法 静态测试是通过直流电压…

理解SwiftUI中的matchedGeometryEffect

matchedGeometryEffect SwiftUI 2.0 引入了一个新的修饰符&#xff1a;matchedGeometryEffect 。使用matchedGeometryEffect可以为整个层次结构中的视图创建过渡动画。只需要将它附加到要进行动画处理的两个视图上&#xff0c;并给它们指定相同的标识符。有了 matchedGeometry…

深耕元宇宙领域,强势发力文旅市场

2023年12月14日&#xff0c;“承上启下 智元宇宙&#xff1a;2024元宇宙与人工智能应用场景闭门会——苏州”在苏州泰山路2号百度VR&#xff08;苏州&#xff09;赋能中心成功举办。会议邀请了苏州本地的相关优秀企业代表、科创精英、投资与行业技术代表、公司创始人共计约50余…

龙迅LT6211B,HDMI1.4转LVDS,应用于AR/VR市场

产品描述 LT6211B 是一款用于 VR/ 显示应用的高性能 HDMI1.4 至 LVDS 芯片。 对于 LVDS 输出&#xff0c;LT6211B 可配置为单端口、双端口或四端口。对于2D视频流&#xff0c;同一视频流可以映射到两个单独的面板&#xff0c;对于3D视频格式&#xff0c;左侧数据可以发送到一个…

MySQL表的增删改查(初阶)

CRUD 即增加(Create)、查询(Retrieve)、更新(Update)、删除(Delete)四个单词的首字母缩写。且增删改查&#xff08;CRUD&#xff0c;create&#xff0c;retrieve&#xff0c;update&#xff0c;delete&#xff09;数据库的核心模块。 1. 新增&#xff08;Create&#xff09; 实…

去面试性能测试工程师必问的问题,

性能测试的三个核心原理是什么&#xff1f; 1.基于协议。性能测试的对象是网络分布式架构的软件&#xff0c;而网络分布式架构的核心是网络协议 2.多线程。人的大脑是单线程的&#xff0c;电脑的cpu是多线程的。性能测试就是利用多线程的技术模拟多用户去负载 3.模拟真实场景。…

(详解版)创建线程的四种方式

文章目录 Java中创建线程的四种方式1. 继承Thread类并重写 run 方法来创建线程2. 实现Runnable接口并实现 run 方法来创建线程。3. 使用Callable接口创建线程4. 使用Executor框架创建线程 Java中创建线程的四种方式 接下来我会详细解释这四种方式创建线程如何实现. 我们如果要…

STM32——串口通信应用篇

一、引言 STM32微控制器是一款功能强大的嵌入式系统芯片&#xff0c;广泛应用于各种领域。其中&#xff0c;串口通信是其重要功能之一&#xff0c;可用于与外部设备进行数据交换和控制。本文将介绍STM32串口通信的基本原理、应用场景以及实现方法。 二、STM32串口通信基本原理 …