1。IDA脚本的打开与使用:

 

 

IDA脚本两种语言:IDC(IDC,本地脚本语言)和Python

 

2。IDC语言介绍

1。IDC变量:IDC是一种松散的语言,没有明确的类型。使用3中数据类型,整数(IDA文档使用类型名称long)、字符串、浮点值。绝大部分的操作是针对整数和字符串。

因为字符串被视为IDC中的本地数据类型。所以不需要跟踪存储一个字符串所需空间。

IDC支持局部变量,使用任何变量前需要声明变量。

引入局部变量的关键字auto,声明时可以初始化。

全局变量的关键字extern,可以在函数内或外定义,但不能声明时带初始值,首次使用分配空间,生存周期和该会话生存周期一致。

Eg:auto addr, reg, val;

 

2。注释:C风格注释 /**/或//

 

3。使用“;”分号作为语句终止符和C一样

 

4。IDC不支持C风格数组(IDA5.6引入分片)、指针(IDA5.6开始支持)或结构体和联合体等复杂数据结构,IDA5.6使用的是类

 

5。IDC表达式

IDC支持几乎所有的C中的算术运算符,包括三元运算符,但不支持复合赋值运算符(eg:+= *= >>=等)。所有整数值的操作运作为有符号数处理,所以进行右移操作需要处理符号为(& 0x7FFFFFFF)

在IDC中不需要使用字符串来复制函数(C语言中strcpy,strdup),也不需要字符串拼接函数(C语言中strcat),使用分片指定与数组类似的变量子序列。

分片使用方法:[起始索引:结束索引]  至少需要一个索引,使用分片处理IDC字符串类似数组。

Eg: auto str=”String to slice”;

   auto s1,s2,s3,s4;

   s1 = str[7:9]     // to

   s2 = str[:6]       // String

   s3 = str[10:]     // slice

   s4 = str[5]        // g

 

6。IDC语句

所有IDC中所有简单语句均以“;”结束。switch是IDC唯一不支持的C风格复合语句。使用for循环时注意IDC不支持复合语句

Eg:auto i;

       for(i = 0; i<10; i += 2){}        // 不合法

       for(i = 0; i<10; i = i + 2){}     // 合法

IDC并不严格限制新引入的变量作用范围,所以可以在这些变量的{}外引用

Eg:

if(1){

auto x;

x = 10;

}else{

       auto y;

       y = 3;

}

Message(“x = %d\n”,x);

Message(“y = %d\n”,y);

结果是:x = 10, y =0;

所以在一个函数中,不能访问其他任何函数中的声明变量。

 

7。IDC函数

IDC仅仅在独立程序(.idc文件)中支持用户定义函数,IDC命令对话框不支持。

IDC中static关键字用于引入一个用户定义的函数,函数列表仅包含一个以“,”逗号分割的参数列表

函数的基本结构:

static my_fun(x,y,z){

       auto a,b,c;

}

IDC函数两种传参方式:指传递,地址传递(使用&)

Eg:

auto q=0,r=1,s=2;

my_func(q, r, s);

my_func(q, &r, s);

函数声明不会明确是否返回值和返回值的类型,可以使用return返回值,任何隐式返回值都为0。可以将函数引用作为参数传递给另一个函数,并将函数引用作为函数结果返回。

Eg:

static getFunc(){

       return Message;

}

static useFun(func,arg){

       func(arg);

}

Static main(){

       auto f = getFunc();

       f(“hello world\n”);

       usefun(f, “Print\n”);

}

 

       8。IDC对象

       IDC定义一个称为object的根类,所有类由它衍生,创建新类时支持单一继承,不使用访问说明符,所有类成员均为有效共类,类声明仅包含类成员函数声明。创建数据成员时,创建一个给数据成员赋值的赋值语句既可。

       Eg:

       Class ExampleClass{

              ExapmleClass(x, y){

                     this.a = x;

                     this.b = y;

              }

              ~ExampleClass(){}

              foo(x){

                     this.a = this.a + x;

              }

       }

      

       static main(){

              ExampleClass ex;

              auto ex = ExampleClass(1,2);

             

              ex.foo(10);

              ex.z = "string"

       }

 

       9。IDC程序

       IDC程序文件基本结构:

       #include <idc.idc>

       static main(){

             

       }

       IDC认可以下C与处理指令

       #include<文件>

       #define<宏名称>[可选值]

       #ifdef<名称>

       #else

       #endif

       #undef<名称>

 

       10。IDC错误处理

       两类错误:

1。解析错误:仅报告IDC解析过程中的第一个错误。

2。运行错误:较少见,使用异常处理(try/catch)可以弥补IDC不能调试缺陷

      

       11。IDC数据存储

IDC并不支持传统意义上的数组,IDC数组对象是稀疏数组(即不会预先分配数组空间而是按需分配)

 

12。关联IDC脚本热键

格式:

       #include <idc.idc>

       #include <my_amazing_script.idc>

       static main(){

              AddHotKey("z","MyAmazingFunc");

       }

 

posted on 2019-06-02 20:06  黑箱  阅读(450)  评论(0编辑  收藏  举报