FASM: Portable Executable Review

Source: Izcellion
Goal: Advance and review FASM programming.

I. FASM compiled source code:
  1. format PE GUI 4.0
  2. entry start
  3.  
  4. include ‘%fasminc%\win32a.inc’
  5.  
  6. section ‘.data’ data readable writeable
  7.        msgText       db     ‘Message Text’,0
  8.        msgCaption    db     ‘Message Caption’,0
  9.  
  10. section ‘.code’ code readable executable
  11.        start:
  12.               invoke MessageBox,HWND_DESKTOP,msgText,msgCaption,MB_OK + MB_ICONINFORMATION
  13.               invoke ExitProcess,0
  14.  
  15. section ‘.idata’ import data readable
  16.        library       KERNEL32,     ‘KERNEL32.DLL’,\
  17.                      USER32,       ‘USER32.DLL’
  18.      
  19.        import KERNEL32,\
  20.               ExitProcess,         ‘ExitProcess’
  21.      
  22.        import USER32,\
  23.               MessageBox,          ‘MessageBoxA’

II. Same code complied from hex into ASM readable.

db 4Dh, 5Ah, 80h, 00h, 01h, 00h, 00h, 00h, 04h, 00h, 10h, 00h, 0FFh, 0FFh, 00h, 00h
    db 40h, 01h, 00h, 00h, 00h, 00h, 00h, 00h, 40h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 80h, 00h, 00h, 00h
    db 0Eh, 1Fh, 0BAh, 0Eh, 00h, 0B4h, 09h, 0CDh, 21h, 0B8h, 01h, 4Ch, 0CDh, 21h, 54h, 68h
    db 69h, 73h, 20h, 70h, 72h, 6Fh, 67h, 72h, 61h, 6Dh, 20h, 63h, 61h, 6Eh, 6Eh, 6Fh
    db 74h, 20h, 62h, 65h, 20h, 72h, 75h, 6Eh, 20h, 69h, 6Eh, 20h, 44h, 4Fh, 53h, 20h
    db 6Dh, 6Fh, 64h, 65h, 2Eh, 0Dh, 0Ah, 24h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 50h, 45h, 00h, 00h, 4Ch, 01h, 03h, 00h, 3Fh, 65h, 0ECh, 58h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 0E0h, 00h, 0Fh, 01h, 0Bh, 01h, 01h, 47h, 00h, 02h, 00h, 00h
    db 00h, 04h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 20h, 00h, 00h, 00h, 20h, 00h, 00h
    db 00h, 10h, 00h, 00h, 00h, 00h, 40h, 00h, 00h, 10h, 00h, 00h, 00h, 02h, 00h, 00h
    db 01h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 04h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 40h, 00h, 00h, 00h, 02h, 00h, 00h, 2Ch, 67h, 00h, 00h, 02h, 00h, 00h, 00h
    db 00h, 10h, 00h, 00h, 00h, 10h, 00h, 00h, 00h, 00h, 01h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 10h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 30h, 00h, 00h, 96h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 2Eh, 64h, 61h, 74h, 61h, 00h, 00h, 00h
    db 1Dh, 00h, 00h, 00h, 00h, 10h, 00h, 00h, 00h, 02h, 00h, 00h, 00h, 02h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 40h, 00h, 00h, 0C0h
    db 2Eh, 63h, 6Fh, 64h, 65h, 00h, 00h, 00h, 1Ch, 00h, 00h, 00h, 00h, 20h, 00h, 00h
    db 00h, 02h, 00h, 00h, 00h, 04h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 20h, 00h, 00h, 60h, 2Eh, 69h, 64h, 61h, 74h, 61h, 00h, 00h
    db 96h, 00h, 00h, 00h, 00h, 30h, 00h, 00h, 00h, 02h, 00h, 00h, 00h, 06h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 40h, 00h, 00h, 40h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 4Dh, 65h, 73h, 73h, 61h, 67h, 65h, 20h, 54h, 65h, 78h, 74h, 00h, 4Dh, 65h, 73h
    db 73h, 61h, 67h, 65h, 20h, 43h, 61h, 70h, 74h, 69h, 6Fh, 6Eh, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 6Ah, 40h, 68h, 0Dh, 10h, 40h, 00h, 68h, 00h, 10h, 40h, 00h, 6Ah, 00h, 0FFh, 15h
    db 80h, 30h, 40h, 00h, 6Ah, 00h, 0FFh, 15h, 60h, 30h, 40h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 58h, 30h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 3Ch, 30h, 00h, 00h
    db 60h, 30h, 00h, 00h, 78h, 30h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 4Ah, 30h, 00h, 00h, 80h, 30h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 4Bh, 45h, 52h, 4Eh
    db 45h, 4Ch, 33h, 32h, 2Eh, 44h, 4Ch, 4Ch, 00h, 00h, 55h, 53h, 45h, 52h, 33h, 32h
    db 2Eh, 44h, 4Ch, 4Ch, 00h, 00h, 00h, 00h, 68h, 30h, 00h, 00h, 00h, 00h, 00h, 00h
    db 68h, 30h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 45h, 78h, 69h, 74h, 50h, 72h
    db 6Fh, 63h, 65h, 73h, 73h, 00h, 00h, 00h, 88h, 30h, 00h, 00h, 00h, 00h, 00h, 00h
    db 88h, 30h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 4Dh, 65h, 73h, 73h, 61h, 67h
    db 65h, 42h, 6Fh, 78h, 41h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h
    db 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h, 00h

