在 Linux 上使用 mingw 交叉编译 MASM 语法程序集
Cross compile MASM-syntax assembly with mingw on Linux
我想在 Kali Linux.
上交叉编译 64 位 Windows 的 Metasploit 模板(汇编语言)
我正在尝试从程序集编译为 exe。
这是代码-
; Author: Stephen Fewer (stephen_fewer[at]harmonysecurity[dot]com)
; Architecture: x64
;
; Assemble and link with the following command:
; "C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\x86_amd64\ml64" template_x64_windows.asm /link /subsystem:windows /defaultlib:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64\kernel32.lib" /entry:main
extrn ExitProcess : proc
extrn VirtualAlloc : proc
.code
main proc
sub rsp, 40 ;
mov r9, 40h ;
mov r8, 3000h ;
mov rdx, 4096 ;
xor rcx, rcx ;
call VirtualAlloc ; lpPayload = VirtualAlloc( NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );
mov rcx, 4096 ;
mov rsi, payload ;
mov rdi, rax ;
rep movsb ; memcpy( lpPayload, payload, 4096 );
call rax ; lpPayload();
xor rcx, rcx ;
call ExitProcess ; ExitProcess( 0 );
main endp
payload proc
A byte 'PAYLOAD:'
B db 4096-8 dup ( 0 )
payload endp
end
我用的是w64-mingw32,我可以用命令i686-mingw32msvc-gcc xxx编译32位的c文件,但是我在编译64位汇编时遇到了问题
w64-mingw32 有很多不同的选项,我试了很多,都带有错误信息。老实说,自从有了 Commodore 64 之后我就没做过组装了。
我试过了:
x86_64-w64-mingw32-gcc -c template_x64_windows.asm -o file.o
错误信息是-
template_x64_windows.asm: linker input file unused because linking not done
我什至不知道哪个选项会编译程序集,我在网上查了 howt-o's,没有。
您可以安装 JWASM(相当兼容的 MASM assembler)到 assemble 64 位代码。使用 GIT 获取源代码,构建并安装它:
git clone https://github.com/JWasm/JWasm.git
cd JWasm
cmake .
cp jwasm /usr/local/bin
要安装,您可能需要 运行 在基于 Ubuntu 的发行版上使用 sudo
最后一个命令。
为了 assemble 你的代码到 64 位 COFF 对象文件 (.o
) 你使用:
jwasm -win64 template_x64_windows.asm
然后使用以下方法构建 Win64 PE 可执行文件:
x86_64-w64-mingw32-gcc template_x64_windows.o -o file.exe
我想在 Kali Linux.
上交叉编译 64 位 Windows 的 Metasploit 模板(汇编语言)我正在尝试从程序集编译为 exe。
这是代码-
; Author: Stephen Fewer (stephen_fewer[at]harmonysecurity[dot]com)
; Architecture: x64
;
; Assemble and link with the following command:
; "C:\Program Files\Microsoft Visual Studio 9.0\VC\bin\x86_amd64\ml64" template_x64_windows.asm /link /subsystem:windows /defaultlib:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Lib\x64\kernel32.lib" /entry:main
extrn ExitProcess : proc
extrn VirtualAlloc : proc
.code
main proc
sub rsp, 40 ;
mov r9, 40h ;
mov r8, 3000h ;
mov rdx, 4096 ;
xor rcx, rcx ;
call VirtualAlloc ; lpPayload = VirtualAlloc( NULL, 4096, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE );
mov rcx, 4096 ;
mov rsi, payload ;
mov rdi, rax ;
rep movsb ; memcpy( lpPayload, payload, 4096 );
call rax ; lpPayload();
xor rcx, rcx ;
call ExitProcess ; ExitProcess( 0 );
main endp
payload proc
A byte 'PAYLOAD:'
B db 4096-8 dup ( 0 )
payload endp
end
我用的是w64-mingw32,我可以用命令i686-mingw32msvc-gcc xxx编译32位的c文件,但是我在编译64位汇编时遇到了问题
w64-mingw32 有很多不同的选项,我试了很多,都带有错误信息。老实说,自从有了 Commodore 64 之后我就没做过组装了。
我试过了:
x86_64-w64-mingw32-gcc -c template_x64_windows.asm -o file.o
错误信息是-
template_x64_windows.asm: linker input file unused because linking not done
我什至不知道哪个选项会编译程序集,我在网上查了 howt-o's,没有。
您可以安装 JWASM(相当兼容的 MASM assembler)到 assemble 64 位代码。使用 GIT 获取源代码,构建并安装它:
git clone https://github.com/JWasm/JWasm.git
cd JWasm
cmake .
cp jwasm /usr/local/bin
要安装,您可能需要 运行 在基于 Ubuntu 的发行版上使用 sudo
最后一个命令。
为了 assemble 你的代码到 64 位 COFF 对象文件 (.o
) 你使用:
jwasm -win64 template_x64_windows.asm
然后使用以下方法构建 Win64 PE 可执行文件:
x86_64-w64-mingw32-gcc template_x64_windows.o -o file.exe