有没有什么方法可以在C/C++中像shell代码一样在C#中执行IL代码数组?在C#中执行.NET IL代码#
我想创建一个方法,将其转换为IL代码,混淆它并存储在一个字节数组中,最后要执行它解密数组内容并执行IL代码。
例如,这是我的C#代码:
static int MyMethod(string A, int B)
{
B += 10;
if (A.Equals("A"))
B = 0;
return B;
}
现在我把它转换成IL代码:
private static int MyMethod(string A, int B)
{
locals: int local_0,
bool local_1
/* 0000025C 00 */ nop
/* 0000025D 03 */ ldarg_1 // int B
/* 0000025E 1F 0A */ ldc_i4_s 10
/* 00000260 58 */ add
/* 00000261 10 01 */ starg_s arg_1 // int B
/* 00000263 02 */ ldarg_0 // string A
/* 00000264 72 01 00 00 70 */ ldstr "A"
/* 00000269 6F 11 00 00 0A */ callvirt System.String::Equals(string) // returns bool
/* 0000026E 16 */ ldc_i4_0
/* 0000026F FE 01 */ ceq
/* 00000271 0B */ stloc_1 // bool local_1
/* 00000272 07 */ ldloc_1 // bool local_1
/* 00000273 2D 03 */ brtrue_s loc_28
/* 00000275 16 */ ldc_i4_0
/* 00000276 10 01 */ starg_s arg_1 // int B
loc_28:
/* 00000278 03 */ ldarg_1 // int B
/* 00000279 0A */ stloc_0 // int local_0
/* 0000027A 2B 00 */ br_s loc_32
loc_32:
/* 0000027C 06 */ ldloc_0 // int local_0
/* 0000027D 2A */ ret
}
最后这是一个字节数组:
private byte[] ilcode =
{
0x00, 0x03, 0x1F, 0x0A, 0x58, 0x10, 0x01, 0x02, 0x72, 0x01, 0x00, 0x00, 0x70, 0x6F, 0x11, 0x00, 0x0, 0x0A, 0x16,
0xFE, 0x01, 0x0B, 0x07, 0x2D, 0x03, 0x16, 0x10, 0x01, 0x03, 0x0A, 0x2B, 0x00, 0x06, 0x2A
};
有没有办法按照您期望的方式执行IL,但是您可以使用反射来动态加载并调用其中的任何方法。 – Thangadurai 2014-10-11 07:07:17
我认为你最大的问题是元数据令牌。例如,代码中'string.Equals()'('11 00 00 0A')的标记并不总是相同的。 – svick 2014-10-11 10:51:37
@svick元数据令牌弄糟了这么大的时间,因为它们似乎存储在模块级别(至少这是我从我的快速测试中看到的)。字符串文字也是一样。 – 2014-10-12 10:06:32