windows在ring3层的三种进程伪装技术

本文介绍了三种windows在ring3层可用的进程伪装技术。

进程命令行和当前路径欺骗

PEB(进程环境块)是保存进程运行信息的一个用户态的数据结构。PEB中定义了当前模块的名称,命令行参数和当前路径等信息,有一些进程监视工具(如ProcessHacker)是直接读取该数据结构的信息,然后显示给用户,辅助用户进行分析。(PEB结构的定义可以查看 http://www.nirsoft.net/kernel_struct/vista/PEB.html)

我们要修改进程的命令行参数和当前路径,需要修改ProcessParameters结构。

在这里插入图片描述

我们只需关注CurrentDirectory、ImagePathName和CommandLine三个字段。

在这里插入图片描述

实现思路比较清晰,首先取得当前进程PEB结构的地址,然后修改结构体的相关位置即可。核心代码如下。

在这里插入图片描述

执行完这段代码,当前进程的信息就会被修改,接下来我们可以加入一些普通的shellcode加载器代码来执行shellcode,这样我们的后门进程进行了一定程度的伪装。看一下效果。

在这里插入图片描述

shell可以正常使用,没有任何影响。

在这里插入图片描述

在这里插入图片描述

父进程欺骗

通常情况下,我们通过CreateProcess API创建进程,父进程ID就是此API运行的内存空间所属的进程ID,但是通过使用STARTUPINFOEX结构体,并传入修改后的进程信息列表(LPPROC_THREAD_ATTRIBUTE_LIST )来修改待创建进程的父进程。实现思路为首先创建一个进程的LPPROC_THREAD_ATTRIBUTE_LIST,然后修改父进程PID,最后将相关信息传入CreateProcess完成父进程欺骗(需要有)。核心代码如下(代码可从此处下载:http://www.didierstevens.com/files/software/SelectMyParent_v0_0_0_1.zip):

在这里插入图片描述

看一下效果:

在这里插入图片描述

同形异义字

同形异义字是指字符的形状近似但却不是同一个字,unicode编码可以表示的字符数量庞大,其中不乏一些形状相近的,利用这些字符就可以在操作系统中创建一个文件名与正常文件名十分相似的恶意文件。我经给整理部分效果比较好的形近字写成了一个脚本(https://github.com/hl0rey/evilchar),利用该脚本可以达到如下效果(只看文件名的话已经很难分辨哪个是正常的文件了):

在这里插入图片描述

在这里插入图片描述

总结

把三种手法灵活使用,也许能让我们的后门在用户机器中潜伏更长的时间。

代码完全远程。 可以在XP WIN7 WIN764 WIN2003 等操作系统上成功实现修改进程路径。 已经封装成类,使用及其方便。 部分代码: 头文件: #ifndef ModifyProcessPath_h__ #define ModifyProcessPath_h__ // 结构定义 typedef struct _PROCESS_BASIC_INFORMATION { DWORD ExitStatus; ULONG PebBaseAddress; ULONG AffinityMask; LONG BasePriority; ULONG UniqueProcessId; ULONG InheritedFromUniqueProcessId; } PROCESS_BASIC_INFORMATION, *PPROCESS_BASIC_INFORMATION; // API声明 typedef LONG (__stdcall *PZWQUERYINFORMATIONPROCESS) ( HANDLE ProcessHandle, ULONG ProcessInformationClass, PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength ); class CModifyProcessPath { public: CModifyProcessPath(); BOOL Create(); BOOL ModifyProcessPath(LPCTSTR szPath); BOOL CamouflageExplorerPath(); }; #endif // ModifyProcessPath_h__ CPP部分代码: #include "StdAfx.h" #include "ModifyProcessPath.h" namespace MODIFY_PROCESS { wchar_t m_szModulePath[MAX_PATH]; DWORD dwGetModuleFileNameWAddress; DWORD dwModuleBaseAddress; //E9 (目标地址-当前地址 - 5) #pragma pack(1) typedef struct _JMPCODE { BYTE bJmp; DWORD dwAddr; }JMPCODE,*LPJMPCODE; #pragma pack() DWORD WINAPI MGetModuleFileNameW(HMODULE hModule,wchar_t * lpFilename,DWORD nSize); }; using namespace MODIFY_PROCESS; // 为了不影响在进程内使用 GetModuleFileNameW ,故hook之,返回正确的路径。 DWORD WINAPI MODIFY_PROCESS::MGetModuleFileNameW(HMODULE hModule,wchar_t * lpFilename,DWORD nSize) { typedef DWORD(WINAPI *MGetModuleFileNameWT)(HMODULE,LPWCH,DWORD); MGetModuleFileNameWT pMGetModuleFileNameW; pMGetModuleFileNameW = (MGetModuleFileNameWT)dwGetModuleFileNameWAddress; if(hModule == NULL || hModule ==(HMODULE)MODIFY_PROCESS::dwModuleBaseAddress) { StringCbCopyW(lpFilename,nSize,m_szModulePath); return wcslen(m_szModulePath); } return pMGetModuleFileNameW(hModule,lpFilename,nSize); } CModifyProcessPath::CModifyProcessPath() { } BOOL CModifyProcessPath::Create() { ZeroMemory(MODIFY_PROCESS::m_szModulePath,sizeof(MODIFY_PROCESS::m_szModulePath)); MODIFY_PROCESS::dwGet
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值