文章总结: 本文详细介绍了Windows系统中可用于进程创建的多种API函数,作为CreateProcess的替代方案以实现免杀效果。文中涵盖CreateProcessAsUserA、CreateProcessWithLogonW、WinExec及ShellExecute等函数,并附带C++验证代码。此外,作者提及WMI、COM等创建方式,并推广了专注于红队对抗与免杀技术的付费知识圈子。 综合评分: 75 文章分类: 免杀,红队,安全开发
【免杀思路】进程创建下可用API平替
原创
Hello888 Hello888
安全天书
2026年1月22日 14:15 广西
0x01 标准进程创建API函数
CreateProcess
BOOL CreateProcessA( [in, optional] LPCSTR lpApplicationName, [in, out, optional] LPSTR lpCommandLine, [in, optional] LPSECURITY_ATTRIBUTES lpProcessAttributes, [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes, [in] BOOL bInheritHandles, [in] DWORD dwCreationFlags, [in, optional] LPVOID lpEnvironment, [in, optional] LPCSTR lpCurrentDirectory, [in] LPSTARTUPINFOA lpStartupInfo, [out] LPPROCESS_INFORMATION lpProcessInformation);
验证代码
#include <windows.h>#include <stdio.h>#include <tchar.h>void _tmain(int argc, TCHAR* argv[]){ STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); if (argc != 2) { printf("Usage: %s [cmdline]\n", argv[0]); return; } // Start the child process. if (!CreateProcess(NULL, // No module name (use command line) argv[1], // 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; } // Wait until child process exits. WaitForSingleObject(pi.hProcess, INFINITE); // Close process and thread handles. CloseHandle(pi.hProcess); CloseHandle(pi.hThread);}
CreateProcessAsUserA
BOOL CreateProcessAsUserA( [in, optional] HANDLE hToken, [in, optional] LPCSTR lpApplicationName, [in, out, optional] LPSTR lpCommandLine, [in, optional] LPSECURITY_ATTRIBUTES lpProcessAttributes, [in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes, [in] BOOL bInheritHandles, [in] DWORD dwCreationFlags, [in, optional] LPVOID lpEnvironment, [in, optional] LPCSTR lpCurrentDirectory, [in] LPSTARTUPINFOA lpStartupInfo, [out] LPPROCESS_INFORMATION lpProcessInformation);
验证代码
#include <windows.h>#include <stdio.h>int main(){ HANDLE hToken = NULL; OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &hToken); HANDLE hDuplicatedToken = NULL; DuplicateTokenEx( hToken, // 源令牌 TOKEN_ALL_ACCESS, // 请求的访问权限 NULL, // 安全描述符 SecurityImpersonation, // 模拟级别 TokenPrimary, // 令牌类型(主令牌) &hDuplicatedToken); STARTUPINFOA si = { 0 }; PROCESS_INFORMATION pi = { 0 }; ZeroMemory(&si, sizeof(STARTUPINFOA)); si.cb = sizeof(STARTUPINFOA); si.lpDesktop = (LPSTR)"winsta0\\default"; // 指定桌面 si.dwFlags = STARTF_USESHOWWINDOW; // 使用wShowWindow si.wShowWindow = SW_SHOW; // 显示窗口 // 7. 使用复制的令牌创建进程 CreateProcessAsUserA( hDuplicatedToken, // 用户令牌 "C:\\Windows\\System32\\calc.exe", // 应用程序名 NULL, // 命令行 NULL, // 进程安全属性 NULL, // 线程安全属性 FALSE, // 不继承句柄 CREATE_NEW_CONSOLE, // 创建新控制台 NULL, // 环境变量 NULL, // 当前目录 &si, // 启动信息 &pi); // 进程信息 return 0;}
CreateProcessWithLogonW
BOOL CreateProcessWithLogonW( [in] LPCWSTR lpUsername, [in, optional] LPCWSTR lpDomain, [in] LPCWSTR lpPassword, [in] DWORD dwLogonFlags, [in, optional] LPCWSTR lpApplicationName, [in, out, optional] LPWSTR lpCommandLine, [in] DWORD dwCreationFlags, [in, optional] LPVOID lpEnvironment, [in, optional] LPCWSTR lpCurrentDirectory, [in] LPSTARTUPINFOW lpStartupInfo, [out] LPPROCESS_INFORMATION lpProcessInformation);
验证代码
#include <windows.h>#include <stdio.h>#include <wchar.h>int main(){ STARTUPINFOW si = { 0 }; PROCESS_INFORMATION pi = { 0 }; WCHAR szDesktop[] = L"winsta0\\default"; wchar_t username[] = L"test"; // 必须提供用户名 wchar_t password[] = L"test"; // 必须提供密码 wchar_t application[] = L"C:\\Windows\\System32\\calc.exe"; printf("正在创建计算器进程...\n"); // 1. 设置启动信息 ZeroMemory(&si, sizeof(STARTUPINFOW)); si.cb = sizeof(STARTUPINFOW); si.lpDesktop = szDesktop; // 使用宽字符 si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; wprintf(L"用户: %s\n", username); wprintf(L"应用: %s\n", application); // 2. 创建进程 BOOL bResult = CreateProcessWithLogonW( username, // 用户名 L".", // 域 (本机使用.) password, // 密码 LOGON_NETCREDENTIALS_ONLY, // 登录标志 application, // 应用程序路径 NULL, // 命令行参数 CREATE_NEW_CONSOLE, // 创建标志 NULL, // 环境变量 NULL, // 当前目录 &si, // 启动信息 &pi); // 进程信息 // 3. 检查结果 if (bResult) { printf("✓ 进程创建成功!\n"); printf("进程ID: %d\n", pi.dwProcessId); // 关闭句柄 CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } else { DWORD error = GetLastError(); printf("✗ 创建进程失败: %d\n", error); // 常见错误解释 switch (error) { case 1326: // ERROR_LOGON_FAILURE printf("错误: 用户名或密码不正确\n"); printf("请检查: \n"); printf("1. 用户名是否正确\n"); printf("2. 密码是否正确\n"); printf("3. 用户是否有登录权限\n"); break; case 5: // ERROR_ACCESS_DENIED printf("错误: 访问被拒绝\n"); printf("请以管理员身份运行\n"); break; case 1311: // ERROR_NO_SUCH_PRIVILEGE printf("错误: 没有所需权限\n"); break; case 1314: // ERROR_PRIVILEGE_NOT_HELD printf("错误: 权限不足\n"); break; default: printf("未知错误,代码: %d\n", error); break; } } return bResult ? 0 : 1;}
CreateProcessWithTokenW
BOOL CreateProcessWithTokenW( [in] HANDLE hToken, [in] DWORD dwLogonFlags, [in, optional] LPCWSTR lpApplicationName, [in, out, optional] LPWSTR lpCommandLine, [in] DWORD dwCreationFlags, [in, optional] LPVOID lpEnvironment, [in, optional] LPCWSTR lpCurrentDirectory, [in] LPSTARTUPINFOW lpStartupInfo, [out] LPPROCESS_INFORMATION lpProcessInformation);
验证代码
#include <windows.h>#include <stdio.h>int main(){ HANDLE hToken = NULL; HANDLE hTokenDup = NULL; STARTUPINFOW si = { 0 }; PROCESS_INFORMATION pi = { 0 }; WCHAR szDesktop[] = L"winsta0\\default"; printf("正在使用当前用户令牌创建进程...\n"); // 1. 获取当前进程令牌 if (!OpenProcessToken(GetCurrentProcess(), TOKEN_DUPLICATE | TOKEN_QUERY | TOKEN_ASSIGN_PRIMARY, &hToken)) { printf("获取当前进程令牌失败: %d\n", GetLastError()); return 1; } printf("✓ 获取令牌成功\n"); // 2. 复制令牌 if (!DuplicateTokenEx(hToken, MAXIMUM_ALLOWED, NULL, SecurityIdentification, TokenPrimary, &hTokenDup)) { printf("复制令牌失败: %d\n", GetLastError()); CloseHandle(hToken); return 1; } printf("✓ 复制令牌成功\n"); // 3. 设置启动信息 ZeroMemory(&si, sizeof(STARTUPINFOW)); si.cb = sizeof(STARTUPINFOW); si.lpDesktop = szDesktop; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_SHOW; // 4. 使用令牌创建进程 BOOL bResult = CreateProcessWithTokenW( hTokenDup, // 用户令牌 LOGON_NETCREDENTIALS_ONLY, // 登录标志 L"C:\\Windows\\System32\\calc.exe", // 应用程序 NULL, // 命令行 CREATE_NEW_CONSOLE, // 创建标志 NULL, // 环境变量 NULL, // 当前目录 &si, // 启动信息 &pi); // 进程信息 if (bResult) { printf("========================================\n"); printf("✓ 进程创建成功!\n"); printf("进程ID: %d\n", pi.dwProcessId); printf("线程ID: %d\n", pi.dwThreadId); printf("========================================\n"); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); } else { printf("创建进程失败: %d\n", GetLastError()); } // 清理 if (hTokenDup) CloseHandle(hTokenDup); if (hToken) CloseHandle(hToken); return 0;}
0x02 Shell执行API函数
system
int system( const char *command);int _wsystem( const wchar_t *command);
验证代码
#include <windows.h>#include <stdio.h>#include <wchar.h>int main(){ system("calc.exe");}
WinExec
UINT WinExec( [in] LPCSTR lpCmdLine, [in] UINT uCmdShow);
验证代码
#include <windows.h>#include <stdio.h>#include <wchar.h>int main(){ WinExec("C:\\Windows\\System32\\calc.exe", SW_HIDE);}
ShellExecute
HINSTANCE ShellExecuteA( [in, optional] HWND hwnd, [in, optional] LPCSTR lpOperation, [in] LPCSTR lpFile, [in, optional] LPCSTR lpParameters, [in, optional] LPCSTR lpDirectory, [in] INT nShowCmd);
验证代码
#include <windows.h>#include <stdio.h>#include <wchar.h>int main(){ ShellExecuteW( NULL, // 父窗口句柄 L"open", // 操作 L"notepad.exe", // 文件 NULL, // 参数 NULL, // 工作目录 SW_SHOWNORMAL // 显示方式 );}
ShellExecuteExW
BOOL ShellExecuteExW( [in, out] SHELLEXECUTEINFOW *pExecInfo);
验证代码
#include <windows.h>#include <stdio.h>#include <wchar.h>int main(){ SHELLEXECUTEINFOW sei = { sizeof(sei) }; sei.lpFile = L"C:\\Windows\\System32\\calc.exe"; sei.nShow = SW_HIDE; sei.fMask = SEE_MASK_NOCLOSEPROCESS; ShellExecuteExW(&sei);}
0x03 结语
这里只介绍了部分用于创建进程的API或者方法,在Windows上还有很多方式方法可以创建进程,比如WMI、COM、RPC等!
****0x04 红蓝偶像练习生小圈子
圈子主要研究方向渗透测试、红蓝对抗、钓鱼手法思路、武器化作,红队工具二开与免杀。圈内不定期分享红队技术文章,攻防经验总结,学习笔记以及自研工具与插件,目前圈子已满300人,欢迎各位进圈子交流学习!
**圈子目前更新相关技术文章:
* HeavenlyBypassAV内部版-轻松免杀各大杀软
-
冰蝎webshell免杀工具
-
哥斯拉webshell免杀工具
-
红队场景下lnk钓鱼Bypass国内AV
-
1日和0日POC
-
lnk钓鱼思路视频讲解
-
lnk钓鱼Bypass天擎
-
msi钓鱼
-
chm钓鱼
-
Kill360核晶
-
AV对抗-致盲AV(核晶)
-
捆绑免杀360
-
杀火绒
-
火绒6.0内存免杀
-
kill-windows Defender
-
Defender分离免杀
-
Defender知识点
-
HeavenlyProtectionCS内部CS插件
-
EDR对抗思路
-
进程注入知识点
-
自启动思路
-
多种维权手法
-
Fscan免杀核晶
-
QVM解决思路
-
红队思路-钓鱼环境下小窗口截屏窃取
-
免杀Todesk/向日葵读取工具
-
渗透测试文章思路
-
内网对抗文章思路
-
还有更多红队思路文章!期待您的加入!!!
**
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:安全天书 Hello888 Hello888《【免杀思路】进程创建下可用API平替》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论