3.2 IDAPro脚本IDC常用函数

简介: IDA Pro内置的IDC脚本语言是一种灵活的、C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析。IDC脚本语言支持变量、表达式、循环、分支、函数等C语言中的常见语法结构,并且还提供了许多特定于反汇编和静态分析的函数和操作符。由于其灵活性和可扩展性,许多逆向工程师都喜欢使用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月前
|
缓存 运维 Java
函数计算产品使用问题之如何在函数代码的根目录中执行命令
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
|
4月前
|
Shell 开发者
Shell 函数深入解析与实践
了解 Shell 函数的基础,包括定义、参数传递及返回值。函数定义有多种语法,如 `function func() {...}` 或 `func() {...}`。参数通过 `$1`, `$2` 等访问,`$@` 代表所有参数。`return` 用于返回退出状态码(0-255),非数值数据需用 `echo`。正确获取函数返回值应立即检查 `$?`,例如:`result=$?`。实践中不断探索和学习!
31 1
|
4月前
|
运维 Serverless 网络安全
Serverless 应用引擎产品使用合集之能否用一个顶层函数,在云端动态的增加函数脚本或删除脚本
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
如何使用shell脚本在服务器中运行cdo命令进行批量合并、插值、求日均、月均等
如何使用shell脚本在服务器中运行cdo命令进行批量合并、插值、求日均、月均等
|
11月前
|
运维 Shell
运维(12)- shell位置参数和特殊变量
运维(12)- shell位置参数和特殊变量
56 0
Shell 跨脚本间变量传递
Shell 跨脚本间变量传递
|
SQL Oracle 关系型数据库
Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法
Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法
688 0
Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法
|
SQL 存储 关系型数据库
《懒人Shell脚本》之六——一键构造待采集批量sql语句
1、需求 采集任务构造入库。实现200多个网站的标题、时间、内容等信息的采集信息配置,并插入mysql中
197 0
《懒人Shell脚本》之六——一键构造待采集批量sql语句