我想创建一个Windows 10/11 Pro 64位汇编源代码,可以通过YASM汇编程序进行,以形成尽可能小的Windows可执行文件(.exe应用程序)。GitHub下的资源:corkami。
但我不知道哪一个是最好的64位。解决方案应该包含汇编文本/代码与注解,解释如何做到这一点。
例如:“你必须为多个作为一个符号设置IAT”...解决方案应该是“不”与其他工具链链接。这意味着:C:\yasm -f bin -o output.exe input.asm
。
作为奖励,源代码应该用C:\nasm -f bin -o output.exe input.asm
编译。
在答案中,只需显示方式/步骤,显示 MessageBox 和 *ExitProcess * 调用即可。
可选,__imp__ShowMessageBoxA是来自FPC(Free-Pascal-Footer)Windows .DLL库文件的导出符号。程序集应包含以下代码段:
EntryPoint:
sub rsp, 4 * 8
mov ecx, 0 // HWND
mov rdx, [lpText] // LPCTSTR
mov r8, [lpCapt] // LPCTSTR
mov r9d, 2 // UINT
call [__imp__ShowMessageBoxA]
xor ecx, ecx
call [__imp__ExitProcess]
lpText db "this and that", 0
lpCapt db "Caption", 0
hnExitProcess:
dw 0
db 'ExitProcess', 0
hnShowMessageBoxA:
dw 0
db 'ShowMessageBoxA', 0
字符串
我试着用corkami的例子,但是我迷路了。
我尝试使用yasm.exe -f bin或nasm.exe -f bin创建平面二进制文件,这不会给我带来任何错误。yasm -f bin output.exe的结果是Windows Loader消息:“在output.exe中找不到Symbol ShowMessageBoxA”。我创建了一个由FPC(Free Pascal编译器)使用C:\fpc kalle32.pas形成的.DLL:
library kalle32;
uses Windows;
procedure ShowMessageA(h: HWND; t,c: LPCTSTR; u: UINT); stdcall; export;
begin
// this will not show
MessageBoxA(h,t,c,u);
end;
begin
// this message box will not display on start up on DLL load
MessageBoxA(0,'Test Message','Caption',0);
end.
型
我想编写汇编代码,可以在命令行/控制台/终端下使用yasm.exe或nasm.exe编译为可执行文件。
@Margaret Bloom:最小/完整的复制示例是这样的:
BITS 64
%define align(n,r) (((n+(r-1))/r)*r)
; DOS Header
dw 'MZ' ; e_magic
dw 0 ; [UNUSED] e_cblp
dw 0 ; [UNUSED] c_cp
dw 0 ; [UNUSED] e_crlc
dw 0 ; [UNUSED] e_cparhdr
dw 0 ; [UNUSED] e_minalloc
dw 0 ; [UNUSED] e_maxalloc
dw 0 ; [UNUSED] e_ss
dw 0 ; [UNUSED] e_sp
dw 0 ; [UNUSED] e_csum
dw 0 ; [UNUSED] e_ip
dw 0 ; [UNUSED] e_cs
dw 0 ; [UNUSED] e_lfarlc
dw 0 ; [UNUSED] e_ovno
times 4 dw 0 ; [UNUSED] e_res
dw 0 ; [UNUSED] e_oemid
dw 0 ; [UNUSED] e_oeminfo
times 10 dw 0 ; [UNUSED] e_res2
dd pe_hdr ; e_lfanew
; PE Header
pe_hdr:
dw 'PE', 0 ; Signature
; Image File Header
dw 0x8664 ; Machine
dw 0x01 ; NumberOfSections
dd 0 ; [UNUSED] TimeDateStamp
dd 0 ; PointerToSymbolTable
dd 0 ; NumberOfSymbols
dw opt_hdr_size ; SizeOfOptionalHeader
dw 0x22 ; Characteristics
; Optional Header, COFF Standard Fields
opt_hdr:
dw 0x020b ; Magic (PE32+)
db 0x0e ; MajorLinkerVersion
db 0x16 ; MinorLinkerVersion
dd code_size ; SizeOfCode
dd 0 ; SizeOfInitializedData
dd 0 ; SizeOfUninitializedData
dd entry ; AddressOfEntryPoint
dd iatbl ; BaseOfCode
; Optional Header, NT Additional Fields
dq 0x000140000000 ; ImageBase
dd 0x10 ; SectionAlignment
dd 0x10 ; FileAlignment
dw 0x06 ; MajorOperatingSystemVersion
dw 0 ; MinorOperatingSystemVersion
dw 0 ; MajorImageVersion
dw 0 ; MinorImageVersion
dw 0x06 ; MajorSubsystemVersion
dw 0 ; MinorSubsystemVersion
dd 0 ; Reserved1
dd file_size ; SizeOfImage
dd hdr_size ; SizeOfHeaders
dd 0 ; CheckSum
dw 0x02 ; Subsystem (Windows GUI)
dw 0x8160 ; DllCharacteristics
dq 0x100000 ; SizeOfStackReserve
dq 0x1000 ; SizeOfStackCommit
dq 0x100000 ; SizeOfHeapReserve
dq 0x1000 ; SizeOfHeapCommit
dd 0 ; LoaderFlags
dd 0x02 ; NumberOfRvaAndSizes
; Optional Header, Data Directories
dd 0 ; Export, RVA
dd 0 ; Export, Size
dd itbl ; Import, RVA
dd itbl_size ; Import, Size
opt_hdr_size equ $-opt_hdr
; Section Table
section_name db '.' ; Name
times 8-($-section_name) db 0
dd sect_size ; VirtualSize
dd iatbl ; VirtualAddress
dd code_size ; SizeOfRawData
dd iatbl ; PointerToRawData
dd 0 ; PointerToRelocations
dd 0 ; PointerToLinenumbers
dw 0 ; NumberOfRelocations
dw 0 ; NumberOfLinenumbers
dd 0x60000020 ; Characteristics
hdr_size equ $-$$
code:
; Import Address Directory
iatbl:
dq symbol
dq 0
iatbl_size equ $-iatbl
; Strings
title:
db "Hallo Welt !!!", 0
content:
db "ABCDEFGHIJKL", 0
; Entry
entry:
; the comment block there are my interest in - why does it not work
mov r9d, 0x00240040 ; uType
lea r8, [rel title] ; lpCaption
lea rdx, [rel content] ; lpText
xor ecx, ecx ; hWnd
jmp [rel iatbl] ; MessageBoxN
times align($-$$,16)-($-$$) db 0xcc
; Import Directory
itbl:
dq intbl ; OriginalFirstThunk
dd 0 ; TimeDateStamp
dd dll_name ; ForwarderChain
dd iatbl ; Name
dq 0 ; FirstThunk
itbl_size equ $-itbl
; Import Name Table
intbl:
dq symbol
dq 0
; Symbol
symbol:
dw 0x0294 ; [UNUSED] Function Order
db 'MessageBoxA', 0 ; Function Name
dll_name:
db 'USER32.dll', 0
db 0
sect_size equ $-code
times align($-$$,16)-($-$$) db 0
code_size equ $-code
file_size equ $-$$
型
我会扩展上面的汇编脚本,这样我就可以使用多个win32 api函数。所以,我会在上面现有代码的基础上使用第二个,第三个,.
1条答案
按热度按时间aiazj4mn1#
下面的代码将做我想要的。它可以用NASM编译,并且它(生成的平面图像可执行文件.EXE)显示了Microsoft文档中描述的Ansi-和MessageBoxA/W的Unicode版本。这可以用于使用NASM组装动态创建平面图像。
字符串