Einzelnen Beitrag anzeigen

Kas Ob.
Online

Registriert seit: 3. Sep 2023
346 Beiträge
 
#11

AW: NASM - Erstellung eines Win64-Bit Images für die Verwendung mit mehr als 2 Funcca

  Alt 31. Okt 2023, 15:55
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:
; 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
        I_ExitProcess:  
            dw               0 
            db               'ExitProcess', 0
            align            2 , db
        I_GetStdHandle:
            dw               0 
            db               'GetStdHandle', 0
         align            2 , db
        I_MessageBoxA:
            dw               0 
            db               'MessageBoxA', 0
         align            2 , db
        I_MessageBoxW:
            dw               0 
            db               'MessageBoxW', 0
         align            2 , db
        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
   content:
         db "ABCDEFGHIJKL", 0
         align            2 , db 0    
   TITLE_W:         
         dw u("Hello World !!! in Unicode"),0
         align            2 , db
   CONTENT_W:
         db u("ABCDEFGHIJKL"), 0
         align            2 , db
   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 --
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.

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
  Mit Zitat antworten Zitat