C/C++에서 C#과 같은 IL 코드 배열을 실행할 수있는 방법이 있습니까?C#에서 .NET IL 코드 실행
메서드를 작성하여 IL 코드로 변환하고 난독 화하여 바이트 배열에 저장하고 마지막으로 배열 내용을 해독하고 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
}
그리고 마지막으로이 바이트 배열은 다음과 같습니다 : 이제
static int MyMethod(string A, int B)
{
B += 10;
if (A.Equals("A"))
B = 0;
return B;
}
내가 IL 코드로 변환 : 예를 들어
이 내 C# 코드입니다
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
당신의 가장 큰 문제는 메타 데이터 토큰이라고 생각합니다. 예를 들어'string.Equals()'(코드에서'11 00 00 0A')에 대한 토큰이 항상 같지는 않을 것입니다. – svick
@svick 메타 데이터 토큰은 모듈 수준에서 저장되어있는 것처럼 보이기 때문에 큰 문제가됩니다 (적어도 빠른 테스트에서 볼 수 있습니다). 문자열 리터럴과 같은 경우에도 마찬가지입니다. –