IDC脚本基础
IDC变量
idc使用三种基本数据类型 整形,字符串,浮点值
idc使用auto关键字声明变量,使用extern关键字声明全局变量
auto var = 1; //局部变量
extern var2 ; //全局变量
全局变量可以多次重新定义,IDA将忽略后续的声明,全局变量不能在声明的时候初始化。
如果遇到无法识别的函数或变量名称,会从反汇编程序中寻找名称来解析它,并且会被替换成反汇编列表中的值。
.data:00413060 errtable dd 1 ; oscode
.data:00413060 dd 16h ; errnocode
msg("address is: %x\n", _errtable);
会打印413060。
如果用label表示一个结构体,可以指向其字段:
msg("address is: %x\n", _errtable.errnocode);
会打印413064。IDA不会尝试读取数据,而是返回结构体字段的地址。get_field_ea函数也可以获取字段地址。当程序挂起的时候可以使用寄存器名称读取寄存器的值,也可以修改。
IDC运算符
idc支持绝大部分c的运算符,但是不支持如+=的复合运算符,并且idc所有整数操作数
均作为有符号处理,移位运算符如>>总是进行算术移位,想要完成逻辑移位,必须手
动进行位运算。字符串是idc的基本类型,所以可以执行+号运算符拼接字符串。
IDC语句
idc不支持switch语句其他语句风格与c一致,以分号结束语句。
IDC函数
idc仅在idc的独立程序脚本中支持定义用户的函数。使用static关键字声明函数,可以使用return
返回一个值,return并非必须。参数为&a表示传引用
static func(a,b,c){undefined
//函数体
}
例子
auto tmpch;
auto i;
for(i=1; i<=50; i=i+1)
{
// msg("\n");
msg("%c", Byte(unk_8048B44+i*4));
}
文章评论