首页
社区
课程
招聘
[原创]NET文件中的方法体内的局部变量分析
发表于: 2019-4-30 08:46 3096

[原创]NET文件中的方法体内的局部变量分析

htg 活跃值
4
2019-4-30 08:46
3096
我们通过dnSPY可以很方便的查找Token、方法体信息,在方法体上右键就能在十六进制文件里面找到相应的字节信息。
但是局部变量信息确无法直接找到。
具体查找路径是
1、局部变量的信息存在FAT方法头里面的最后4个字节,这是一个0x11表的Token
2、在0x11表里找到Signture的数字,这个是在#Blob的偏移地址
3、在#Blob表里找到对应的局部变量定义信息
4、解析。
遗留问题:
0x12表示class,其后面的一个字节是如何与某个具体的类挂钩的。一个字节有256个,这不就内涵class只有256个,不太可能吧???
问题已解决。。。。
2019-12-02 21:03 通过查阅MetaData Table的英文及中文翻译资料,终于搞明白,12所代表的class是如何通过后面的数字序号来找到对应的 类型【引用或定义】的。
比如

[5] class [mscorlib]System.Security.Cryptography.SymmetricAlgorithm,

12:Class

6D:???

(1)flag = 6D & 03 = 01【如果等于1,就从TypeRef里找;如果等于0,就从TypeDef里找到】 
(2)等于1,那就从TypeRef里找
(3)nid = 6D >> 2 = 1B
(4)到 TypeRef里面找第1B个的类型,那就是局部变量对应的类型。

具体分析如下:
//////////////////////////////////////////////////////////////////////////////////////////////////
///方法IL:通过dnSPY查看
	// LocalVarSig Token: 0x11000008 RID: 8
	.maxstack 4
	.locals init (
	///每行后面的十六进制数是对应的局部变量标记
		[0] string,	0E
		[1] uint8[],1D05
		[2] uint8[],1D05
		[3] bool,02
		[4] uint8[],1D05
		[5] class [mscorlib]System.Security.Cryptography.SymmetricAlgorithm,126D
		[6] uint8[],1D05
		[7] class [mscorlib]System.Security.Cryptography.ICryptoTransform,1271
		[8] class [mscorlib]System.IO.MemoryStream,1275
		[9] class [mscorlib]System.Security.Cryptography.CryptoStream,1279
		[10] uint8[],1D05
		[11] int32,08
		[12] class [mscorlib]System.Exception,1265
		[13] string,0E
	)

点击Token,可找到0x11表,StandAloneSig的第8项
Signture:0x143(#Blob Heap Offset)
在#Blob 右键 在十六进制显示数据(最好显示每行16个字节)
查看#Blob起始地址:0x89F8(注意不是,#Blob的iOffset 0x47E8)
0x89F8+0x143 = 0x8B3B
快速找到 0x8B3B 区域,不知道要取多少,先抓取几行看看


8B30                                  1A 07 0E 0E 1D            .....
8B40 05 1D 05 02 1D 05 12 6D 1D 05 12 71 12 75 12 79 .......m...q.u.y
8B50 1D 05 08 12 65 0E 05 00 01 1D 05 0E 05 20 01 01 ....e........ ..


1A:token长度(有的教程里面说的是第一个是07,经核查,表示从1A后面开始,即从07开始读取1A个字节)
07:局部变量标记,都得是07
0E:局部变量总数

[0] string,
0E:string

[1] uint8[],
1D:SafeArray
05:ubyte:int16

[2] uint8[],
1D:SafeArray
05:ubyte:int16

[3] bool,
02:bool

[4] uint8[],
1D:SafeArray
05:ubyte:int16

[5] class [mscorlib]System.Security.Cryptography.SymmetricAlgorithm,
12:Class
6D:???

[6] uint8[],
1D:SafeArray
05:ubyte:int16

[7] class [mscorlib]System.Security.Cryptography.ICryptoTransform,
12:Class
71:????

[8] class [mscorlib]System.IO.MemoryStream,
12:Class
75:??

[9] class [mscorlib]System.Security.Cryptography.CryptoStream,
12:Class
79:??

[10] uint8[],
1D:SafeArray
05:ubyte:int16

[11] int32,
08:??

[12] class [mscorlib]System.Exception,
12:Class
65:??

[13] string
0E:string

另外一个分析过程
	// LocalVarSig Token: 0x11000007 RID: 7
	.maxstack 4
	.locals init (
		[0] string,0E
		[1] uint8[],1D 05
		[2] uint8[],1D 05
		[3] bool,02
		[4] uint8[],1D 05
		[5] class [mscorlib]System.Security.Cryptography.SymmetricAlgorithm,12 6D
		[6] uint8[],1D 05
		[7] class [mscorlib]System.Security.Cryptography.ICryptoTransform,12 71
		[8] class [mscorlib]System.IO.MemoryStream,12 75
		[9] class [mscorlib]System.Security.Cryptography.CryptoStream,12 79 
		[10] uint8[],1D 05
		[11] class [mscorlib]System.Exception,12 65
		[12] string,0E
	)

点击Token,可找到0x11表,StandAloneSig的第7项
Signture:0xE8(#Blob Heap Offset)
在#Blob 右键 在十六进制显示数据(最好显示每行16个字节)
查看#Blob起始地址:0x89F8(注意不是,#Blob的iOffset 0x47E8)
0x89F8+0xE8 = 0x8AE0
快速找到 0x8AE0 区域,不知道要取多少,先抓取几行看看
8AE0 19 07 0D 0E 1D 05 1D 05 02 1D 05 12 6D 1D 05 12 ............m...
8AF0 71 12 75 12 79 1D 05 12 65 0E 05 00 00 12 81 15 q.u.y...e.......
8B00 05 20 01 1D 05 0E 06 20 02 01 0E 1D 05 05 20 01 . ..... ...... .
8B10 1D 05 08 08 20 02 12 71 1D 05 1D 05 0B 20 03 01 .... ..q..... ..
8B20 12 81 25 12 71 11 81 29 07 20 03 01 1D 05 08 08 ..%.q..). ......



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2019-12-2 21:10 被htg编辑 ,原因: 修正#Blob流第一个字节的含义;补充局部变量为12时,寻找变量类型的方法
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//