2012-04-30 4 views
4

私はC#でSFX/Protectorアプリケーションを作成していますが、リバースエンジニアリングのためにハードディスクに書き込むのではなく、バイト配列から保護されたアセンブリを実行します。VirtualAllocを使用してバイト配列からプログラムを実行していますか?

私はバイト配列(有効なエントリポイントを持っている)内にプログラムを持っていて、それを実行したいのです。 私はこのウェブサイトで同様の質問を見つけたが、これを行うには、以下のコードスニペットを使用してこれを行うことができるが、誰かがこれを使ってバイト配列からプログラムを実行する方法を教えてくれますか?

using System; 
using System.Collections.Generic; 
using System.Runtime.InteropServices; 

namespace DynamicX86 
{ 
    class Program 
    { 
     const uint PAGE_EXECUTE_READWRITE = 0x40; 
     const uint MEM_COMMIT = 0x1000; 

     [DllImport("kernel32.dll", SetLastError = true)] 
     static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); 

     private delegate int IntReturner(); 

     static void Main(string[] args) 
     { 
      List<byte> bodyBuilder = new List<byte>(); 
      bodyBuilder.Add(0xb8); 
      bodyBuilder.AddRange(BitConverter.GetBytes(42)); 
      bodyBuilder.Add(0xc3); 
      byte[] body = bodyBuilder.ToArray(); 
      IntPtr buf = VirtualAlloc(IntPtr.Zero, (uint)body.Length, MEM_COMMIT, PAGE_EXECUTE_READWRITE); 
      Marshal.Copy(body, 0, buf, body.Length); 

      IntReturner ptr = (IntReturner)Marshal.GetDelegateForFunctionPointer(buf, typeof(IntReturner)); 
      Console.WriteLine(ptr()); 
     } 
    } 
} 

どのように私はバイト配列からプログラムを実行するには、この答えを実装できます

技術的に彼のコード以下は私がこれをやらせます。私はこのコードで何ができるのか正確に理解できません。 Is it possible to execute an x86 assembly sequence from within C#?

Anyhelpが高く評価されるだろう。これは、私はこの答えを見つけたのリンクです

助けてください。

+0

このコードは明らかに*本物の*プログラムを実行するのに全く役に立たない。 PE32ファイル形式について学び、Windowsローダーと同じ仕事をする独自のローダーを実装する必要があります。コードに依存関係がある場合、これは非常に難しいことです。実際に管理されているアセンブリの場合は、Assembly.Load(byte [])を使用します。 –

答えて

3

有効なエントリポイントとは何ですか?その署名は何ですか?これらのバイトをどのように取得しますか?あなたはILを生成しますか?もしそうなら、おそらく単にthisを行う方が簡単かもしれません。

上記のコードでは、アンマネージメモリを割り当て、x86命令で埋め込み、.NETにこの "関数ポインタ"からデリゲートを作成して実行させることをお勧めします。

関連する問題