Skip to content

怎么使用 Metasploit::Framework::Compiler::Windows 编译 C 代码

L edited this page May 22, 2022 · 1 revision

本业内容

Metasploit::Framework::Compiler::WindowsMetasm 的包装器, 专门用于为 Windows 平台编译 C 代码. 包装器的目的是支持默认头文件, 例如 stdio.h、stdio.h、String.h、Windows.h 或你在用 C 编写时可能使用的其他一些重要头文件.

EXE 示例

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)

DLL 示例

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() 这样的方法实际上不会打印任何东西, 因为它没有连接到标准输出. 如果你想使用 printf() 进行调试, 请考虑使用 OutputDebugStringMessageBox.

定义头文件

目前, 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)
Clone this wiki locally