当前位置: 首页 > news >正文

3.2 IDAPro脚本IDC常用函数

IDA Pro内置的IDC脚本语言是一种灵活的、C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析。IDC脚本语言支持变量、表达式、循环、分支、函数等C语言中的常见语法结构,并且还提供了许多特定于反汇编和静态分析的函数和操作符。由于其灵活性和可扩展性,许多逆向工程师都喜欢使用IDC脚本语言来自动化反汇编和静态分析过程,以提高效率和准确性。

经过上一节内容的学习相信读者已经找我了IDC脚本的基本编写技巧,根据IDAPro官方的资料可知,IDC脚本中封装了非常多有用的API接口,而要想更好的使用IDA实现自动化,这些结构的使用将变得非常重要,本节内容将总结整理IDA官方文档中的有用的API函数,来方便读者更好地运用。

(1)读取修改数据

函数功能
long Byte(long addr)读取1字节
long Word(long addr)读取2字节
long Dword(long addr)读取4字节
void PatchByte(long addr,long val)设置虚拟地址处1个字节
void PatchWord(long addr,long val)设置虚拟地址处1个字
void PatchDword(long addr,long val)设置虚拟地址处4字节
void isLoaded(long addr)addr包含有效数据返回1,否则返回0

(2)用户交互函数

函数功能
void Message(string format,…)输出一条消息
void print(…)打印每个参数的字符串表示形式
void Warning(string format…)在对话框中显示一条格式化消息
string AskStr(string default,string prompt)显示一个字符串输入框
string Askfile(long doSave,string mask,string prompt)显示一个文件选择对话框,(doSave=1 0)mask(如*..idc)
long AskYN(long default,string prompt)弹出是否选择对话框
long ScreenEA()返回当前光标所在位置的虚拟地址
bool Jump(long addr)跳转到反汇编窗口的指定地址

(3)字符串操作函数

函数功能
string form(string format,…)格式化并返回一个新字符串
string sprintf(string format…)格式化并返回一个新字符串
long atol(string val)将十进制值val转换成对应的整数值
long xtol(string val)将十六进制值val(可选择以0x开头)转换成对应的整数值
string 1toa(long val.long radix)以指定的radix(2、8、10或16)返回val字符串
long ord(string ch)返回单字符字符串ch的ASCII值
long strlen(string str)返回所提供字符串的长度
long strstr(string str.string substr)返回str中substr的索引
string substr(string str. long start.long end)返回包含str中由start到end-1位置的字符的子字符串

(4)文件输入输出函数

函数功能
long fopen(string filename,string mode)打开文件,模式(r表示读取,w表示写入)
void fclose(long handle)关闭fopen中文件句柄指定的文件
long filelength(long handle)返回指定文件的长度,如果发生错误,则返回-1。
long fgetc(long handle)从给定文件中读取一个字节。如果发生错误,则返回-1。
long fputc(long val, long handle)写入一个字节到给定文件中。如果操作成功,则返回0;如果发生错误,则返回-1。
long fprintf(long handle, string format, …)将一个格式化字符串写入到给定文件中。
long writestr(long handle, string str)将指定的字符串写入到给定文件中。
string/long readstr(long handle)从给定文件中读取一个字符串。这个函数读取到下一个换行符为止的所有字符(包括非ASCII字符),包括换行符本身(ASCII 0xA)。如果操作成功,则返回字符串;如果读取到文件结尾,则返回-1。
long writelong(long handle, long val, long bigendian)使用大端(bigendian=1)或小端(bigendian=0)字节顺序将一个4字节整数写入到给定文件中。
long readlong(long handle, long bigendian)使用大端(bigendian=1)或小端(bigendian=0)字节顺序从给定的文件中读取一个4字节整数。
long writeshort(long handle, long val, long bigendian)使用大端(bigendian=1)或小端(bigendian=0)字节顺序将一个2字节整数写入到给定的文件中。
long readshort(long handle, long bigendian)使用大端(bigendian=1)或小端(bigendian=0)字节顺序从给定的文件中读取一个2字节整数。
bool loadfile(long handle, long pos, long addr, long length)从给定文件的pos位置读取length数量的字节,并将这些字节写入以addr地址开头的数据库中。
bool savefile(long handle, long pos, long addr, long length)将以addr数据库地址开头的length数量的字节写入给定文件的pos位置。

(5)操纵数据库名称

