質問

うって思ったこと。

void *p = malloc (1000);
*((char*)p) = some_opcode;
*((char*)p+1) = another_opcode; // for the sake of the example: the opcodes are ok

....
etc...

かを定義する関数ポインタと呼pとしても機能しているのでしょうか。(私が使っているのでVC++2008express).

感謝

役に立ちましたか?

解決

コメントのない十分な広さがあります。Joe_Mucに通知するものとします。べきではないもののコードをメモリにロードで得られた malloc または new.で問題が変更された場合のスプローラーのページにWindowsを割り当て.

このな問題に足をVirtualAlloc()の関連WIn32Apiがあるのです:電話 VirtualAlloc( 設定の flProtect[PAGE_EXECUTE_READWRITE][2]

注意すべきない三つの配分、ガードページ、ページに必要なコード、その他のガードページです。これまで少なからの保護の悪いコードです。

またラップとの通話をご発生するコード structured exception handling.

次に、Windows X86ABI(呼び出し規約のいない記録されて名を連ねていらっしゃった).にある情報 こちらの, こちらの, こちらの を見るための最良の方法でも作品を見て生成されたコードをコンパイラです。これは簡単なの \FA スイッチ (なりました。

きの64ビットの呼び出し規約 こちらの.

また、でき得るMicrosoftのマクロアセンブラ MASMこちら.私のおすすめ書面にマシンコードにMASM、その出力に、そして、マシンコード発生器ないのではないでしょうか.

インテルのAMDの プロセッサのマニュアルは大いに参考に得られています。

他のヒント

実は、mallocんカットします。Windowsできるので,それを呼ん[VirtualAlloc](http://msdn.microsoft.com/en-us/library/aa366887(VS.85).aspx) のために実行可能なページのメモリを消費します。

開始小:

void main(void)
{
    char* p = (char*)VirtualAlloc(NULL, 4096, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    p[0] = (char)0xC3;  // ret

    typedef void (*functype)();
    functype func = (functype)p;
    (*func)();
}

の次のステップを奏で素敵なコードの保存にEBPするものとする。このとして残されている。:-)

後にこれを書いたのでmallocでもあります。できるんで走行管理用アカウントを以下のコマンWindows2000Server.その他のバージョンのWindowsである必要はVirtualAllocます。人が知っています。

あなたが呼び出して、所定の位置に右のオペコードをお持ちの場合は、関数ポインタにキャストし、それを呼び出すような単純なことができます。

typedef void (*voidFunc)();

char *p = malloc (1000);
p[0] = some_opcode;
p[1] = another_opcode; // for the sake of the example: the opcodes are ok
p[n] = // return opcode...

((voidFunc)p)();
あなたが実行可能としてページをマークしない限り、

注けれどもそれは、あなたのプロセッサを使用すると、ヒープ上に生成されたコードを実行させないことがあります。

私も現在、実行中のコード生成され、その答えがここにないそうだんしてくださったのです。

が必要な場合マーキングページとして実行可能にPOSIXシステム(Linux、BSD等)、 チェックを 受(2)機能.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top