呼び出しのコードに格納されたヒープからvc++
-
29-08-2019 - |
質問
うって思ったこと。
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、その出力に、そして、マシンコード発生器ないのではないでしょうか.
他のヒント
実は、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)機能.