函数功能
string Name(long addr)返回与给定地址有关的名称,如果该位置没有名称,则返回空字符串。如果名称被标记为局部名称,这个函数并不返回用户定义的名称。
string NameEx(long from, long addr)返回与addr有关的名称。如果该位置没有名称,则返回空字符串。如果from是一个同样包含addr的函数中的地址,则这个函数返回用户定义的局部名称。
bool MakeNameEx(long addr, string name, long flags)将给定的名称分配给给定的地址。该名称使用flags位掩码中指定的属性创建而成。这些标志在帮助系统中的MakeNameEx文档中有记录描述,可用于指定各种属性,如名称是局部名称还是公共名称、名称是否应在名称窗口中列出。
long LocByName(string name)返回一个位置(名称已给定)的地址。如果数据库中没有这个名称,则返回BADADDR(-1)。
long LocByNameEx(long funcaddr, string localname)在包含funcaddr的函数中搜索给定的局部名称。如果给定的函数中没有这个名称,则返回BADADDR(-1)。

(6)处理函数的函数

函数功能
long GetFunctionAttr(long addr,long attrib)返回包含给定地址的函数的被请求的属性
string GetFunctionName(long addr)返回包含给定地址的函数的名称
long NextFunction(long addr)回给定地址后的下一个函数的起始地址
long PrevFunction(long addr)返回给定地址之前距离最近的函数的起始地址

(7)代码交叉引用函数

函数功能
long Rfirst(long from)返回给定地址向其转交控制权的第一个位置
long Rnext(long from,long current)如果current已经在前一次调用Rfirst或Rnext时返回,则返回给定地址(from)转交控制权的下一个位置。
long XrefType()返回一个常量,说明某个交叉引用查询函数(如 Rfirst)返回的最后一个交叉引用的类型。
long RfirstB(long to)返回转交控制权到给定地址的第一个位置。如果不存在对给定地址的交叉引用,则返回BADADDR(-1)。
long RnextB(long to.long current)如果current 已经在前一次调用RfirstB或RnextB时返回,则返回下一个转交控制权到给定地址(to)的位置。如果不存在其他对给定位置的交叉引用,则返回BADADDR(-1)。

(8)数据交叉引用函数

函数功能
string Name(long addr)返回与给定地址有关的名称,如果该位置没有名称,则返回空字符串。如果名称被标记为局部名称,这个函数并不返回用户定义的名称。
string NameEx(long from, long addr)返回与addr有关的名称。如果该位置没有名称,则返回空字符串。如果from是一个同样包含addr的函数中的地址,则这个函数返回用户定义的局部名称。
bool MakeNameEx(long addr, string name, long flags)将给定的名称分配给给定的地址。该名称使用flags位掩码中指定的属性创建而成。这些标志在帮助系统中的MakeNameEx文档中有记录描述,可用于指定各种属性,如名称是局部名称还是公共名称、名称是否应在名称窗口中列出。
long LocByName(string name)返回一个位置(名称已给定)的地址。如果数据库中没有这个名称,则返回BADADDR(-1)。
long LocByNameEx(long funcaddr, string localname)在包含funcaddr的函数中搜索给定的局部名称。如果给定的函数中没有这个名称,则返回BADADDR(-1)。

(9)数据库操纵函数

函数功能
void MakeUnkn(long addr, long flags)取消位于指定地址的项的定义。这里的标志(参见IDCMakeUnkn文档)指出是否也取消随后的项的定义,以及是否删除任何与取消定义的项有关的名称。相关函数MakeUnknown允许你取消大块数据的定义。
long MakeCode(long addr)将位于指定地址的字节转换成一条指令。如果操作成功,则返回指令的长度,否则返回0。
bool MakeByte(long addr)将位于指定地址的项目转换成一个数据字节。类似的函数还包括MakeWordMakeDword
bool MakeComm(long addr, string corment)在给定的地址处添加一条常规注释。
bool MakeFunction(long begin, long end)将由beginend的指令转换成一个函数。如果end被指定为BADADDR(-1),IDA会尝试通过定位函数的返回指令,来自动确定该函数的结束地址。
bool MakeStr(long begin, long end)创建一个当前字符串(由GetStringType返回)类型的字符串,涵盖由beginend-1之间的所有字节。如果end被指定为BADADDR,IDA会尝试自动确定字符串的结束位置。

(10)数据库搜索函数

