4

私は C# でアプリケーション SFX / プロテクターに取り組んでおり、リバース エンジニアリングをより困難にするために、保護されたアセンブリをハードディスクに書き込むのではなく、バイト配列から実行したいと考えています。

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

技術的には、彼は以下のコードで私にこれをさせてくれました:

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 x​​86 assembly sequence from within C#?

どんな助けでも大歓迎です。

4

1 に答える 1

3

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

上記のコードが行おうとしているのは、アンマネージ メモリを割り当て、x86 命令で満たしてから、.NET にこの「関数ポインタ」からデリゲートを作成させて実行させることです。これは、必要なものとは異なります。

于 2012-04-30T21:44:48.873 に答える