「data セクションからプログラムを開始する」
前回からの続きですが、 code セクションではなくて、data セクションからプログラムを開始すると いうのも、パスワードクラッカーに対する良い嫌がらせになると思います。 例えば、次のようなコードを書いて、
// エントリポイントを data セクションの中に作るサンプル // (c) tokai@fides.dti.ne.jp 2001/3/21 #include < stdio.h > void mainCRTStartup(); struct ENTRYCODE { unsigned char code[4]; unsigned long addr; unsigned char code2[4]; } entry_code = { {0x90,0x90,0x90, // nop 0xb8},(unsigned long)mainCRTStartup, // move eax,(unsigned long)mainCRTStartup {0xff,0xe0,0,0} // jmp eax }; int main(){ printf("あ\n"); return 0; }
リンクの設定のエントリポイントシンボルに entry_code と指定すると、 mainCRTStartup の前に data セクションにある entry_code から プログラムが始まります。実際、map ファイルを見ると、
0003:00000030 00000898H .data DATA
0003:00000030 _entry_code 00406030 main.obj
entry point at 0003:00000030
となっています。