2001/3/21

「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

となっています。