|
Registriert seit: 3. Sep 2023 412 Beiträge |
#11
AW: NASM - Erstellung eines Win64-Bit Images für die Verwendung mit mehr als 2 Funcca![]()
This is working and i added few imports not used but for the sake of example to replicate, and hope it is clear
Code:
nasm -f bin Win64.asm -o Win64.exe
Code:
It can use some cleaning, and it is two sections instead of one, this will minimize the confliction in page protection, but you can remove one and consolidate them in one section.
; 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 -- ps. i liked the idea of generating an EXE in from one file, no linker and no library, you called it flat and indeed seems flat, it was nice journey.
Kas
|
![]() |
Ansicht |
![]() |
![]() |
![]() |
ForumregelnEs ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.
BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus. Trackbacks are an
Pingbacks are an
Refbacks are aus
|
|
Nützliche Links |
Heutige Beiträge |
Sitemap |
Suchen |
Code-Library |
Wer ist online |
Alle Foren als gelesen markieren |
Gehe zu... |
LinkBack |
![]() |
![]() |