2010-06-04 8 views
15

바이트 배열로 저장된 프로그램이 있습니다.바이트 배열에서 프로그램 실행

C#으로 실행할 수 있습니까?

+2

어떤 종류의 프로그램입니까? –

+0

바이트 배열 안에 텍스트 "Hello"가 저장된 간단한 프로그램이 있다고 가정 해 보겠습니다. – DanSpd

+8

배열의 내용은 무엇입니까? 소스 코드, 실행 코드? – Ikke

답변

11

확실히.

  1. 바이트 배열을 .exe 파일로 저장하십시오.
  2. Process 클래스를 사용하여 파일을 실행하십시오.

참고 : 이것은 바이트 배열이 소스 코드가 아니라 실행 가능 코드라고 가정합니다. 또한 유효한 PE 헤더가 있거나이를 만드는 방법을 알고 있다고 가정합니다.

+2

+1 간단하고 간단합니다! – Kryptic

+0

그들은 실행 헤더를 추가해야 할 수도 있습니까? – m0s

+1

바이트 배열을 실제로 exe 파일에 저장하지 않고도 그렇게 할 수 있습니까? 또한 네, 그것은 실행 가능합니다. – DanSpd

4

가상 컴퓨터를 만들고 코드를 실행하거나 반사 및 동적 형식을 사용하여 잠재적으로 동적 어셈블리를 만들 수 있습니다. 어셈블리를 동적으로로드 할 수 있습니다.

http://msdn.microsoft.com/en-us/library/system.reflection.assembly.load.aspx

당신은 따라서 아마도 그 뭔가를 할 수 있습니다. 내 기억이 나에게 도움이된다면 몇 가지 제한이 있습니다.

는 참조

반사 Assembly.Load 응용 프로그램 도메인

15

예. This answer은 바이트 배열의 내용을 직접 실행할 수 있음을 보여줍니다. 기본적으로 VirtualAlloc을 사용하여 알려진 주소 (IntPtr)의 힙에 실행 가능 영역을 할당합니다. 그런 다음 바이트 배열을 Marshal.Copy으로 해당 주소로 복사합니다. GetDelegateForFunctionPointer을 사용하여 포인터를 대리자로 변환하고 마지막으로 일반 대리자로 호출합니다. typeToExecute이 호출 프로그램에 알려진 인터페이스를 구현하는 경우, 당신은이 인터페이스로 캐스팅하고 호출 할 수 있습니다, 지금

Assembly assembly = AppDomain.Load(yourByteArray) 
Type typeToExecute = assembly.GetType("ClassName"); 
Object instance = Activator.CreateInstance(typeToExecute); 

: 바이트 배열을 가정

11

.NET 어셈블리 파일 (.exe 또는 .dll)를 포함 방법 :

((MyInterface)instance).methodToInvoke(); 
6

바이트 배열이 EntryPoint (Main 메서드)이있는 .Net 어셈블리 인 경우이 작업을 수행 할 수 있습니다. returnValue의 대부분은 null입니다. 그리고 커맨드 라인 인수를 제공하고 싶다면 아래 나열된 commandArgs 문자열에 넣을 수 있습니다.

var assembly = Assembly.Load(assemblyBuffer); 
var entryPoint = assembly.EntryPoint; 
var commandArgs = new string[0]; 
var returnValue = entryPoint.Invoke(null, new object[] { commandArgs }); 
관련 문제