DLLエントリポイント - 実験3
そろそろ核心部分です。
ndisasm -u call.oの一部
00000130 55 push ebp 00000131 89E5 mov ebp,esp 00000133 81EC08000000 sub esp,0x8 00000139 8B4508 mov eax,[ebp+0x8] 0000013C FFD0 call eax 0000013E C9 leave 0000013F C3 ret
こんな感じです。
main.cpp
上記コードをメモリ上に直接置くとどうでしょうか。
unsigned char code[] = {0x55,0x89,0xE5,0x81,0xEC,0x08,0x00,0x00,0x00,0x8B,0x45,0x08,0xFF,0xD0,0xC9,0xC3}; void hello() { printf("hello\n"); } int main(int argc, char *argv[]) { void (*call_func)( void (*)(void) ) = (void (*)( void (*)(void) ))code; (*call_func)(hello); return 0; }
ちょっと悪い事しているかな。
実行
nobita% ./dynamic_code3 hello
出来ました。
ちなみに code をheapにコピーしても動きました。