IDA IDC脚本

IDC脚本基础

IDC变量

idc使用三种基本数据类型 整形,字符串,浮点值

idc使用auto关键字声明变量,使用extern关键字声明全局变量

auto var = 1; //局部变量

extern var2 ; //全局变量

全局变量可以多次重新定义,IDA将忽略后续的声明,全局变量不能在声明的时候初始化。

如果遇到无法识别的函数或变量名称,会从反汇编程序中寻找名称来解析它,并且会被替换成反汇编列表中的值。

1
2
3
.data:00413060 errtable        dd 1   ; oscode
.data:00413060 dd 16h ; errnocode
msg("address is: %x\n", _errtable);

会打印413060。

如果用label表示一个结构体,可以指向其字段:

1
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

​ //函数体

}

例子

1
2
3
4
5
6
7
auto tmpch;
auto i;
for(i=1; i<=50; i=i+1)
{
// msg("\n");
msg("%c", Byte(unk_8048B44+i*4));
}

请我喝杯咖啡吧~

支付宝
微信