forked from rapid7/metasploit-framework
-
Notifications
You must be signed in to change notification settings - Fork 3
怎么使用 Metasploit::Framework::Compiler::Windows 编译 C 代码
L edited this page May 22, 2022
·
1 revision
Metasploit::Framework::Compiler::Windows
是 Metasm 的包装器, 专门用于为 Windows 平台编译 C 代码. 包装器的目的是支持默认头文件, 例如 stdio.h、stdio.h、String.h、Windows.h 或你在用 C 编写时可能使用的其他一些重要头文件.
c_template = %Q|#include <Windows.h>
int main(void) {
LPCTSTR lpMessage = "Hello World";
LPCTSTR lpTitle = "Hi";
MessageBox(NULL, lpMessage, lpTitle, MB_OK);
return 0;
}|
require 'metasploit/framework/compiler/windows'
## 另存为 exe 变量
exe = Metasploit::Framework::Compiler::Windows.compile_c(c_template)
## 将二进制文件保存为文件
Metasploit::Framework::Compiler::Windows.compile_c_to_file('/tmp/test.exe', c_template)
c_template = %Q|#include <Windows.h>
BOOL APIENTRY DllMain __attribute__((export))(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) {
switch (dwReason) {
case DLL_PROCESS_ATTACH:
MessageBox(NULL, "Hello World", "Hello", MB_OK);
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
// This will be a function in the export table
int Msg __attribute__((export))(void) {
MessageBox(NULL, "Hello World", "Hello", MB_OK);
return 0;
}
|
require 'metasploit/framework/compiler/windows'
dll = Metasploit::Framework::Compiler::Windows.compile_c(c_template, :dll)
要加载 DLL, 可以使用 LoadLibrary API:
#include <Windows.h>
#include <stdio.h>
int main(void) {
HMODULE hMod = LoadLibrary("hello_world.dll");
if (hMod) {
printf("hello_world.dll loaded\n");
} else {
printf("Unable to load hello_world.dll\n");
}
}
或者使用 rundll32 调用导出中的函数:
rundll32 hell_world.dll,Msg
像 printf()
这样的方法实际上不会打印任何东西, 因为它没有连接到标准输出. 如果你想使用 printf()
进行调试, 请考虑使用 OutputDebugString
或 MessageBox
.
目前, Metasm 包装器不支持来自任意位置的自定义标头. 要解决此问题, 你可以将标题放在 data/headers/windows
中, 然后将该文件名添加到 lib/metasploit/framework/compiler/headers/windows.h
中.
Metasploit::Framework::Compiler
支持在源代码级别随机化代码, 然后编译的混淆. 我们可以使用两种方法:
Metasploit::Framework::Compiler::Windows.compile_random_c
Metasploit::Framework::Compiler::Windows.compile_random_c_to_file
Metasploit::Framework::Compiler::Windows.compile_random_c_to_file 示例:
require 'msf/core'
require 'metasploit/framework/compiler/windows'
c_source_code = %Q|
#include <Windows.h>
int main() {
const char* content = "Hello World";
const char* title = "Hi";
MessageBox(0, content, title, MB_OK);
return 0;
}|
outfile = "/tmp/helloworld.exe"
weight = 70 # 该值用于确定代码的随机性
Metasploit::Framework::Compiler::Windows.compile_random_c_to_file(outfile, c_source_code, weight: weight)