; win64.asm
SECTIONS equ 2
TIME_DATE equ 0
IMAGE_BASE equ 0x000140000000 ;0x400000 ; org
SECTION_ALIGNMENT equ 0x200
FILE_ALIGNMENT equ 0x200
BSS_SIZE equ 0
%define nagoa_round(size) ((size + SECTION_ALIGNMENT - 1) & ~(SECTION_ALIGNMENT - 1))
bits 64
org IMAGE_BASE
section .text
;;******************************************************************************************************
;; if the header is part of the image, define it as section .text because .text is put
;; first in the image, and rename the code section as section .code
header:
dw "MZ" ; e_magic
dw 0 ; e_cblp
dw 0 ; e_cp
dw 0 ; e_crlc
dw 0 ; e_cparhdr
dw 0 ; e_minalloc
dw 0 ; e_maxalloc
dw 0 ; e_ss
dw 0 ; e_sp
dw 0 ; e_csum
dw 0 ; e_ip
dw 0 ; e_cs
dw 0 ; e_lsarlc
dw 0 ; e_ovno
dq 0 ; e_res
dw 0 ; e_oemid
dw 0 ; e_oeminfo
dd 0,0,0,0,0 ; e_res2
dd imageHeader - IMAGE_BASE ; e_lfanew
imageHeader:
dd "
PE" ; Signature
dw 0x8664 ; Machine
dw SECTIONS ; NumberOfSections
dd TIME_DATE ; TimeDateStamp
dd 0 ; PointerToSymbolTable
dd 0 ; NumberOfSymbols
dw optionalHeader.SIZE ; SizeOfOptionalHeader
dw 0x022 ; Characteristics
optionalHeader:
dw 0x20B ; Magic
db 0 ; MajorLinkerVersion
db 0 ; MinorLinkerVersion
dd nagoa_round(RAW_CODE.SIZE) ; SizeOfCode
dd nagoa_round(RAW_DATA.SIZE) ; SizeOfInitializedData
dd nagoa_round(BSS_SIZE) ; SizeOfUninitializedData
dd entryPoint ; AddressOfEntryPoint
dd code ; BaseOfCode
;dd data - IMAGE_BASE ; BaseOfData
dq IMAGE_BASE ; ImageBase
dd SECTION_ALIGNMENT ; SectionAlignment
dd FILE_ALIGNMENT ; FileAlignment
dw 4 ; MajorOperatingSystemVersion
dw 0 ; MinorOperatingSystemVersion
dw 0 ; MajorImageVersion
dw 0 ; MinorImageVersion
dw 4 ; MajorSubsystemVersion
dw 0 ; MinorSubsystemVersion
dd 0 ; Win32VersionValue
dd (RAW_HEADER.SIZE + RAW_CODE.SIZE + RAW_DATA.SIZE); SizeOfImage
dd RAW_HEADER.SIZE ; SizeOfHeaders
dd 0 ; CheckSum
dw 2 ; Subsystem
dw 0 ; DllCharacteristics
dq 0x40000 ; SizeOfStackReserve
dq 0x6000 ; SizeOfStackCommit
dq 0x100000 ; SizeOfHeapReserve
dq 0x1000 ; SizeOfHeapCommit
dd 0 ; LoaderFlags
dd 16 ; NumberOfRvaAndSizes
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_EXPORT
dd Import_Directory_Table, Import_Directory_Table_Size ; IMAGE_DIRECTORY_ENTRY_IMPORT
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_RESOURCE
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_EXCEPTION
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_SECURITY
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_BASERELOC
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_DEBUG
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_COPYRIGHT
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_GLOBALPTR
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_TLS
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_LOAD_CONFIG
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT
;dd Import_Address_Table, Import_Address_Table_Size ; IMAGE_DIRECTORY_ENTRY_IAT
dd 0,0
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT
dd 0, 0 ; IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR
dd 0, 0 ; reserved
optionalHeader.SIZE equ $ - optionalHeader
sectionHeaders:
db ".text", 0, 0, 0 ; Name
dd nagoa_round(RAW_CODE.SIZE) ; VirtualSize
dd code ; VirtualAddress
dd RAW_CODE.SIZE ; SizeOfRawData
dd RAW_CODE.OFFSET ; PointerToRawData
dd 0 ; PointerToRelocations
dd 0 ; PointerToLinenumbers
dw 0 ; NumberOfRelocations
dw 0 ; NumberOfLinenumbers
dd 0x60000020 ; Characteristics
db ".data", 0, 0, 0 ; Name
dd nagoa_round(RAW_DATA.SIZE) ; VirtualSize
dd data ; VirtualAddress
dd RAW_DATA.SIZE ; SizeOfRawData
dd RAW_DATA.OFFSET ; PointerToRawData
dd 0 ; PointerToRelocations
dd 0 ; PointerToLinenumbers
dw 0 ; NumberOfRelocations
dw 0 ; NumberOfLinenumbers
dd 0xC0000040 ; Characteristics
align FILE_ALIGNMENT,
db 0
RAW_HEADER.SIZE equ $ - header
;;******************************************************************************************************
;; F I R S T . c o d e S E C T I O N
;;******************************************************************************************************
VS_CODE EQU ( ( ( 1 + ( (RAW_HEADER.SIZE-1) >> 12 ) ) * SECTION_ALIGNMENT ) )
section .code vstart=VS_CODE
code:
entryPoint:
mov rcx,500
call [rel Sleep]
mov r9d, 0x00240040 ; uType
lea r8, [rel title] ; lpCaption
lea rdx, [rel content] ; lpText
xor ecx, ecx ; hWnd
call [rel MessageBoxA]
mov rcx,500
call [rel Sleep]
mov r9d, 0x00240040 ; uType
lea r8, [rel TITLE_W] ; lpCaption
lea rdx, [rel CONTENT_W] ; lpText
xor ecx, ecx ; hWnd
call [rel MessageBoxW]
jmp [rel ExitProcess]
align SECTION_ALIGNMENT,
db 0
;;******************************************************************************************************
;; F I R S T . d a t a S E C T I O N
;;******************************************************************************************************
VS_DATA EQU ( VS_CODE + ( ( 1 + ( (RAW_CODE.SIZE-1) >> 12 ) ) * SECTION_ALIGNMENT ) )
section .data vstart=VS_DATA
data :
Import_Address_Table:
DLL_1:
Sleep: dq I_Sleep
ExitProcess: dq I_ExitProcess
GetStdHandle: dq I_GetStdHandle
dq 0
DLL_2:
MessageBoxA dq I_MessageBoxA
MessageBoxW dq I_MessageBoxW
dq 0
Import_Address_Table_Size equ $ - Import_Address_Table
align 0x20,
db 0
Import_Directory_Table:
KERNEL32.originalfthk dd DLL_1_thunk_table
KERNEL32.timedate dd 0
KERNEL32.forwarder dd 0
KERNEL32.name dd dll_name_1
KERNEL32.firstthunk dd DLL_1
USER32.originalfthk dd DLL_2_thunk_table
USER32.timedate dd 0
USER32.forwarder dd 0
USER32.name dd dll_name_2
USER32.firstthunk dd DLL_2
align 0x20,
db 0 ; should be always at the end of Import_Directory_Table
Import_Directory_Table_Size equ $ - Import_Directory_Table
DLL_1_thunk_table :
dq I_Sleep
dq I_ExitProcess
dq I_GetStdHandle
dq 0
DLL_2_thunk_table :
dq I_MessageBoxA
dq I_MessageBoxW
dq 0
I_Sleep:
dw 0
db 'Sleep', 0
align 2 ,
db 0
I_ExitProcess:
dw 0
db 'ExitProcess', 0
align 2 ,
db 0
I_GetStdHandle:
dw 0
db 'GetStdHandle', 0
align 2 ,
db 0
I_MessageBoxA:
dw 0
db 'MessageBoxA', 0
align 2 ,
db 0
I_MessageBoxW:
dw 0
db 'MessageBoxW', 0
align 2 ,
db 0
dll_name_1:
db 'kernel32.dll', 0
dll_name_2:
db 'user32.dll', 0
STRING_TABLE:
%define u(x) __?utf16le?__(x)
%define w(x) __?utf32le?__(x)
title:
db "Hello world !!!", 0
align 2 ,
db 0
content:
db "ABCDEFGHIJKL", 0
align 2 ,
db 0
TITLE_W:
dw u("Hello World !!! in
Unicode"),0
align 2 ,
db 0
CONTENT_W:
db u("ABCDEFGHIJKL"), 0
align 2 ,
db 0
align SECTION_ALIGNMENT,
db 0
;;******************************************************************************************************
;; L A S T . c o d e S E C T I O N
;;******************************************************************************************************
section .code
align FILE_ALIGNMENT,
db 0
RAW_CODE.OFFSET equ RAW_HEADER.SIZE
RAW_CODE.SIZE equ $ - $$
;;******************************************************************************************************
;; L A S T . d a t a S E C T I O N
;;******************************************************************************************************
section .data
align FILE_ALIGNMENT,
db 0
RAW_DATA.OFFSET equ RAW_CODE.OFFSET + RAW_CODE.SIZE
RAW_DATA.SIZE equ $ - $$
;;******************************************************************************************************
IMAGE_END equ $
;; -- eof --