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

}

最新文章

  1. 最新Linux部署.NET,Mono and DNX
  2. Android adapter适配器的学习
  3. Difference between web server ,web container and application server
  4. uploadify 3.2 后台动态传参数
  5. UI几个重要使用方法
  6. 解析处理常用json数据总结
  7. MVC中使用AuthorizeAttribute做身份验证操作【转】
  8. 2016NOMS全国运营峰会——史上更强嘉宾阵容提前揭晓!
  9. weblogic11g 配置数据源
  10. 使用Html5下WebSocket搭建简易聊天室
  11. factorOne cannot be&amp;nb…
  12. PHP实现水印效果(文字、图片)
  13. oracle面试题目总结
  14. Android开发——Drawable与Bitmap知识
  15. Error response from daemon: --cluster-store and --cluster-advertise daemon configurations are incompatible with swarm mode
  16. vue全面介绍
  17. jinja语法
  18. currentSession
  19. POJ1015陪审团(Jury Compromise)——dp+路径记录
  20. Web应用开发中的几个问题

热门文章

  1. go安装及使用
  2. Flex弹性盒模型(新老版本完整)--移动端开发整理笔记(二)
  3. vue watch 深度监听
  4. Anaconda3(0)环境基本使用
  5. qt中窗体全屏
  6. Json、Pickle
  7. 数据库: 安装配置数据库,使用Navicat for MySQL和手机APP 连接测试(如果上一节碰到问题可参考这一节)
  8. 原生 JS 实现最简单的图片懒加载
  9. Affy包 estrogen包
  10. Unity开发:5.0+版本标准资源包无内置问题