进程管理代码_恶意代码隐藏之进程伪装

恶意代码隐藏之进程伪装

介绍

      通常情况下,为了永久驻留在用户计算机上面,木马程序会披上厚厚的伪装,来躲过用户的常识判断和一些杀软的检测。很多病毒都需要巧妙地隐藏手段来让自己和一个正常的程序一样正大光明的运行在操作系统上。隐藏的手段多种多样,有些是利用较为隐蔽的自启动和植入技术,不需要额外伪装也能起到免杀的效果。

进程伪装

       当一个恶意程序将自己的名称改为和系统自带的一些程序名称相同,有时就能骗过用户和杀软的“眼睛”,即使和被冒充的那个进程信息相同,但是内部执行的代码确实我们自己定义的,通过修改指定进程的PEB中的路径和命令行信息来实现伪装。

  • 一些系统进程的作用

进程名称作用描述
smss.exe会话管理(Session Manager)
csrss.exe子系统服务器进程
winlogon.exe管理用户登录
services.exe包含很多系统服务
svchost.exe包含很多系统服务,从DLL中运行的服务的通用主机名称
SPOOLSV.EXE将文件加载到内存中以便之后打印
explorer.exe资源管理器
  • 函数介绍

函数NtQueryInformationProcess:获取指定进程的信息1c2bec678978299d9ba0c986454c0b57.png

  • 实现原理

       进程伪装的关键在于进程环境块的获取,可由上述函数NtQueryInformationProcess()来获取指定进程的PEB地址,获取之后通过调用函数ReadProcessMemory()WriteProcessMemory()来读写目标进程内存。具体实现流程如下:

  1. 根据PID打开指定进程

  2. ntdll.dll中获取NtQueryInformationProcess()函数的导出地址

  3. 使用NtQueryInformationProcess函数获取指定的进程基本信息PROCESS_BASIC_INFORMATION并从中获取指定进程的PEB

7908c520589fc8cb12c5ee508af418b9.png

  1. 最后,就可以根据进程环境块中的ProcessParameters来获取指定进程的RTL_USER_PROCESS_PARAMETERS信息,这是因为PEB的路径信息、命令行信息存储在这个结构体 中。调用WriteProcessMemory()ReadProcessMemory()函数可以修改PEB中的路径信息、命令行信息等,从而 实现进程伪装。

404033fff591930ce2ebfb94912d2e45.png

注意:在实现的时候要注意系统的版本是32位还是64位

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码完全远程。 可以在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、付费专栏及课程。

余额充值