本帖最后由 蒟蒻 于 2023-9-1 21:47 编辑
【引言】
众所周知,我们双击EXE文件即可打开它
TMP格式的文件正常情况是无法打开的
但是,如果我说这个TMP文件是PE格式并且可以运行呢?
(homo.tmp源码)
[C] 纯文本查看 复制代码 #include <stdio.h>
int main()
{
printf("114514\n");
}
这是怎么实现的呢?
【具体实现】
我们可以使用WINAPI中的CreateProcessA函数,其原型如下:
[C] 纯文本查看 复制代码 WINBASEAPI
BOOL
WINAPI
CreateProcessA(
_In_opt_ LPCSTR lpApplicationName,
_Inout_opt_ LPSTR lpCommandLine,
_In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes,
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes,
_In_ BOOL bInheritHandles,
_In_ DWORD dwCreationFlags,
_In_opt_ LPVOID lpEnvironment,
_In_opt_ LPCSTR lpCurrentDirectory,
_In_ LPSTARTUPINFOA lpStartupInfo,
_Out_ LPPROCESS_INFORMATION lpProcessInformation
);
我们需要关注的就是lpCommandLine,lpStartupInfo和lpProcessInformation
lpCommandLine => PE文件的绝对位置
lpStartupInfo => 指向启动信息的指针
lpProcessInformation => 指向进程信息的指针
lpStartupInfo和lpProcessInformation可以使用如下方法初始化
[C] 纯文本查看 复制代码 STARTUPINFO startInfo;
PROCESS_INFORMATION processInfo;
ZeroMemory(&startInfo, sizeof(startInfo));
startInfo.cb = sizeof(startInfo);
ZeroMemory(&processInfo, sizeof(processInfo));
接下来,我们可以调用CreateProcess了!
[C] 纯文本查看 复制代码 if (!CreateProcessA(0,
(LPSTR) "\"F:\\Projects\\Cplusplus Project\\Sample\\x64\\Debug\\Homo.tmp\"", // 命令行参数,使用完整的路径
0,
0,
0,
0,
0,
0,
(LPSTARTUPINFOA) &startInfo,
&processInfo)
) {
std::cerr << "CreateProcess failed (" << GetLastError() << ").\n";
return 1;
}
else {
std::cout << "Homo.tmp has been launched.\n";
}
说明:这里的lpCommandLine使用两个引号的原因是路径中有空格,可能产生安全漏洞(微软自知之明bushi)
并且这里的0有些是0,有些是NULL和FALSE,只要你不嫌麻烦,还是建议这样写
[C] 纯文本查看 复制代码 if (!CreateProcessA(NULL,
(LPSTR) "\"F:\\Projects\\Cplusplus Project\\Sample\\x64\\Debug\\Homo.tmp\"", // 命令行参数,使用完整的路径
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
(LPSTARTUPINFOA) &startInfo,
&processInfo)
) {
std::cerr << "CreateProcess failed (" << GetLastError() << ").\n";
return 1;
}
else {
std::cout << "Homo.tmp has been launched.\n";
}
你学会了吗?
|