PE Golf

おー 97Byte の PE Hello がーとか今頃気付いたので。

http://d.hatena.ne.jp/firewood/20061120/1163957029

そしてなんか特に変数いじることなくうちでは動いてくれたので、これは初心者向けだ!と思って、とりあえず目につくとこいじったら "Hello, world!\n" の 14Byte アリアリ出力できました。

http://shinh.skr.jp/binary/hello_pe.asm

http://shinh.skr.jp/binary/hello_pe.exe

まだ nop 一個ありますし、他にも余裕はある感じです。 16B の出力まではこのままでいけるかと。誰か "Just another PE Hacker" くらいまで目指して下さい。

いじったことは一番下の 4B もったいないなぁ、というところと、 code2 と code3 は普通に通れるなぁと思ったのと、 Hello,world の下 1B なぜか余らしているなぁということと、まぁそんなこんなで隙間ができたので、開いた空間で "He" を実行時に補完しました。ていうか命令的にはまだまだスカスカな気が色々と。気がむいたら今度確認します。

PE とか調べてないので、見当違いのことやってたらすんません、と。

BITS 32
ORG  0

WriteFile    equ 0x7c810d87 ; Varies depending on environments
ImageBase    equ 0x00400000

filealign equ 4
sectalign equ 4   ; must be 4 because of e_lfanew

%define round(n, r) (((n+(r-1))/r)*r)

	dw "MZ"
	dw 0
pe_hdr	dd "PE"		; Signature
	dw 0x014C		; CPU: i386
hello	dw 1		; Number of Sections
	db "llo, world!"
	db 10
hello_e	dw 4			; offset between sections and opthdr
	dw 0x0103		; Characteristics: RELOCS_STRIPPED|EXECUTABLE|32BI
opthdr:
	dw 0x010B		; Magic
code1:
	mov edx, hello + ImageBase
	push byte hello_e - hello
	push edx
	jmp short code2

	dd codesize
	dd entry		; 
	dd codesize
	dd entry		; EntryPoint
	dd ImageBase	; ImageBase Address
sectbl:	dd 4		; PE hdr / Section Alignment
	dd 4		; File Alignment
code2:
	push byte 7	; stdout handle
	mov word [edx], 0x6548
	nop

	dw 4		; Subsys Major Ver
code3:
	call WriteFile - ImageBase
	ret

	dd round(hdrsize, sectalign)+round(codesize,sectalign) ; SizeOfImage
	dd round(hdrsize, filealign)              ; SizeOfHeaders
entry:
	push eax
	push ebx
	jmp short code1
	db 3		; Subsystem:console

codesize equ $ - code1

hdrsize equ $ - $$

filesize equ $ - $$
なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h