查看: 438|回复: 3

[C/C++] 【WINAPI】浅谈使用CreateProcess创建进程

[复制链接]

0

技术

9

魅力

1

原创

版主

禁止访问

Rank: 7Rank: 7Rank: 7

积分
7680
人气
176
分享
52

最佳新人活跃会员

发表于 2023-9-1 21:44:31 | 显示全部楼层 |阅读模式
本帖最后由 蒟蒻 于 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";
    }

你学会了吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

评分

参与人数 1人气 +4 收起 理由
xiaomeng + 4

查看全部评分

小菜鸡一枚~
Gitee主页:https://gitee.com/juruoqwq

0

技术

0

魅力

0

原创

略有小成

Rank: 4

积分
1194
人气
11
分享
0
发表于 2023-9-1 22:26:53 | 显示全部楼层
学废了!

4

技术

17

魅力

6

原创

版主

禁止发言

Rank: 7Rank: 7Rank: 7

积分
5367
人气
208
分享
36

最佳新人活跃会员

发表于 2023-9-1 23:13:10 | 显示全部楼层
火绒的专杀工具也是这样的,动态释放tmp文件并加载,tmp文件就是驱动
进程创建的本质是将文件中的内容加载至内存空间,并执行相应内存中的代码
如果想要实现与文中一样的效果,也可以使用cmd窗口键入无法直接执行的文件的文件名来执行(例如无法执行的文件是d.tmp,那么就在cmd窗口直接输入d.tmp)
以下图片展示了一个使用copy命令复制net.exe为asd.txt,并在cmd命令窗口正常执行它的实例

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

评分

参与人数 1经验 +20 收起 理由
蒟蒻 + 20 很给力!

查看全部评分

YF工作室驻x64论坛分部
工作室曾开发的软件:YFSafe安全软件,YFChat在线聊天软件,MBRTools等。
欢迎有能力的你加入我们一起共同进步。请发邮件至yfstudio2021@outlook.com

0

技术

0

魅力

0

原创

略知一二

Rank: 3Rank: 3

积分
993
人气
3
分享
0
发表于 2023-9-14 12:34:54 | 显示全部楼层
会了但没有完全会6
个人主页:https://blog.zgrhlsmyms.repl.co
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表