执行脚本的常识:
访问 IDA 的脚本引擎
图片. PNG
图片. PNG
script Flie: 表示 独立的一个脚本
最近使用过的脚本
如下图所示:
双击: 表示运行脚本
recent scripts 窗口
options->General->misc: 指定编辑器.
指定编辑器
IDC 语言:
IDC 脚本语言借用了很多 C 语言的许多的语法.
IDC 变量:
auto:
IDC 关键字 auto 用于引入一个局部变量.
auto 例子
1:IDC 认可使用 /* */ 的 c 语言风格进行多行注释.
2: 也使用 // 的 C++ 风格进行行尾注释
3: 使用; 作为终止符(和 c 语言中一样)
4:IDC 并不支持 c 风格数组类型, 指针, 结构体, 联合之类, 复杂的数据类型
extern:
IDA 使用 extern 关键字引入全局变量声明.
可以在任何函数定日的内部和外部申明全局变量, 但蹦年子啊声明全局变量的是时候为其提供初始值
例子程序
IDC 表达式:
IDC 支持 c 中的所有表达式和逻辑运算符, 包括三元运算符(?:).
支持逗号运算符
但是 不支持 op=(+=,*=,>>= 等)符合赋值运算符.
不支持算术移位, 如果要移位只能修改最高位和最低位. 如下所示:
移位操作
提供分片运算,
使用方法: 使用方括号和其实索引 (包括) 与结束索引 (不包括) 来指定至少一个索引. 如下图所示:
数组, 处理字符串
IDC 语句
语句以分号结尾, 但是不支持复合语句.
引入 try/catch 块和相关的 throw 语句, 相当与 C++ 的异常处理.
使用和 C 语言一样的花括号和语义. 在花括号中可以申明变量, 申明变量必须位于花括号内的第一条语句.
Message 类似于 c 语言中的 print
注意:
如下所示: 我们能同时打印 x,y 的值(即使未执行到 y 代码块), 但是只能打印出同一函数, 但是不能打印不同函数的值.
图片. PNG
IDC 函数:
.idc 文件支持用户定义的函数.
IDC 命令对话框不支持用户定义的函数.
使用 static 声明用户定义的函数.
函数的参数列表以逗号隔开.
函数声明
采用传值的方式 (call-by-value) 传递(ida5.6 以前)
采用传地址的方式(call-by-reference),(ida5.6 以后)
传地址采用 & , 这和 C 语言一样.
函数传地址
若需要返回值 , 使用 return
可以将函数的引用作为参数传递给另外一个函数, 并将函数引用的作为函数的结果返回.
函数的引用
IDC 对象:
IDC 定义一个称为 object 的根类, 支持单一继承.
不使用访问说明符(像 public 与 private), 所有类成员均为有效公共类.
在类中创建数据成员, 使用赋值语句赋值给创建的数据成员, 即可.
对象赋值
IDC 程序:
当执行大量的 IDC 语句的时候, 需要创建一个独立的 IDC 程序文件.
IDC 程序文件, 至少定义一个没有参数的 main 函数.
IDC 文件必须包含 #include <idc.idc > 这个文件, 由此获得宏定义.
脚本文件示例
IDC 认可以下 C 预处理指令:
- #include < 名称>, 将指定的文件加载到当前文件里
- #define < 宏名称>[可选值]: 创建一个宏, 可以指定一个值
define 宏定义
- #ifdef < 名称>: 测试执行的宏是否存在, 如果该宏存在, 可以选择处理其后的任何语句.
- #endif #ifde 或 #ifdef/#else 块所需的终止符.
- #undef < 名称> 删除指定的宏.
IDC 错误处理
主要产生两种错误: 解析错误和运行错误.
解析错误: 指令无法运行错误, 语法错误, 引用未定义的变量, 函数参数数量错误.
运行时的错误: 这种错误较少, 运行错误会使脚本立即终止.
关键 IDC 脚本与热键
使用 AddHotkey 函数调用, 将特定的热键与 IDC 脚本关联起来. 如下图所示:
热键
注意:
idc 脚本标准存储目录为 < IDADIR>/idc;
不能将脚本函数命名为 main. 因为 ida.idc 中的 main 函数相冲突.
IDC 函数
void MakeUnkn(long addr, long flags)
图片. PNG
- MakeUnkn
- // Convert the current item to an explored item
- // ea - linear address
- // expand - 0: just undefine the current item
- // 1: undefine other instructions if the removal of the
- // current instruction removes all references to them.
- // (note: functions will not be undefined even if they
- // have no references to them)
- void MakeUnkn (long ea,long expand); // convert to 'unknown'
- // expand!=0 => undefine consequent
- // instructions too
清除反编译
- // Clean up the disassembly so it looks nicer
- MakeUnknown(tea1, tea2-tea1, DOUNK_EXPAND|DOUNK_DELNAMES);
函数众多 待续
IDApython:
IDAPython 在 IDA 中集成了 Python 解释器, 除了提供了 Python 功能外, 使用这个插件还可以编写实现 IDC 脚本语言的所有 Python 脚本.
IDAPython 显著优势在于, 它可以充分利用 Python 强大的数据处理能力及所有的 Python 模块.
IDAPython 还具有 IDA SDK 的大部分功能, 与 IDC 相比, 使用它可以编写功能更加强大的脚本.
IDAPython 有一个缺点就是文档资源太少, 容易造成障碍.
IDApython 是一个插件, 在 IDA 中继承了 python 插件.
以下为 WOW 的 IDC 脚本:
- #include <idc.idc>
- static main()
- {
- auto ptr, i, a, b, k, x;
- auto y,ss="",dd="";
- k = 0;
- ptr = 0x40087F;
- i = 0;
- while(1)
- {
- a = Byte(ptr+i);
- b = Byte(ptr+i+1);
- for (x = 0; x <= 255; x++)
- {
- if(((a^x) == 0xFB)&&((b^x) == 0x90))
- {
- Message("%x\n",ptr+i);
- Message("xxxxxx%d\n",x);
- y=ltoa(x,16);
- //Message("%c\n",y);
- ss= ss + x;
- dd= dd + y;
- //Message("xxxxxx%s\n",dd);
- k++;
- break;
- }
- }
- if (k == 6)break;
- i++;
- }
- Message("good job\n");
- Message("%s\n", "Hello world!");
- Message("dddddd%s\n",dd);
- Message("+++++%s\n",ss);
- //Message("/////%c%c%c%c%c%c\n",ss[0:2],ss[2:4],ss[4:6],ss[6:8],ss[8:10],ss[10:12]);
- }
IDA python 有三个独立的模块组成:
idc: 这是兼容 idc 函数的模块
idautils: 很使用的一个模块, 大多数处理都是需要依托于这个模块
idaapi: 允许使用者通过类的形式, 访问更多底层的数据
IDC 模块负责提供 IDC 所有的函数
idaapi 模块负责访问核心 IDA API
idautils: 提供大量的实用函数, 其中许多函数可以生成各种数据库的相关对象 (如函数和交叉引用) 的 python 列表.
IDAPython 脚本会自动导入 idc 和 idautils 模块.
idaapi 模块, 需要手动导入.
以 wow 为例, 写一个练习脚本:
- import idc
- #ida 6.8
- def test_char(beginEa):
- retInt=0
- for i in range(0,100):
- curEa=beginEa+i
- prevByte=idc.Byte(curEa-1)
- curByte=idc.Byte(curEa)
- xorPrev=(prevByte^0xfb)
- xorcur=(curByte^0x90)
- if xorPrev==xorcur:
- print hex(curEa),hex(xorPrev),chr(xorPrev)
- retInt=xorPrev
- break
- return retInt
- str_in=""
- x0=test_char(0x40087f)
- //print x0
- str_in+=chr(x0)
- x1=test_char(0x4008c9)
- //print x1
- str_in+=chr(x1^x0)
- x2=test_char(0x400910)
- str_in+=chr(x2^x1)
- x3=test_char(0x400957)
- str_in+=chr(x3^x2)
- x4=test_char(0x40099e)
- str_in+=chr(x4^x3)
- str_in+=chr(0xf^x4)
- print str_in
参考链接:
IDApython 函数库:
灰帽子之旅:
来源: http://www.jianshu.com/p/366cd488cb24