IDC脚本介绍

IDC语言为IDA的一种脚本引擎,它之所以叫做IDC是因为它的语法与C语言很相似,这里我参考《IDA Pro权威指南》介绍一些IDC常用的基本语法。

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<idc.idc>   //头文件
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),返回与给定地址有关的名称,如果该位置没有名称,则返回空字符串。

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值