III. Portable executable header

  1. IMAGE_DOS_HEADER:                         ;start : 00 (0) to 3F (63)
  2.        .e_magic      dw     0x5A4D        ;00 01
  3.        .e_cblp       dw     0x0080        ;02 03
  4.        .e_cp         dw     0x0001        ;04 05
  5.        .e_crlc       dw     0x0000        ;06 07
  6.        .e_cparhdr    dw     0x0004        ;08 09
  7.        .e_minalloc   dw     0x0010        ;10 11
  8.        .e_maxalloc   dw     0xFFFF        ;12 13
  9.        .e_ss         dw     0x0000        ;14 15
  10.        .e_sp         dw     0x0140        ;16 17
  11.        .e_csum       dw     0x0000        ;18 19
  12.        .e_ip         dw     0x0000        ;20 21
  13.        .e_cs         dw     0x0000        ;22 23
  14.        .e_lfarlc     dw     0x0040        ;24 25
  15.        .e_ovno       dw     0x0000        ;26 27
  16.        .e_res        rw     4             ;28 29 | 30 31 | 32 33 | 34 35
  17.        .e_oemid      dw     0x0000        ;36 37
  18.        .e_oeminfo    dw     0x0000        ;38 39
  19.        .e_res2       rw     10            ;40 41 | 42 43 | 44 45 | 46 47 | 48 49 | 50 51
  20.        .e_lfanew     dd     0x00000080    ;52 53 | 54 55 | 56 57 | 58 59
  21.                                           ;60 61 62 63
    1. typedef struct _IMAGE_DOS_HEADER { // DOS .EXE header
    2.     WORD   e_magic;                     // Magic number
    3.     WORD   e_cblp;                      // Bytes on last page of file
    4.     WORD   e_cp;                        // Pages in file
    5.     WORD   e_crlc;                      // Relocations
    6.     WORD   e_cparhdr;                   // Size of header in paragraphs
    7.     WORD   e_minalloc;                  // Minimum extra paragraphs needed
    8.     WORD   e_maxalloc;                  // Maximum extra paragraphs needed
    9.     WORD   e_ss;                        // Initial (relative) SS value
    10.     WORD   e_sp;                        // Initial SP value
    11.     WORD   e_csum;                      // Checksum
    12.     WORD   e_ip;                        // Initial IP value
    13.     WORD   e_cs;                        // Initial (relative) CS value
    14.     WORD   e_lfarlc;                    // File address of relocation table
    15.     WORD   e_ovno;                      // Overlay number
    16.     WORD   e_res[4];                    // Reserved words
    17.     WORD   e_oemid;                     // OEM identifier (for e_oeminfo)
    18.     WORD   e_oeminfo;                   // OEM information; e_oemid specific
    19.     WORD   e_res2[10];                  // Reserved words
    20.     LONG   e_lfanew;                    // File address of new exe header
    21. } IMAGE_DOS_HEADER, *PIMAGE_DOS_HEADER;
  1. IMAGE_NT_HEADERS:                                ;start : 80 (128) to 1EF (495)
  2.        .Signature           db     ‘PE’,0,0      ;128 131
  3.  
  4.  
  5.        IMAGE_FILE_HEADER:                        ;start : 84 (132) to 97 (151)
  6.               .Machine                           dw     0x014C        ;132 133 for intel 386
  7.               .NumberOfSection                   dw     0x0003        ;134 135
  8.               .TimeDateStamp                     dd     %t            ;136 139
  9.               .PointerToSymbolTable              dd     0             ;140 143
  10.               .NumberOfSymbols                   dd     0             ;144 147
  11.               .SizeOfOptionalHeader              dw     0x00E0        ;148 149
  12.               .Characteristic                    dw     0x818F        ;150 151

