「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
となっています。