2011-07-05 31 views
0

スペースを割り当て、いくつかのasmを書き、その時点でスレッドを開始しようとしました。 しかし、私はアクセス違反を受けています。 4つの0を押して、messageboxa関数を呼び出すと仮定します。しかし、エリアアドレスではアクセス違反が発生します。 通常のコードのように実行するにはどうすればよいですか?ここ C++の動的スレッド

void test2() 
{ 
    byte* area; 
    HANDLE process; 

    area = new byte[1024]; 

    for(int i = 0; i < 1024; i++) 
     area[i] = 0; 

    memmove((char*)area, "\x6a\x00\x6a\x00\x6a\x00\x6a\x00\xE8", 9); 

    *(DWORD*)&area[9] = ((DWORD)GetProcAddress(GetModuleHandle("User32.dll"), "MessageBoxA") - (DWORD)&area[9] - 4); 

    memmove((char*)&area[13], "\x33\xc0\xc3", 3); 

    VirtualProtect(area, 17, PAGE_EXECUTE_READWRITE, 0); 

    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)area, 0, 0, 0); 
} 

VirtualProtect()呼び出し、この場合には何もしません http://screensnapr.com/v/P33NsH.png

+0

恐らく 'PAGE_EXECUTE_READ'を試してください。 –

+0

アクセス違反が発生した時点からスタックトレースを取得できますか?アセンブリコード内にありますか、またはCreateThreadを呼び出す時点ですか? –

+0

スレッドを作成する呼び出しからではなく、最初のプッシュのアドレスから – Drake

答えて

1

解体のスクリーンショットです:それは4番目のパラメータはメモリ領域への有効なポインタであることを期待するので、それだけで失敗します以前のアクセス保護フラグを受け取ります(したがって、後で復元することができます)。したがって、CPUはこのページの実行を拒否し、最初の命令でGPFを取得します。

フラグにもPAGE_EXECUTE_READを使用する必要があります。そうしないと、最初のヒープ操作(ヒープ内の他の変数への読み込みアクセスであっても、同じページにアクセスすることさえあります)がGPFを生成します。代わりに、ヒープに割り当てる代わりにVirtualAlloc()を使用してください。

注:私はコードの残りの部分をチェックしなかったので、他の問題があるかもしれません。また、あなたが悪用を書いている場合を除き、これはアセンブリを書く方法ではないことに注意してください(VirtualProtect()をつぶすことはその兆候です)。ここで私は悪用についての私の仮定で間違っていることを望むことです。

+0

それは悪用ではなく、私にとってもっと速くすべきショートカット機能です。また、ありがとう、私はそれが最後のパラメータだったことを理解しました。 – Drake