============= Portable Executable Format Walkthrough =============

; References:
; 2. LUEVELSMEYER’s description about PE file format
; 3. Microsoft PSDK July 2000 Edition
; 4. Iczelion’s PE Tutorial
IMAGE_DOS_HEADER:                               ;start : 00 (0) to 3F (63)
        .e_magic        dw      0x5A4D          ;00 01
        .e_cblp         dw      0x0080          ;02 03
        .e_cp           dw      0x0001          ;04 05
        .e_crlc         dw      0x0000          ;06 07
        .e_cparhdr      dw      0x0004          ;08 09
        .e_minalloc     dw      0x0010          ;10 11
        .e_maxalloc     dw      0xFFFF          ;12 13
        .e_ss           dw      0x0000          ;14 15
        .e_sp           dw      0x0140          ;16 17
        .e_csum         dw      0x0000          ;18 19
        .e_ip           dw      0x0000          ;20 21
        .e_cs           dw      0x0000          ;22 23
        .e_lfarlc       dw      0x0040          ;24 25
        .e_ovno         dw      0x0000          ;26 27
        .e_res          rw      4               ;28 29 | 30 31 | 32 33 | 34 35
        .e_oemid        dw      0x0000          ;36 37
        .e_oeminfo      dw      0x0000          ;38 39
        .e_res2         rw      10              ;40 41 | 42 43 | 44 45 | 46 47 | 48 49 | 50 51
        .e_lfanew       dd      0x00000080      ;52 53 | 54 55 | 56 57 | 58 59
                                                ;60 61 62 63
;=====================================================================================================
DOS_STUB:                               ;start : 40 (64) to 7F (127)
        use16                           ;DOS-STUB is a 16-bit program
                                        ;push   cs <- we save 1 byte here
                                        ;pop    ds <- we save another 1 byte here
                                        ;our DS is less 100h from CS, DS received PSP address
        mov     dx,0x100 + 0x0B         ;our db message starts at 0x0B because we save 3 bytes already
        mov     ah,0x9
        int     0x21
        mov     ah,0x4C                 ;save 1 byte here because we need to use AH only for function
        int     0x21
        
        db      ‘This program cannot be run in DOS mode.’,13,10,’$’
        rb      0x80 – $                ;0x80 – 0x75 = rb 0xB
