#!/usr/bin/ruby File.open('pe.exe', 'w') { |fd| # dos header fd.write "MZ" # PE header fd.seek 0x3c fd.write "\x40\0\0\0PE\0\0" # PEheader: cpu nbsections timestmp ptrsymtable nbsymbols szopthd caracs fd.write "\x4c\x01" + "\x01\0" + "\0\0\0\0" + "\0\0\0\0" + "\0\0\0\0" + "\x70\0" + "\x0f\x0f" # Optheader: sig linkvers szcode szidata szudata eip basecode basedata fd.write "\x0b\x01" + "\0\0" + "\0\x02\0\0" + "\0\x02\0\0" + "\0\0\0\0" + "\x80\x02\0\0" + "\0\x02\0\0" + "\0\x02\0\0" # imagebase sectalign filealign majosmin majimmin majsubsysmin rsrvd fd.write "\0\0\x40\0" + "\0\x02\0\0" + "\0\x02\0\0" + "\x04\0\0\0" + "\0\0\0\0" + "\x04\0\0\0" + "\0\0\0\0" # szimg szhead cksum subsysver dllcarac stackrsrv stackcomit heaprsrv heapcmt ldrflags numrva&sz fd.write "\0\x04\0\0" + "\0\x02\0\0" + "\0\0\0\0" + "\x02\0" + "\0\0" + "\0\x80\0\0" + "\0\x10\0\0" + "\0\x80\0\0" + "\0\x10\0\0" + "\0\0\0\0" + "\x02\0\0\0" # exportrva exportsz importrva importsz fd.write "\0\0\0\0" + "\0\0\0\0" + "\x0c\x02\0\0" + "\x62\0\0\0" # sections: name vsz rva rawsz rawptr reloc lnnb nbreloc nbln carac (contains_code, idata, rwx) fd.write "jj\0\0\0\0\0\0" + "\0\x02\0\0" + "\0\x02\0\0" + "\0\x02\0\0" + "\0\x02\0\0" + "\0\0\0\0" + "\0\0\0\0" + "\0\0" + "\0\0" + "\x60\0\0\xe0" # end of headers # imports fd.seek 0x0200 # procaddr fd.write "\x34\x02\0\0" fd.write "\x46\x02\0\0" fd.write "\0\0\0\0" # 0x0c # ilt tstmp fwdchain dllname iat fd.write "\0\x02\0\0" + "\0\0\0\0" + "\0\0\0\0" + "\x56\x02\0\0" + "\0\x02\0\0" fd.write "\0" * 4 * 5 # 0x34 # hint table: hint name-zterm (2-pad) fd.write "\0\0GetProcAddress\0\0" # 0x46 fd.write "\0\0LoadLibraryA\0\0" # 0x56 fd.write "kernel32.dll\0" # 0x63 # code fd.seek 0x0280 fd.write ''+ "\xcc"+ "\x53"+ "\xff\x15\x04\x02\x40\x00"+ "\xc3" fd.seek 0x0400 - 1 fd.write "\x90" }