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常用函数的更多相关文章

  1. LR脚本中常用函数使用介绍

    1.变量和参数的设置 //将IP地址和端口放入到参数中lr_save_string("192.168.1.133:8081","ip"); //计算变量数组的元 ...

  2. python ftp操作脚本&常用函数

    需求:快速进行ftp上传 ,下载,查询文件 原来直接在shell下操作: 需要[连接,输用户名,输密码,单文件操作,存在超时限制] 太过于繁琐,容易操作失败 脚本改进: 一句命令,搞定多文件上传,下载 ...

  3. matlab进阶:常用功能的实现,常用函数的说明

    常用功能的实现 获取当前脚本所在目录 current_script_dir = fileparts(mfilename('fullpath')); % 结尾不带'/' 常用函数的说明 bsxfun m ...

  4. LR常用函数以及调用自定义函数

    2.LR常用函数以及调用自定义函数 2.1.LR常用函数以及对信息的判断 2.1.1. LR内部自定义函数 在LR脚本中定义变量和编写自定义函数,需将变量的声明放在脚本其他内容的上方,否则会提示[il ...

  5. PHP常用函数备用

    刚学习php的时候,我也为记忆php函数苦恼不已.认为干嘛记忆这么枯燥无味的东西呢?用的时候查一下手册不就行了吗?但是当时因为身在辅导机构,还是记忆了一大堆自己并不感兴趣的函数. 由此就想起来,小的时 ...

  6. LoadRunner常用函数列表

    LoadRunner常用函数列表 Web相关函数 函 数 功  能  描  述 web_custom_request 用户可以通过该函数自行创建一个HTTP请求的函数 web_image 模拟用户单击 ...

  7. C#常用函数--通用篇

    C#常用函数→通用篇转载地址→http://www.cnblogs.com/superfang/archive/2008/07/02/1233706.html以前我都是"原文地址" ...

  8. PHP常用函数和常见疑难问题解答

    PHP常用库函数介绍 一.PHP字符串操作常用函数 1.确定字符串长度  int strlen(string str) 2.比较两个字符串 a. strcmp函数对两个字符串进行二进制安全的比较,并区 ...

  9. 最全的PHP常用函数大全

    PHP的一些常用函数 quotemeta() 函数在字符串中某些预定义的字符前添加反斜杠. quoted_printable_decode() 函数对经过 quoted-printable 编码后的字 ...

  10. PHP常用函数集合

    PHP常用函数总结 数学函数 1.abs(): 求绝对值 $abs = abs(-4.2); //4.2 数字绝对值数字 2.ceil(): 进一法取整 echo ceil(9.999); // 10 ...

随机推荐

  1. C99标准前后对于二维数组的动态声明问题

    html: toc: true 写在前面: 出于作者不了解C99以前标准中对二维数组的动态声明而导致的一场考场事故,作者写下这篇文章,,以便其他同学在遇到类似问题时不要犯同样的错误,同时作为对自己的警 ...

  2. 基于 SpringBoot+vue的地方美食系统,可作为毕业设计

    1 简介 这个项目是基于 SpringBoot和 Vue 开发的地方美食系统,包括系统功能模块,管理员功能模块,用户管理模块,功能齐全,可以作为毕业设计,课程设计等.源码下载下来,进行一些简单的部署, ...

  3. GDB变量值显示为< optimized_out >的解决方法

    GDB调试显示< optimized_out > 最近使用GDB调试的时候,经常遇到GDB查看变量值的时候输出< optimized_out >,Google了一下,找到几个解 ...

  4. POJ - 1611 : The Suspects (普通并查集)

    思路: 模板题,一步一步加入集合,最后判断有多少人跟0在同一个集合就行了. #include<iostream> #include<cstdio> using namespac ...

  5. 前端科普系列(2):Node.js 换个角度看世界

    本文首发于 vivo互联网技术 微信公众号 链接: https://mp.weixin.qq.com/s/fPNMaeNYgU3eJsh0SLMRRg作者:孔垂亮 [前端科普系列]往期精彩内容: &l ...

  6. java实现mysqlplus查询一个月之间的数据

    先说需求使用mysqlplus查询一个月之内的数据,传入的参数是202108 要求就查8月份这个月的所有数据,oracle数据中数据记录的时间类型是Date类型 public static void ...

  7. Flume原理及使用案例

    本文为转载篇!原文: https://www.cnblogs.com/zhangyinhua/p/7803486.html https://www.cnblogs.com/ciade/p/549521 ...

  8. 一文搞清楚Java中的方法、常量、变量、参数

    写在开头 在上一篇文章:一文搞清楚Java中的包.类.接口 中我们讲了Java中的包.类和接口,今天继续将剩下的方法.常量.变量以及参数梳理完. Java中的变量与常量 在JVM的运转中,承载的是数据 ...

  9. SD Host控制器的datasheet

    SD-Host控制器的datasheet更多的是给嵌入式软件工作人员使用,datasheet中主要包含一些寄存器以及读写擦除流程 寄存器主要有: 控制寄存器 状态寄存器 配置寄存器 软件和硬件进行交互 ...

  10. [转帖]深入浅出分析LSM树(日志结构合并树)

    https://zhuanlan.zhihu.com/p/415799237 ​ 目录 收起 零.前言 一.LSM树数据结构定义 二.插入操作 三.删除操作 四.修改操作 五.查询操作 六.合并操作 ...