;=====================================================================================================
IMAGE_NT_HEADERS:                                       ;start : 80 (128) to 1EF (495)
        .Signature                              db      ‘PE’,0,0                ;128 131
        
        IMAGE_FILE_HEADER:                              ;start : 84 (132) to 97 (151)
                .Machine                        dw      0x014C                  ;132 133 for intel 386
                .NumberOfSection                dw      0x0003                  ;134 135
                .TimeDateStamp                  dd      %t                      ;136 139
                .PointerToSymbolTable           dd      0                       ;140 143
                .NumberOfSymbols                dd      0                       ;144 147
                .SizeOfOptionalHeader           dw      0x00E0                  ;148 149
                .Characteristic                 dw      0x818F                  ;150 151
        
        IMAGE_OPTIONAL_HEADER:                  ;start  : 98 (152) to F7 (247) * till IMAGE_DATA_DIRECTORY
                                                                                ;offset
                .Magic                                  dw      0x010B          ;152 153
                .MajorLinkerVersion                     db      0x01            ;154
                .MinorLinkerVersion                     db      0x37            ;155
                .SizeOfCode                             dd      0               ;156 159
                .SizeOfInitializedData                  dd      0               ;160 163
                .SizeOfUninitializedData                dd      0               ;164 167
                .AddressOfEntryPoint                    dd      0x2000          ;168 171 = base + 2000 = 402000 (.code section)
                .BaseOfCode                             dd      0               ;172 175
                .BaseOfData                             dd      0               ;176 179
                .ImageBase                              dd      0x00400000      ;180 183 (default)
                .SectionAlignment                       dd      0x00001000      ;184 187 4096 bytes
                .FileAlignment                          dd      0x00000200      ;188 191 512 bytes (default)
                .MajorOperatingSystemVersion            dw      1               ;192 193
                .MinorOperatingSystemVersion            dw      0               ;194 195
                .MajorImageVersion                      dw      0               ;196 197
                .MinorImageVersion                      dw      0               ;198 199
                .MajorSubsystemVersion                  dw      4               ;200 201
                .MinorSubsystemVersion                  dw      0               ;202 203
                .Win32VersionValue                      dd      0               ;204 207
                .SizeOfImage                            dd      0x00004000      ;208 211
                .SizeOfHeaders                          dd      0x00000200      ;212 215
                .CheckSum                               dd      0x0000EF20      ;216 219
                .Subsystem                              dw      2               ;220 221 IMAGE_SUBSYSTEM_WINDOWS_GUI
                .DllCharacteristics                     dw      0               ;222 223
                .SizeOfStackReserve                     dd      0x00001000      ;224 227 4096 bytes
                .SizeOfStackCommit                      dd      0x00001000      ;228 231 4096 bytes
                .SizeOfHeapReserve                      dd      0x00100000      ;232 235 1048576 bytes
                .SizeOfHeapCommit                       dd      0               ;236 239
                .LoaderFlags                            dd      0               ;240 243
                .NumberOfRvaAndSizes                    dd      0x10            ;244 247 16 decimal
                
                IMAGE_DATA_DIRECTORY:           ;start : F8 (248) to 177 (375) * till IMAGE_SECTION_TABLE
                                                        rq      1                ;248 255
                        .ImportTableVA                  dd      0x00003000       ;256 263
                        .ImportTableSize                dd      0x00000090
                                                        rq      14               ;we don’t need them also        ;263 + 112 = 375
                IMAGE_SECTION_TABLE:            ;start : 178 (376) to 1EF (495)
                        SECTION_1:
                                .Name                   dq      ‘.data’ ;start : 178 (376)
                                .VirtualSize            dd      0x0000001D
                                .VirtualAddress         dd      0x00001000      ;-> in memory, it is 401000
                                .SizeOfRawData          dd      0x00000200 
                                .PointerToRawData       dd      0x00000200      ;-> in our file, it is 0x200 (512) (offset from zero)
                                .PointerToRelocations   dd      0
                                .PointerToLineNumbers   dd      0
                                .NumberOfRelocations    dw      0
                                .NumberOfLineNumbers    dw      0
                                .Characteristic         dd      0xC0000040      ;end   : 19F (415)
                        SECTION_2:
                                .Name                   dq      ‘.code’ ;start : 1A0 (416)
                                .VirtualSize            dd      0x0000001C
                                .VirtualAddress         dd      0x00002000      ;-> in memory, it is 402000
                                .SizeOfRawData          dd      0x00000200
                                .PointerToRawData       dd      0x00000400      ;-> in our file, it is 0x400 (1024) (offset from zero)
                                .PointerToRelocations   dd      0
                                .PointerToLineNumbers   dd      0
                                .NumberOfRelocations    dw      0
                                .NumberOfLineNumbers    dw      0
                                .Characteristic         dd      0x60000020      ;end   : 1C7 (455)
                        SECTION_3:
                                .Name                   dq      ‘.idata’        ;start : 1C8 (456)
                                .VirtualSize            dd      0x00000090
                                .VirtualAddress         dd      0x00003000      ;-> in memory, it is 403000
                                .SizeOfRawData          dd      0x00000200
                                .PointerToRawData       dd      0x00000600      ;-> in our file, it is 0x600 (1536) (offset from zero)
                                .PointerToRelocations   dd      0
                                .PointerToLineNumbers   dd      0
                                .NumberOfRelocations    dw      0
                                .NumberOfLineNumbers    dw      0
                                .Characteristic         dd      0x40000040      ;end   : 1EF (495)
