IDA7.0的脚本语言:idc和idapython

0x01.idc

IDC语言为IDA的一种脚本引擎,它之所以叫做IDC是因为它的语法与C语言很相似

1.IDC的变量没有明确的类型,IDC关键字auto用于引入一个局部变量的声明,用extern关键字引入全局变量的声明,不能在声明全局变量时为其提供初始值。

Example1:

auto addr, reg, val;    //没有初始化声明的多个变量
auto count = 0;         //已声明和初始化

Example2:

extern outsideGlobal;

static main()
{
	extern insideGlobal;
	outsideGlobal = “Global”;
	insideGlobal = 1;
}
2.IDC几乎支持C中的所有运算和逻辑操作符,所有整数操作数均作为有符号的值处理。这会影响到整数比较与右移位运算。如果需要进行逻辑右移位运算,你必须修改结果的最高位,自己移位,如下代码:

Example3:

    result = ( x >> 1 ) & 0x7fffffff;   //将最大有效位设置为0

关于0x7fffffff :
每个十六进制数为4bit,因此8位16进制是4个字节,刚好是一个int整型,F的二进制码为 1111,7的二进制码为 0111。这样一来,整个整数 0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1。也就是说,这是最大的整型数 int(因为第一位是符号位,0 表示他是正数)。

3.虽然IDC没有数组数据类型,但你可以使用分片运算符来处理IDC字符串,就好像他们是数组一样,IDC分片的用法:

Example4:

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'
4.与C语言一样,IDC所有简单语句均以分号结束。Switch语句是IDC唯一不支持的C风格复合语句。在使用for语句时IDC不支持复合赋值运算符,如果你希望以除1以外的其他值为单位进行计数,就需要注意这一点,如下代码:

Example5:

auto i;
for (i = 0; i < 10; i += 2) {}       //不合法,不支持 +=
for (i = 0; i < 10; i = i + 2) {}    //合法
5.输出语句(Message函数类似于C中的printf函数)

Example6:

auto i = 10;
auto j = 20;
Message(“i = %d\n”, i);
Message(“j = %d\n”, j);
6.IDC文件仅仅在独立程序(.idc文件)支持用户自定义的函数,IDC命令对话框不支持。IDC程序文件的基本结构:

Example7:

#include   //头文件
static main()
{
	//do something fun here
}
7.一些常用函数:

1)void PatchByte(long addr , long val) 设置虚拟地址addr处的一个字节值,PatchByte可更换为PatchWord,PatchDword设置虚拟地址addr处的2字节和4字节值。

2)long Byte(long addr) 从虚拟地址addr读取一个字节值,Byte可更换为Word,Dword读取2字节和4字节值。

3)void Message(string format , …),在输出窗口打印一条格式化消息。

4)void print(…),在输出窗口中打印每个参数的字符串表示形式。

5)long atol(string val),将10进制val转化成对应整数值。

6)long xtol(string val),将16进制val转化成对应整数值。

7)long ord(string ch),返回单字符字符串ch的ASCII值。

8)string Name(long addr),返回与给定地址有关的名称,如果该位置没有名称,则返回空字符串。

0x02.idapython

IDA7.x版本自带idapython,idapython只支持python2.7。系统中有python2.7,IDA7.x会自动检测,成功会有下图效果:
python小标志

你可能感兴趣的:(逆向与保护)