函数功能
long FindCode(long addr.long flags)从给定的地址搜索一条指令
long FindBinary(long addr,long flags,string binary)从给定的地址搜索一个字节序列
long FindData(long addr,long flags)从给定的地址搜索一个数据项
long FindText(long addr. long flags. long row. long column, string text)在给定的地址,从给定行(row)的给定列搜索字符串 text。

(11)反汇编系列函数

函数功能
string GetDisasm(long addr)返回给定地址的反汇编文本
string GetMnem(long addr)返回位于给定地址的指令的助记符部分
string GetOpnd(long addr.long opnum)返回指定地址的指定操作数的文本形式
long GetOpType(long addr,long opnum)返回一个整数,指出给定地址的给定操作数的类型
long GetOperandValue(long addr.long oprum)返回与给定地址的给定操作数有关的整数值
string CommentEx(long addr,long type)返回给定地址处的注释文本

相关文章:

3.2 IDAPro脚本IDC常用函数

IDA Pro内置的IDC脚本语言是一种灵活的、C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析。IDC脚本语言支持变量、表达式、循环、分支、函数等C语言中的常见语法结构,并且还提供了许多特定于反汇编和静态分析的函数和操作符。由于其…...

用python将csv表格数据做成热力图

python的开发者为处理表格和画图提供了库的支持,使用pandas库可以轻松完成对csv文件的读写操作,使用matplotlib库提供了画热力图的各种方法。实现这个功能首先需要读出csv数,然后设置自定义色条的各种属性如颜色,位置,…...

【程序基础】递归法

算法思想 递归法,其实可以说是一种编程技巧,通过调用自身,防止无限循环而给予递归出口。 思考使用场景 1.一个问题可以拆分成子问题,每个子问题相互独立。 2.数据满足递推关系,或者数据结构满足,例如图&…...

AI 绘画 | Stable Diffusion WebUI的基本设置和插件扩展

前言 Stable Diffusion WebUI是一个基于Gradio库的浏览器界面,用于配置和生成AI绘画作品,并且进行各种精细地配置。它支持目前主流的开源AI绘画模型,例如NovelAI/Stable Diffusion。 在基本设置方面,Stable Diffusion WebUI的默…...

如何用自然语言 5 分钟构建个人知识库应用?我的 GPTs builder 尝试

开发者的想象力闸门一旦打开,迎接我们的必然是目不暇接的 AI 应用浪潮冲击。 兴奋 早晨,我突然发现 ChatGPT 最新的 Create GPTs 功能可以用了。 这太让我意外了,没想到这么快。根据页面上的提示,我一直以为还得等上一周左右。于是…...

rabbitmq启动异常解决

如果 RabbitMQ 节点一直停在 "Stopping and halting node" 阶段,可能是由于一些原因导致节点无法正常停止。以下是一些建议的步骤,以尝试解决此问题: 手动强制终止节点: 尝试使用 rabbitmqctl 命令手动终止节点。在终端…...

OpenGL_Learn08(坐标系统与3D空间)

目录 1. 概述 2. 局部空间 3. 世界空间 4. 观察空间 5. 剪裁空间 6. 初入3D 7. 3D旋转 8. 多个正方体 9. 观察视角 1. 概述 OpenGL希望在每次顶点着色器运行后,我们可见的所有顶点都为标准化设备坐标(Normalized Device Coordinate, NDC)。也就是说&#x…...

github私有仓库开发,公开仓库发布版本

文章目录 github私有仓库开发,公开仓库发布版本需求背景实现思路GitHub Releases具体步骤广告 github私有仓库开发,公开仓库发布版本 需求背景 github私有仓库开发,公开仓库发布版本,既可以保护源代码,又可以发布版本给用户使用。许多知名软件项目都采用了这样的开…...

绿色低碳 数字未来-辽宁省建筑电气2023年学术年会-安科瑞 蒋静

2023年8月18日,辽宁省建筑电气2023年学术年会在辽宁友谊国宾馆成功召开。本届大会以“绿色低碳 数字未来”为主题,着眼为辽宁省建设提供智慧化电气设计及高质量产品服务。 安科瑞围绕“绿色低碳 数字未来”的主题,携充电桩及运营管理平台、工…...

day55

