zoukankan      html  css  js  c++  java
  • 补充1:IDA的脚本IDC语言

    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 ”,x);

    Message(“y = %d ”,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 ”);

           usefun(f, “Print ”);

    }

           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");

           }

  • 相关阅读:
    49. 字母异位词分组
    73. 矩阵置零
    Razor语法问题(foreach里面嵌套if)
    多线程问题
    Get json formatted string from web by sending HttpWebRequest and then deserialize it to get needed data
    How to execute tons of tasks parallelly with TPL method?
    How to sort the dictionary by the value field
    How to customize the console applicaton
    What is the difference for delete/truncate/drop
    How to call C/C++ sytle function from C# solution?
  • 原文地址:https://www.cnblogs.com/heixiang/p/10964135.html
Copyright © 2011-2022 走看看