x64 汇编 - Windows 平台输出 Hello World!

admin 2024年3月23日18:26:31评论6 views字数 1315阅读4分23秒阅读模式
需要用到以下几个函数:

· GetStdHandle

检索指定标准设备的句柄(标准输入、标准输出或标准错误)

HANDLE WINAPI GetStdHandle(  _In_ DWORD nStdHandle // 标准设备);

https://learn.microsoft.com/zh-cn/windows/console/getstdhandle

· WriteFile

将数据写入指定的文件或输入/输出 (I/O) 设备

BOOL WriteFile(  [in]                HANDLE       hFile, // 文件或 I/O 设备的句柄  [in]                LPCVOID      lpBuffer, // 要写入的数据缓冲区  [in]                DWORD        nNumberOfBytesToWrite, // 要写入的字节数  [out, optional]     LPDWORD      lpNumberOfBytesWritten, // 接收写入的字节数  [in, out, optional] LPOVERLAPPED lpOverlapped // 指向 OVERLAPPED 结构的指针);

https://learn.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-writefile

· ExitProcess
结束调用进程及其所有线程
void ExitProcess(  [in] UINT uExitCode // 进程和所有线程的退出代码);
汇编代码编写:
format PE64 consoleentry start
include 'win64a.inc'include 'apikernel32.inc'
section '.data' data readable writeablemessage db 'Hello World!',0;要在控制台上显示的消息message_length = $-message;计算消息长度,在写入控制台时知道写多少
section '.text' code readable executablestart: push rbp ;保存基指针 mov rbp, rsp ;设置新的基指针
mov rcx, -11 ;-11 表示程序运行时的标准输出流,通常是控制台窗口 call [GetStdHandle] ;调用 GetStdHandle(STD_OUTPUT_HANDLE),会返回一个句柄 ;这个句柄可以用于控制台输出相关的函数,如 WriteFile mov rcx, rax lea rdx, [message] mov r8d, message_length lea r9, [rsp+4*8] mov qword[rsp+5*8], 0 call [WriteFile] ;调用 WriteFile 将 Hello World! 写入控制台 mov ecx, eax call [ExitProcess] ;调用 ExitProcess 结束程序 leave ;恢复基指针和栈指针
section '.idata' import data readable writeablelibrary kernel32,'KERNEL32.DLL'

x64 汇编 - Windows 平台输出 Hello World!

原文始发于微信公众号(走在网安路上的哥布林):x64 汇编 - Windows 平台输出 Hello World!

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年3月23日18:26:31
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   x64 汇编 - Windows 平台输出 Hello World!http://cn-sec.com/archives/2598347.html

发表评论

匿名网友 填写信息