;                                                                                                  |
;our SECTION_1 points at 0x200 or (512) bytes from zero             |
;since we are currently in file offset 1EF  ——————————————-+
;we need to “rb 0xF” or “rq 2” so that our address from 1F0 to 1FF are filled.
                                                        rq      2               ;start : 1F0 (496) to 1FF (511)
                        
                        ;file offset   = 0x200
                        ;memory offset = 0x401000 = (IMAGE_OPTIONAL_HEADER.ImageBase) + (SECTION_1.VirtualAddress)
                        ;=========================================================================================
                        SECTION_1_RAW_DATA:                                     ;start : 200 (512) to 3FF (1023)
                        org 0x401000
                                msgText          db      ‘Message Text’,0       ;512 524 
                                                                                ;we use 1D (29) bytes here
                                msgCaption      db      ‘Message Caption’,0     ;;525 540
                                
                                ; 541 to 1023 should be filled
                                ; (1023 – 541) + 1 = 483 bytes
                                
                                ; we NEED to + 1 because 1023 is not INCLUDED when
                                ; we use it to minus 541.
                                rb      483                                     ;because our .code raw data start at 400 (1024)
                                                                                ;and because our IMAGE_OPTIONAL_HEADER > FileAlignment is 0x200 (512) bytes
                        ;file offset   = 0x400
                        ;memory offset = 0x402000 = (IMAGE_OPTIONAL_HEADER.ImageBase) + (SECTION_2.VirtualAddress)
                        ;=========================================================================================
                        org 0x2000
                        SECTION_2_RAW_DATA:                                                     ;start : 400 (1024) to 5FF (1535)
                                use32                                                           ;we are using 32-bit instruction
                                push    0x40                    ;6A 40                          ;MB_OK + MB_ICONASTERIK + MB_APPLMODAL
                                push    msgCaption              ;68 0D 10 40 00                 ;push msgCaption
                                push    msgText                 ;68 00 00 40 00                 ;push msgText
                                push    0                       ;6A 00                          ;push HWND_DESKTOP
                                call    dword [0x0040307A]      ;FF 15 7A 30 40 00              ;call MessageBoxA
                                push    0                       ;6A 00                          ;push zero for ExitProcess parameter
                                call    dword [0x0040305C]      ;FF 15 5C 30 40 00              ;call ExitProcess
                                
                                ;we have used 1C (28) bytes here
                                ;1052 to 1535 should be filled
                                ;(1535 – 1052) + 1 = 484 bytes
                                rb      484
                        ;file offset   = 0x600
                        ;memory offset = 0x403000 = (IMAGE_OPTIONAL_HEADER.ImageBase) + (SECTION_3.VirtualAddress)
                        ;=========================================================================================
                        org 0x3000
                        SECTION_3_RAW_DATA:                                             ;start : 600 (1536) to 7FF (2047)
                                IMAGE_IMPORT_DESCRIPTOR_1:
                                        .OriginalFirstThunk     dd      0x00003054      ;3000 3003
                                        .TimeDateStamp  dd      0                       ;3004 3007
                                        .ForwarderChain dd      0                       ;3008 300B
                                        .Name                   dd      0x0000303C      ;300C 300F
                                        .FirstThunk             dd      0x0000305C      ;3010 3013
                                IMAGE_IMPORT_DESCRIPTOR_2:
                                        .OriginalFirstThunk     dd      0x00003072      ;3014 3017
                                        .TimeDateStamp          dd      0               ;3018 301B
                                        .ForwarderChain         dd      0               ;301C 301F
                                        .Name                   dd      0x00003049      ;3020 3023
                                        .FirstThunk             dd      0x0000307A      ;3024 3027
                                
                                                ;terminated with IMAGE_IMPORT_DESCRIPTIOR that filled with 0 zeros
                                rd      5       ;the structure size of IMAGE_IMPORT_DESCRIPTOR
                                                                                        ;3028 to 303B
                                
                        ;Our DLL Name
                        .KERNEL32       db      ‘KERNEL32.DLL’,0                        ;303C to 3048
                        .USER32         db      ‘USER32.DLL’,0                          ;3049 to 3053
                        IMAGE_THUNK_DATA32_1:
                                .ForwarderString        dd      0x00003064              ;3054 3057
                                .Function               dd      0                       ;3058 305B
                                .Ordinal                dd      0x00003064              ;305C 305F
                                .AddressOfData          dd      0                       ;3060 3063
                                IMAGE_IMPORT_BY_NAME_1:
                                        .Hint           dw      0                       ;3064 3065
                                        .Name           db      ‘ExitProcess’,0         ;3066 3071
                        IMAGE_THUNK_DATA32_2:
                                .ForwarderString        dd      0x00003082              ;3072 3075
                                .Function               dd      0                       ;3076 3079
                                .Ordinal                dd      0x00003082              ;307A 307D
                                .AddressOfData          dd      0                       ;307E 3081
                                IMAGE_IMPORT_BY_NAME_2:
                                        .Hint           dw      0                       ;3082 3083
                                        .Name           db      ‘MessageBoxA’,0         ;3084 308F
                        ;308F = 143 bytes used
                        ;must filled 2047 – (1536 + 143) = 368 + 1 = 369 bytes
                        rb 367
                        db 0

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s