转储一个二进制exe到十六进制并嵌入到c++文件导致执行错误
Dump a binary exe to hexadecimal and embed it into c++ file leads to execution error
我正在使用 xxd 将 relec 恶意软件样本转储为十六进制,以将其嵌入到 c++ 文件中并使用 createprocess 执行它。当我得到十六进制 relec 文件时,我将它复制到一个数组并将其写入磁盘。我调用 createprocess 来执行 relec 可执行文件,但我收到以下错误消息:“该程序不能 运行 因为它与 64 位 Windows 版本不兼容...”。也许问题是使用 xxd 修改了恶意软件的内容。我也尝试过在线对话,但它未能显示相同的消息。如果使用 createprocess 调用原始 exe,它可以工作,但我需要将其嵌入。我使用 Linux 来使用 xxd 并在 windows 10 中使用生成的转储。我使用的 IDE 是 visual studio community 2019。这是代码:
unsigned char relec[] = {
0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00...
void main(){
FILE* f = fopen("relec", "w");
fwrite(relec, sizeof(relec), 1, f);
fclose(f);
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcessA("relec", // No module name (use command line)
NULL, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return;
}
}
我更改了fopen写入模式。相反,我按照@TedLyngmo 的建议使用了写入二进制模式。谢谢大家的回答。
我正在使用 xxd 将 relec 恶意软件样本转储为十六进制,以将其嵌入到 c++ 文件中并使用 createprocess 执行它。当我得到十六进制 relec 文件时,我将它复制到一个数组并将其写入磁盘。我调用 createprocess 来执行 relec 可执行文件,但我收到以下错误消息:“该程序不能 运行 因为它与 64 位 Windows 版本不兼容...”。也许问题是使用 xxd 修改了恶意软件的内容。我也尝试过在线对话,但它未能显示相同的消息。如果使用 createprocess 调用原始 exe,它可以工作,但我需要将其嵌入。我使用 Linux 来使用 xxd 并在 windows 10 中使用生成的转储。我使用的 IDE 是 visual studio community 2019。这是代码:
unsigned char relec[] = {
0x4d, 0x5a, 0x90, 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
0xff, 0xff, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00...
void main(){
FILE* f = fopen("relec", "w");
fwrite(relec, sizeof(relec), 1, f);
fclose(f);
STARTUPINFOA si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(si));
si.cb = sizeof(si);
ZeroMemory(&pi, sizeof(pi));
if (!CreateProcessA("relec", // No module name (use command line)
NULL, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return;
}
}
我更改了fopen写入模式。相反,我按照@TedLyngmo 的建议使用了写入二进制模式。谢谢大家的回答。