IDC脚本

第一部分:首先介绍以下ida软件的界面以及脚本所处位置

在这里插入图片描述
脚本命令打开处(上面图片)
在这里插入图片描述
代码展示(上面)
在这里插入图片描述
右键可以查看其功能
在这里插入图片描述
运行步骤及输出位置

第二部:介绍IDC

IDC变量

IDC是一种类型松散的语言,这表示它的变量木有明确的类型,IDC使用3种数据类型;整数(ida文档使用类型名称long),字符串浮点值,其中绝大部分的操作针对的是整数和字符串。字符串被视为IDC中的本地数据类型,因此,你不需要跟踪存储一个字符串所需要的空间,或者一个字符串是否使用零终止符。

在使用任何变量之前,必修先声明这个变量。IDC仅支持局部变量,不支持全局变量,所有变量必须在函数的第一个语句之前声明,这点和我们java或者c语言一样。但是需要注意的一点是在声明一个变量的同时,你不能初始化这个变量。

IDC关键字auto用于引入一个变量声明,下面举例合法和非法的IDC声明:

auto addr,reg,val //合法
auto count = 0 //非法 不能初始化变量

需要注意的是,你可以在一个语句中声明好几个变量。而且,IDC中的所有语句均使用分号为终止符(和C语言一样)IDC并不支持c分格数组,指针或者结构体和联合体之类的复杂数据类型。

IDC表达式

除少数几个特例外,IDC几乎支持c中的所有算术和逻辑运算符,包括三元运算符(?:)。不支持op=(+=,*=,>≥=等)形式的复合赋值运算符,也不支持逗号运算符,所有整数操作数均作为有符号处理。这会影响到整数比较(始终带有符号)和右移位运算(>>),因为他们总是会通过符号位复制进行算术移位。如果需要进行逻辑右移,你必须修改结果的最高位,自己移位。(算术位移需要考虑符号位,而逻辑移位就是简单的移位,不需要考虑符号位)

由于字符串是IC的中的本地类型,一些字符串运算和c的字符串运算不一样,在IDC中,给字符串变量中的字符串操作数赋值将导致字符串赋值操作,我们不需要使用字符串来复制函数,将俩个字符串操作数相加,会将两个字符串操作数拼接起来,例如“hello”+“world”将得到“helloworld”,不需要使用c语言中的strcat之类的拼接函数。

IDC语句

和c语言一样,IDC中的所有简单语句均已分号结束。switch语句是IDC唯一不支持的c风格复合语句,在使用for循环时,需要记住的是,IDC不支持复合赋值运算符,如果我们希望除以1以外的其他值为单位进行计数,就需要注意这点。

auto i;
for(i = 0; i < 10; i += 2){} //非法
for(i = 0; i < 10; i = i + 2){} //合法

其中:我们可以声明这些变量的花括号以外引用他们。IDC并不严格限制新引入的变量的作用范围,但是,在一个函数中,我们不能访问在其他任何函数中的声明的变量。

if{1}{
	auto x;
	x = 10;
}else{
	auto y;
	y = 10;
}

IDC函数

IDC仅仅在独立程序(.idc文件)中支持用户定义的函数,IDC命令对话框不支持用户定义的函数。

IDC用于声明用户定义的函数的语法与c语言差异甚大。在IDC中,static关键字用于引用一个用户定义的函数,函数的参数列表仅包含一个以逗号分隔的参数名列表,下面详细说明了一个用户定义的函数的基本结构:

static my_func(x,y,z){
	auto a,b,c;
	//add statements to define the function behavior
	//......
	
}

在ida5.6之前,所有函数参数都严格采用传值传递,ida5.6引入了传地址参数传递机制。有趣的是,采用传值传递方式还是传地址方式传递参数,由ida调用函数的方式而不是声明函数的方式决定的。在函数调用中使用一元运算符&说明该函数采用传地址方式传递参数。在下面的例子中,上一个代码清单在的my_func函数同时采用这俩种参数传递方式。

auto q = 0, r = 1, s = 2;
my_func(q,r,s);
my_func(q,&r,s); 

注意,一个函数声明绝不会指明该函数是否明确返回一个值,以及在不生成结果时,它返回什么类型的值。

如果你希望函数返回一个值,可以使用return语句返回指定的值,我们可以通过函数的不同执行路径返回不同的数据类型。和c语言一样,我们不一定非要在函数中使用return语句,但是,任何不会显式返回一个值的函数将返回零值。

最后需要注意的是,从ida5.6开始,函数离成为IDC中的第一类对象更近了一步。现在,我们可以将函数引用作为参数传递给另外一个函数,并将函数引用作为函数的结果返回。下面的代码清单简单说明了使用函数参数和函数作为返回值的情况。

static getFunc(){
	return Message;
}

static useFunc(func,arg){
	func(arg);
}

static main(){
	auto f = getFunc();
	f("Hello World\n");
	useFunc(f,"Print me\n");
}

IDC对象

IDA5.6引用的另一项功能是能够定义类,并因此具有表示对象的变量。在下面的讨论中,我们假设你在一定程度上熟悉c++或者java等面向对象的编程语言。

IDC定义了一个称为object的根类,最终所有的类都由它衍生而来,并且在创建新类时支持单一继承,IDC并不访问说明符,如public与private。所有类成员均为有效公共类。类声明仅包含类成员函数的定义。要在类中创建数据成员,我们只需要创建一个给数据成员赋值的赋值语句即可。

class ExampleClass{
	ExampleClass(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";
	}
}

IDC程序

如果一个脚本应用程序需要执行大量的IDC语句,我们可能需要创建一个独立的IDC程序文件。另外,将脚本保存为程序,我们的脚本将获得一定程度的持久性和可移植性。

IDC程序文件要求我们使用用户定义的函数。至少,必须定义一个木有参数的main函数。另外,主程序文件还必须包含idc.idc文件以获取它包含的有用宏定义。

#include <idc.idc>
static main(){
	//do something functions fun here
}

IDC认可以下c预处理指令

#Include<文件>。将指定的文件包含在当前文件中

#define<宏名称>[可选值]。创建一个宏,可以选择给它分配指定的值。IDC预定义了许多宏来测试脚本执行环境。这些宏包括_NT_,LINUX,MAC,_GUL_和_TXT_等。

#ifdef<名称>。测试指定的宏是否存在,如果存在,可以选择处理其后的任何语句。

#else。可以与#ifdef指令一起用,如果指定的宏不存在,可以提供另外一组处理的语句。

#endif。#endif或#ifdef #else块需要的终止符。

#undef<名称>。删除指定的宏。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值