-
在Windows系统下,可以进行修改以伪装进程路径,支持XP、WIN7以及WIN7 64位版本
资源介绍
代码完全远程。
可以在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::dwGetModuleFileNameWAddress=0;
MODIFY_PROCESS::dwModuleBaseAddress =(DWORD)GetModuleHandle(NULL);
GetModuleFileNameW(NULL,MODIFY_PROCESS::m_szModulePath,MAX_PATH);
DWORD lpAPIName = (DWORD)GetProcAddress(LoadLibrary("kernel32.dll"),"GetModuleFileNameW");
if(lpAPIName==NULL)
return FALSE;
dwGetModuleFileNameWAddress =(DWORD)VirtualAllocEx(
(LPVOID)-1,
NULL,
sizeof(JMPCODE)+sizeof(JMPCODE),
MEM_COMMIT,
PAGE_EXECUTE_READWRITE);
if(dwGetModuleFileNameWAddress ==NULL)
return FALSE;
//去掉内存保护 可以写入代码
DWORD dwOldProtect=NULL;
if(!VirtualProtect((LPVOID)lpAPIName,sizeof(JMPCODE),PAGE_EXECUTE_READWRITE,&dwOldProtect;))
return FALSE;
//保存前5个字节
BYTE szOldCode[5];
CopyMemory((LPVOID)szOldCode,(LPVOID)lpAPIName,sizeof(szOldCode));
//构建代码
JMPCODE JmpCode;
JmpCode.bJmp = 0xE9;
//地址计算公式 目标地址-当前地址 - 5
JmpCode.dwAddr = (DWORD)MGetModuleFileNameW - lpAPIName -5;
//写代码
CopyMemory((LPVOID)lpAPIName,&JmpCode;,sizeof(JMPCODE));
//恢复内存属性
DWORD dwNewProtect=NULL;
//这里就不判断了。
VirtualProtect((LPVOID)lpAPIName,sizeof(JMPCODE),dwOldProtect,&dwNewProtect;);
CopyMemory((LPVOID)dwGetModuleFileNameWAddress,szOldCode,sizeof(szOldCode));
JMPCODE NewJmpCode;
NewJmpCode.bJmp = 0xE9;
//地址计算公式 目标地址-当前地址 - 5
NewJmpCode.dwAddr = lpAPIName-(dwGetModuleFileNameWAddress+sizeof(szOldCode));//+5下一条指令
//写入指令
CopyMemory((LPVOID)(dwGetModuleFileNameWAddress+sizeof(szOldCode)),&NewJmpCode;,sizeof(JMPCODE));
return TRUE;
}
使用方法及其简单至极。
CModifyProcessPath ModifyProcessPath;
if(ModifyProcessPath.Create())
ModifyProcessPath.ModifyProcessPath("c:\\windows\\system32\\svchost.exe");
即可将进程路径伪装成,"c:\\windows\\system32\\svchost.exe",从而避免一般的病毒攻击。
代码注释详细,用了各种技术,可以研究学习下。
- 上一篇: android开发中获取手机内存信息的方式
- 下一篇: Android例子源码安卓进程结束内存管理