概述
IDC是IDA扩展的一种脚本语言,用于自动化,或者扩展查询IDA数据库
可以使用IDC或者python编写
语法类似C、也应用了C++类似的对象特性和异常处理
可以是单独的IDC文件,通过File->Script File加载,
也可以是简单的IDC命令,通过File->Script Command来编写
变量
包括字符串、整形、浮点型,后来又增加了对象、引用、函数指针等变量类型。
字符串是IDC的本地数据类型。
变量通过auto声明,在使用前都需要声明,没有知名明确的变量类型。
1 | auto addr, reg, val; /*xxxx*/ |
注释使用//或者/**/,语句使用;作为结束
不支持C风格数组(使用分片)、指针(使用引用)、结构体和联合体之类的复杂数据结构,之后引入了类的概念。
extern引入全局变量声明,不能声明中初始化值,可以在任何函数内外声明。
1 | extern outglobal; |
表达式
支持几乎所有的C算术和逻辑运算符,除了几个特例外(??)。包括三元运算?:,不支持op=(+=,*=, >>=)等复合运算符。后来可以支持逗号运算,
所有整数操作都是有符号的值处理。所以在整数比较和右移运算(>>)收到影响。
如果需要逻辑右移位,必须自己修改结果的最高位。1
result = (x >> 1)&0x7fffffff;
字符串操作、分片(语法类似python字符串操作)1
2
3
4
5
6auto str = "string to slice";
auto s1, s2, s3, s4;
s1 = str[7:9];
s2 = str[:6];
s3 = str[10:];
s4 = str[5];
IDC语句
唯一不支持C中的switch语句1
2auto i;
for(i = 0; i<10; i = i+1) {}
可以在花括号开始声明变量,但是变量没有具体作用域,可以在外面使用。但是函数中不能使用其他函数内部声明的变量。
1 | if(1) { |
IDC函数
只有独立IDC文件才支持函数,IDC命令框不支持函数。
使用static引入一个函数定义。函数参数只有参数名列表,逗号分隔。1
2
3
4static test(x, y, z)
{
auto a, b, c;
}
IDA5.6之前,函数参数严格使用传值传递,之后引入了传地址参数传递机制。采用哪种方式传递参数,使用调用者来决定的,而不是函数声明决定的。
传地址方式在调用方参数前加入&。1
2
3auto q=1, r=0, s=2;
test(q,r, s);
test(q, &r, s);//
函数声明不会指明要返回一个值,以及返回什么类型的值。
如果需要返回值,使用return返回指定的值即可。
可以在不同的路径返回不同类型的值。任何不显示返回值的函数默认返回为0.
IDA5.6之后,函数离成为IDC中第一类对象更近了一布,函数引用可以作为参数传给另一个函数,也可以将函数引用作为函数返回值。
1 | static ret() { |
IDC对象
1 | class People |
常用函数
1 | //Array操作 |
1 |
|
总结
总的来说,idc语法真的挺简单的,跟c基本一样,写起来不需要多大力气,就是需要熟悉idc提供的各类功能函数,应用起来才能得心应手。