栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

父进程欺骗

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

父进程欺骗

如何实现父进程欺骗

在使用CreateProcess函数创建新进程时可以通过UpdateProcThreadAttribute( )函数人为修改STARTUPINFOEXA结构体的lpAttributeList成员变量值来指定子进程的父进程,具体代码如下:

#include 
#include 


int main(int argc, char* argv[])
{
	const char* l_szExePathA = "C:\windows\system32\calc.exe";

	DWORD l_dwParentPid = 588;
	HANDLE l_hParentHandle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, l_dwParentPid);

	
	STARTUPINFOEXA si;
	ZeroMemory(&si, sizeof(si));
	si.StartupInfo.cb = sizeof(si);

	SIZE_T sizeToAllocate = 0;
	InitializeProcThreadAttributeList(NULL, 1, 0, &sizeToAllocate);
	si.lpAttributeList = (LPPROC_THREAD_ATTRIBUTE_LIST)HeapAlloc(GetProcessHeap(), 0, sizeToAllocate);
	InitializeProcThreadAttributeList(si.lpAttributeList, 1, 0, &sizeToAllocate);
	// Set the PROC_THREAD_ATTRIBUTE_PARENT_PROCESS option to specify the parent process to use
	if (!UpdateProcThreadAttribute(si.lpAttributeList, 0, PROC_THREAD_ATTRIBUTE_PARENT_PROCESS, &l_hParentHandle, sizeof(HANDLE), NULL, NULL))
	{
		printf("UpdateProcThreadAttribute failedn");
		return 1;
	}

	PROCESS_INFORMATION pi;
	ZeroMemory(&pi, sizeof(pi));

	BOOL a=CreateProcessA(NULL,(LPSTR)l_szExePathA,NULL,NULL,TRUE,EXTENDED_STARTUPINFO_PRESENT|CREATE_NEW_CONSOLE,NULL,NULL,(LPSTARTUPINFOA)&si,&pi);
	CloseHandle(pi.hProcess);
	CloseHandle(pi.hThread);

	DeleteProcThreadAttributeList(si.lpAttributeList);
	HeapFree(GetProcessHeap(), HEAP_NO_SERIALIZE,si.lpAttributeList);

	return 0;
}

实际效果如下图。parent.exe(pid:3960)进程创建了calc.exe(pid:2276)进程,进程浏览器实际显示lsass.exe(pid:588)是父进程。

检测方法

可以使用微软的事件追踪来确定是否使用了父进程欺骗。这里使用火眼在github上面的一个python3项目,具体代码如下:

import sys
import time
import etw

def some_func():
    # define capture provider info
    providers = [etw.ProviderInfo('Microsoft-Windows-Kernel-Process', etw.GUID("{22fb2cd6-0e7b-422b-a0c7-2fad1fd0e716}"))]
    # create instance of ETW class
    job = etw.ETW(providers=providers, event_callback=lambda x: print(x))
    # start capture
    job.start()
    # wait some time
    time.sleep(10)
    # stop capture
    job.stop() 

def main():
    f=open("D:\a","w")
    old=sys.stdout
    sys.stdout=f
    some_func()
    sys.stdout=old
    f.close()

if  __name__=="__main__":
    main()

打开输出结果文件,出现3个进程ID,分别是:

ProcessId:3960、ProcessID:2276、ParentProcessID:588

ProcessId:进程的实际父进程

ProcessId和ParentProcessID的进程ID不同,说明在创建calc.exe(pid:2276)进程时人为指定了其父进程。

结果如下:

参考地址

https://www.anquanke.com/post/id/168618
https://blog.f-secure.com/detecting-parent-pid-spoofing/
https://github.com/fireeye/pywintrace

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/723244.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号