PE Golf (2)

  • メッセージが「Hello,world」(11バイト)
  • GetStdHandle(STD_OUTPUT_HANDLE)を使用せず、7固定(私の手元の環境)
  • WriteFileが固定アドレス

だと、PEでは最小と思われる97バイトで出力可能。
nasm用ソース → https://github.com/firewood/test/blob/master/hello.asm

ほぼ、k.inaba氏のとTiny PEとをマージしただけですが。
がんばってみたけどPEヘッダはオフセット4に入れるのが最小値のようで、Win32形式のままでは97バイト以下には削れない。別のCOFF形式なら削れるのかも。MessageBoxの方が小さいと思ってたけど、kernel32.dllだけは常にロードされている(kernel32.dll以外はimportしないとロードされない)ので、コンソールの方が小さくなりうると。
SizeOfOptionalHeaderは、サイズというよりもIMAGE_SECTION_HEADERへのオフセットを示しているので重ねられるということをようやく理解しました。
WriteFileの第四引数はNULLでも死なないみたいだけど、ebxを入れてあります。
Win32 APIはstdcallなので、call xxx/retの代わりにjmp xxxにして短くするという技が使えないことに今更ながら気がついたり。