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) | 取消位于指定地址的项的定义。这里的标志(参见IDC的MakeUnkn文档)指出是否也取消随后的项的定义,以及是否删除任何与取消定义的项有关的名称。相关函数MakeUnknown允许你取消大块数据的定义。 |
| long MakeCode(long addr) | 将位于指定地址的字节转换成一条指令。如果操作成功,则返回指令的长度,否则返回0。 |
| bool MakeByte(long addr) | 将位于指定地址的项目转换成一个数据字节。类似的函数还包括MakeWord和MakeDword。 |
| bool MakeComm(long addr, string corment) | 在给定的地址处添加一条常规注释。 |
| bool MakeFunction(long begin, long end) | 将由begin到end的指令转换成一个函数。如果end被指定为BADADDR(-1),IDA会尝试通过定位函数的返回指令,来自动确定该函数的结束地址。 |
| bool MakeStr(long begin, long end) | 创建一个当前字符串(由GetStringType返回)类型的字符串,涵盖由begin到end-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常用函数的更多相关文章
- LR脚本中常用函数使用介绍
1.变量和参数的设置 //将IP地址和端口放入到参数中lr_save_string("192.168.1.133:8081","ip"); //计算变量数组的元 ...
- python ftp操作脚本&常用函数
需求:快速进行ftp上传 ,下载,查询文件 原来直接在shell下操作: 需要[连接,输用户名,输密码,单文件操作,存在超时限制] 太过于繁琐,容易操作失败 脚本改进: 一句命令,搞定多文件上传,下载 ...
- matlab进阶:常用功能的实现,常用函数的说明
常用功能的实现 获取当前脚本所在目录 current_script_dir = fileparts(mfilename('fullpath')); % 结尾不带'/' 常用函数的说明 bsxfun m ...
- LR常用函数以及调用自定义函数
2.LR常用函数以及调用自定义函数 2.1.LR常用函数以及对信息的判断 2.1.1. LR内部自定义函数 在LR脚本中定义变量和编写自定义函数,需将变量的声明放在脚本其他内容的上方,否则会提示[il ...
- PHP常用函数备用
刚学习php的时候,我也为记忆php函数苦恼不已.认为干嘛记忆这么枯燥无味的东西呢?用的时候查一下手册不就行了吗?但是当时因为身在辅导机构,还是记忆了一大堆自己并不感兴趣的函数. 由此就想起来,小的时 ...
- LoadRunner常用函数列表
LoadRunner常用函数列表 Web相关函数 函 数 功 能 描 述 web_custom_request 用户可以通过该函数自行创建一个HTTP请求的函数 web_image 模拟用户单击 ...
- C#常用函数--通用篇
C#常用函数→通用篇转载地址→http://www.cnblogs.com/superfang/archive/2008/07/02/1233706.html以前我都是"原文地址" ...
- PHP常用函数和常见疑难问题解答
PHP常用库函数介绍 一.PHP字符串操作常用函数 1.确定字符串长度 int strlen(string str) 2.比较两个字符串 a. strcmp函数对两个字符串进行二进制安全的比较,并区 ...
- 最全的PHP常用函数大全
PHP的一些常用函数 quotemeta() 函数在字符串中某些预定义的字符前添加反斜杠. quoted_printable_decode() 函数对经过 quoted-printable 编码后的字 ...
- PHP常用函数集合
PHP常用函数总结 数学函数 1.abs(): 求绝对值 $abs = abs(-4.2); //4.2 数字绝对值数字 2.ceil(): 进一法取整 echo ceil(9.999); // 10 ...
随机推荐
- NOKOV度量光学动作捕捉系统工作流程
如果你对影视.动画或者游戏有一定关注,相信你一定听说过"动作捕捉".事实上,无论是屏幕中的战场,还是真实的军事领域,从2K游戏中的虚拟球员,到医疗.康复.运动领域的专业研究:从机器 ...
- 【Docker】docker介绍 什么是虚拟化 容器与虚拟机比较 Docker 概念 docker安装
目录 docker介绍 什么是虚拟化 docker是什么 容器与虚拟机比较 Docker 概念 docker安装 docker介绍 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization ...
- 阿里云视频云「 vPaaS 」演绎了怎样的音视频应用开发「未来图景」?
vPaaS是阿里云视频云最新推出的低代码音视频应用开发产品,其中,vPaaS低代码音视频工厂,彻底打破了音视频应用的繁冗技术开发壁垒:vPaaS视频原生应用开发平台,全新定义了音视频应用的开发方式. ...
- ASP.NET Web API Demo OwinSelfHost 自宿主 Swagger Swashbuckle 在线文档
新建Web API工程 选Empty,勾选Web API,不要选择Web API,那样会把MVC勾上,这里不需要MVC Web API工程属性 XML文件用于生成在线文档 新建Windows服务作为W ...
- 汇编 | 数据段寄存器DS和[address]
Description CPU要读写一个内存单元的时候,必须先给出这个内存单元的地址,在8086PC中,内存地址由段地址和偏移地址组成.8086CPU中有一个DS寄存器,通常用来存放要访问 数据的段地 ...
- AtCoder Beginner Contest 172 (C题前缀和 + 二分,D题筛因子,E题容斥定理)
AB水题, C - Tsundoku 题目描述 有两摞书,一摞有 $n$ 本,从上至下每本需阅读 $a_i$ 分钟,一摞有 $m$ 本,从上至下每本需阅读 $b_i$ 分钟,问最多能在 $k$ 分钟内 ...
- django的简单学习
前言 以下项目实现基于一个投票系统 安装django 命令行安装 pip install django pycharm安装 pycharm的setting里找到这个,点击+号,搜索django 点击I ...
- 二、java发送https的各类请求
导航 一.java发送http的各类请求 二.java发送https的各类请求 java开发中需要调用其他服务的对外提供的https请求,上一篇写的是调用http,处理方式不太一样,可以参考如下代码: ...
- vue-cli3.x中public和assets的区别
今天开发了一个html5视频播放功能. vedio.mp4资源放在public文件夹下.那vue-cli3.x中public和assets的区别 vue-cli3.0有两个放置静态资源的目录分别是pu ...
- 2023全国大学生电子设计竞赛H题全解 [原创www.cnblogs.com/helesheng]
2023年又是全国大学生电子设计竞赛年,一如既往的指导学生死磕H题.8月2日看到公布的赛题,我自己还沾沾自喜,觉得今年学生用嵌入式系统和数字信号处理知识就可以完成这题,赛前都辅导过,应该成绩不差.哪想 ...