.Net反编译工具ILDASM语言IL语言学习
变量声明:
.locals:声明局部变量。例:
.locals init (
[0] int32 i,
[1] string str,
[2] char c
)
IL_0001: ldc.i4.2 //2入栈
IL_0002: stloc.0 //或:IL_0002: stloc.i 将栈顶元素取出存入0号变量i中
以上两行的C#代码:int i=2
基本运算符:
add:+
sub:-
mul:*
div:/
rem:mod
cgt:>
clt:<
cep:=
1:true
0:false
not:一元not
and:二元与and
or:或
xor:异或
shl:左移
shr:右移
变体指令:add.ovf 流出检查 add.vof.un 两个无符号整数相加后执行溢出检查
关键字介绍:
.assembly:定义编译目标或加载外部库,例:
.assembly extern mscorlb:加载外部库
.assembly HelloWorld:编译目标HelloWorld
.ctor:构造函数
.ver:引用版本
.publickeytoken:应用程序实际公钥标记,用于唯一确定程序集
.moudle:程序集指令,表明定义的模块的元数据,以指定当前模块,程序由模块组成
.imagebase:影像基地址
.file alignment:文件对齐数值
.subsystem:连接系统类型,0x0003表示由控制台运行
.corflags:设置运行库头文件标志,默认为1
.class:类
public:访问控制权限,公开
auto:程序加载时内存布局由CLR决定
ansi:让没有被托管和被托管代码间无缝转换
beforefieldinit:使运行库可以在任意时间执行类型的构造函数方法
cil managed:指示编译器为托管代码
.maxstack:评估堆栈可容纳数据项的最大个数
call:调用静态方法
callvirt:调用实例方法
ret:执行返回
.entrypoint:程序入口
ldstr:将字符串压栈
hidebysig:表示如果当前类作为父类时,类中的方法将不会被继承
IL_0000:标记代码行开头,在此之前的一般为变量声明和初始化
ldarg.0:装载第一个成员参数
stloc.2:从计算堆栈的顶部弹出当前值并将其存储到指定索引(此处为第三个变量)处的局部变量列表中。
ldloc.2:将指定索引处的局部变量加载到计算堆栈上。
堆栈操作指令:
CLR中,任何有意义的操作都是在堆栈上完成的,把数据加载到栈上和加载栈上数据两种操作是最常用的操作,常用栈操作如下表:
指令 | 说明 |
ldarg/ldarga | 装载成员的一个参数,后者装载的是参数的地址 |
ldfld/ldsfld | 装载实例字段/装载静态字段 |
ldc | 装载数字常量,ldc.i4 5:整数5以4字节整数装入栈中 |
ldelem | 装载数组元素互堆栈 |
ldlen | 装载数据的长度 |
ldind | 加载间接寻址,即以地址来访问和操作数据 |
ldstr | 加载字符串到栈上 |
.s | 指令后加.s表示只取用单个字节 |
更多操作指令请参见MSDN中的OpCodes类
流程控制:
主要包括:br,br.s,brtrue,brfalse(br相当于‘goto’)
CLR支持两种数据类型:值类型(valuetype)和引用类型(类类型,class)
initobj:初始化值类型
newobj:分配和初始化对象
CLR中static表示静态方法,instance修饰实例方法,分别使用call和callvirt来调用,而calli为间接调用,通过函数指针来执行方法调度。
※※※※※※※※※※※※※※--我的程序人生--※※※※※※※※※※※※※※