今日内容概要 路由层 无名分组 有名分组 反向解析 无名分组反向解析 有名分组反向解析 路由分发 伪静态的概念(了解) 名称空间(了解) 虚拟环境(了解) django1.x和django2.x的区别 路由层 url(r^test/$, views.test), url(rtestadd, views.testadd), ## 首页的地址 u…...

如何安装Node.js? 创建Vue脚手架

1.进入Node.js官网,点击LTS版本进行下载 Node.js (nodejs.org)https://nodejs.org/en 2.然后一直【Next】即可 3.打开【cmd】,输入【node -v】注意node和-v中间的空格 查看已安装的Node.js的版本号,如果可以看到版本号,则安装成功 创建Vue脚手…...

ASP.NETWeb开发(C#版)-day1-C#基础+实操

目录 .NET实操:创建项目执行 C#基础语法数据类型变量实操001_变量如何在一个解决方案 中创建另一个项目实操002结构实操003-if else实操004-多分支多行注释按钮实操:循环 面向对象基础如何在同一个项目下创建新的.cs文件实操-类的定义与访问实操-练习实操…...

LGSVL Python API 使用

1. References [1] LGSVL-python API使用方法 - 简书 [2] GitHub - lgsvl/PythonAPI: Python API for Simulator...

详解数据仓库之拉链表(原理、设计以及在Hive中的实现)

最近发现一本好书,读完感觉讲的非常好,首先安利给大家,国内第一本系统讲解数据血缘的书!点赞!近几天也会安排朋友圈点赞赠书活动(ง•̀_•́)ง 0x00 前言 本文将会谈一谈在数据仓库中拉链表相关的内容,包…...

使用Nodejs搭建简单的web网页并实现公网访问

🔥博客主页: 小羊失眠啦. 🎥系列专栏:《C语言》 《数据结构》 《Linux》《Cpolar》 ❤️感谢大家点赞👍收藏⭐评论✍️ 使用Nodejs搭建简单的web网页并实现公网访问 前言 Node.js是建立在谷歌Chrome的JavaScript引擎…...

C++学习第三十七天----第十章--对象和类

10.2.2 C中的类 类是一种将抽象转换未用户定义类型的C工具,它将数据表示和操作数据的方法合成一个整洁的包。 接口:一个共享框架,供两个系统交互时使用。 1.访问控制 使用类对象的程序可以直接访问类的公有部分,但只能通过公有…...

TikTok影响力经济:解锁社交媒体的商业机遇

社交媒体平台的崛起改变了我们与世界互动的方式,而TikTok作为其中的一员,已经成为全球范围内的现象。这个短视频应用不仅让用户在几秒钟内分享创意和娱乐,还为企业和创作者提供了巨大的商业机会。本文将深入探讨TikTok的影响力经济&#xff0…...

燃气管网监测系统|全面保障燃气安全

根据新华日报的报道,2023年上半年,我国共发生了294起燃气事故,造成了57人死亡和190人受伤,燃气事故的发生原因有很多,其中涉及到燃气泄漏、设备故障等因素。因此,加强燃气安全管理,提高城市的安…...

第三章:人工智能深度学习教程-基础神经网络(第六节-ML深度学习层列表)

要指定所有层按顺序连接的神经网络的架构,请直接创建层数组。要指定层可以有多个输入或输出的网络架构,请使用 LayerGraph 对象。使用以下函数创建不同的图层类型。 输入层: 功能描述图像输入层 将图像输入网络应用数据标准化序列输入层 将…...

福建科立讯通信 指挥调度管理平台RCE漏洞复现

0x01 产品简介 福建科立讯通信指挥调度管理平台是一个专门针对通信行业的管理平台。该产品旨在提供高效的指挥调度和管理解决方案,以帮助通信运营商或相关机构实现更好的运营效率和服务质量。该平台提供强大的指挥调度功能,可以实时监控和管理通信网络设…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

零基础设计模式——行为型模式 - 责任链模式

第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案

这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由:大部分的转换软件需要收费,要么功能不齐全,而开会员又用不了几次浪费钱,借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...

毫米波雷达基础理论(3D+4D)

3D、4D毫米波雷达基础知识及厂商选型 PreView : https://mp.weixin.qq.com/s/bQkju4r6med7I3TBGJI_bQ 1. FMCW毫米波雷达基础知识 主要参考博文: 一文入门汽车毫米波雷达基本原理 :https://mp.weixin.qq.com/s/_EN7A5lKcz2Eh8dLnjE19w 毫米波雷达基础…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...