• 补充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");

           }

  • 相关阅读:
    修改游标所在的表
    PL/SQL开发中动态SQL的使用方法
    索引学习笔记
    动态SQL和PL/SQL的EXECUTE选项分析
    PL/SQL正确选择游标类型
    oracle字符集
    ext框架下,实现弹出新窗口
    student guide
    plsql与.net异常处理
    ASP.NET 2.0 XML 系列(1): XML介绍
  • 原文地址:https://www.cnblogs.com/heixiang/p/10964135.html
Copyright © 2020-2023  润新知