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にコピーしても動きました。