1

プロセスに Python コードを挿入したいのですが、挿入時にプロセスがクラッシュしているようです。自分のプログラムではエラーは発生しませんが、ターゲット プロセスは動作を停止します。呼び出されたアンマネージ API でエラーが発生することはなく、適切に実行されたようです。

[DllImport("kernel32")]
    public static extern IntPtr CreateRemoteThread(IntPtr hProcess,IntPtr lpThreadAttributes,uint dwStackSize, IntPtr lpStartAddress,IntPtr lpParameter,uint dwCreationFlags, out uint lpThreadId);
    [Flags]
    enum ProcessAccessFlags : uint
    {
        All = 0x001F0FFF,
        Terminate = 0x00000001,
        CreateThread = 0x00000002,
        VMOperation = 0x00000008,
        VMRead = 0x00000010,
        VMWrite = 0x00000020,
        DupHandle = 0x00000040,
        SetInformation = 0x00000200,
        QueryInformation = 0x00000400,
        Synchronize = 0x00100000
    }
    [DllImport("kernel32.dll")]
    static extern IntPtr OpenProcess(ProcessAccessFlags dwDesiredAccess, [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle, int dwProcessId);
    [Flags]
    public enum AllocationType
    {
        Commit = 0x1000,
        Reserve = 0x2000,
        Decommit = 0x4000,
        Release = 0x8000,
        Reset = 0x80000,
        Physical = 0x400000,
        TopDown = 0x100000,
        WriteWatch = 0x200000,
        LargePages = 0x20000000,
        VIRTUAL_MEM = (0x1000 | 0x2000)
    }
    [Flags]
    public enum MemoryProtection
    {
        Execute = 0x10,
        ExecuteRead = 0x20,
        ExecuteReadWrite = 0x40,
        ExecuteWriteCopy = 0x80,
        NoAccess = 0x01,
        ReadOnly = 0x02,
        ReadWrite = 0x04,
        WriteCopy = 0x08,
        GuardModifierflag = 0x100,
        NoCacheModifierflag = 0x200,
        WriteCombineModifierflag = 0x400,
        PAGE_EXECUTE_READWRITE = 0x00000040
    }
    [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
    static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect);
    [DllImport("kernel32.dll", SetLastError = true)]
    static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out UIntPtr lpNumberOfBytesWritten);
    [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
    static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, UIntPtr dwSize, uint dwFreeType);
    [DllImport("kernel32", SetLastError = true, ExactSpelling = true)]
    internal static extern Int32 WaitForSingleObject( IntPtr handle,Int32 milliseconds);
    [DllImport("kernel32.dll")]
    public static extern Int32 CloseHandle(IntPtr hObject);
    private void InjectCode(string shellcode = "print('Hello, World!')")
    {
        foreach (Process proc in Process.GetProcesses())
        {
            if (proc.ProcessName == "Toontown")
            {
                int shellcode_length = shellcode.Length;
                IntPtr h_process = OpenProcess(ProcessAccessFlags.All, false, (int)proc.Id);
                IntPtr shellcode_address = (IntPtr)VirtualAllocEx(h_process, (IntPtr)0, (uint)shellcode_length, AllocationType.VIRTUAL_MEM, MemoryProtection.PAGE_EXECUTE_READWRITE);
                byte[] bytes = new byte[shellcode.Length * sizeof(char)];
                Buffer.BlockCopy(shellcode.ToCharArray(), 0, bytes, 0, bytes.Length);

                UIntPtr bytesout;
                uint t_id;

                bool Written = WriteProcessMemory(h_process, shellcode_address, bytes, (uint)shellcode_length, out  bytesout);
                IntPtr hThread = (IntPtr)CreateRemoteThread(h_process, (IntPtr)null, 0, (IntPtr)shellcode_length, (IntPtr)shellcode_address, 0, out t_id);
                int Result = WaitForSingleObject(hThread, 10 * 1000);
                if (Result == 0x00000080L || Result == 0x00000102L || Result == 0xFFFFFFFF)
                {
                    if (hThread != null)
                    {
                        CloseHandle(hThread);
                    }
                }
                Thread.Sleep(1000);
                VirtualFreeEx(h_process, shellcode_address, (UIntPtr)0, 0x8000);
                if (hThread != null)
                {
                    CloseHandle(hThread);
                }
            }
        }
    }

ご覧のとおり、アンマネージ API の戻り値を変数に保存して、それが機能しているかどうかを確認しました。正常に動作しているように見えましたが、ターゲット プロセスがクラッシュし、関連するエラーはログに記録されていません。それに。マネージド プログラムはアンマネージド プロセスに挿入できますか? 間違った変数の型をキャストしていませんか? シェルコードがバイト配列に正しく変換されていませんか? 教えてください、ありがとう。

編集: CreateRemoteThread でクラッシュします

4

2 に答える 2

1

CreateRemoteThread別のプロセスでネイティブ スレッドを作成する場合、受け取る開始アドレスは有効なマシン コードを指している必要があります。そうしないと、スレッドがプロセスをクラッシュさせます。

あなたが説明するシナリオは異なります。別のプロセスの Python インタープリターにコードを実行するように指示したいとします。これは実行できますが、異なり、かなり困難です。

2 つのことを行う他のプロセスにネイティブ ライブラリを挿入します。

  • Python インタープリターをセットアップする
  • プロセス間通信 (IPC) のいくつかの手段をセットアップする

IPC を使用して、実行する Python コードを他のプロセスに送信し、挿入したライブラリ内のコードが Python インタープリターを使用してそのコードを実行します。

この Codeproject 記事 で、DLL を別のプロセスに挿入する方法の例を見つけることができます。

于 2013-02-10T13:18:46.847 に答える
0

.net から任意の Python コードを実行しようとしているようです。これを実際に実行するために Python インタープリターを起動しようとしています。

これを行うことの短所は次のとおりです。

  • あなたが知っているように、それは複雑です。
  • プロセス間通信は、境界を越えてバイトを移動するため、さらに困難になります
  • 次に、各側から取得した情報を解析して、意味のあるものにする必要があります (おそらく何らかの XML を使用)。
  • 最後に、上記のすべてのオーバーヘッドで遅い

これを回避する 1 つの方法は、Python プログラムを .net 内で直接呼び出すことです。今、私は自分の人生で一度もそうしたことがなく、人生でパイソンを見たこともありません(シューというタイプを除いて)。http://msdn.microsoft.com/en-us/library/ee461504.aspxをご覧ください。残念ながら、Python をファイルに保存してそこで呼び出しているようです。ただし、文字列として保存されたコードを呼び出すことができると確信しています。

Python の DLR 実装を使用することの主な欠点は、Python -> CLR 変換を正しく行うためにサード パーティに依存していることです。しかし、IronPython は Microsoft が後援するオープン ソース プロジェクトだと思います。

詳細については、http: //ironpython.codeplex.com/を参照してください。

于 2013-02-10T18:45:37.540 に答える