DLLエントリポイント - 実験4
またまた実験
00000000 55 push ebp 00000001 89E5 mov ebp,esp 00000003 B878563412 mov eax,0x12345678 00000008 FFD0 call eax 0000000A C9 leave 0000000B C3 ret
ということはきっとこんなことが出来るはず
void hello()
{
printf("hello\n");
}
int main(int argc, char *argv[])
{
unsigned char code[] = {0x55, 0x89, 0xE5, 0xB8, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xD0, 0xC9, 0xC3};
*(unsigned int*)(&code[4]) = (unsigned int)hello;
void (*call_func)(void) = (void (*)(void))code;
(*call_func)();
return 0;
}動きました。
nobita% ./dynamic_code4 hello
最初いろいろ間違えてセグフォまくったので、0xEBFEをはさみまくって原因を追求した。
1個呼べれば2個呼べるはず。
ちょっと汚いけど。
void hello()
{
printf("%s\n", __func__);
}
void goodbye()
{
printf("%s\n", __func__);
}
int main(int argc, char *argv[])
{
unsigned char code[128];
code[0] = 0x55;
code[1] = 0x89;
code[2] = 0xE5;
code[3] = 0xB8;
*(unsigned int*)(&code[4]) = (unsigned int)hello;
code[8] = 0xFF;
code[9] = 0xD0;
code[10] = 0xB8;
*(unsigned int*)(&code[11]) = (unsigned int)goodbye;
code[15] = 0xC9;
code[16] = 0xFF;
code[17] = 0xD0;
code[18] = 0xC3;
void (*call_func)(void) = (void (*)(void))code;
(*call_func)();
return 0;
}結果
nobita% ./dynamic_code5 hello goodbye