資源簡介
代碼完全遠程。
可以在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

代碼片段和文件信息
#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?hModulewchar_t?*?lpFilenameDWORD?nSize);
};
using?namespace?MODIFY_PROCESS;
//?為了不影響在進程內使用??GetModuleFileNameW?,故hook之,返回正確的路徑。
DWORD?WINAPI?MODIFY_PROCESS::MGetModuleFileNameW(HMODULE?hModulewchar_t?*?lpFilenameDWORD?nSize)
{
typedef?DWORD(WINAPI?*MGetModuleFileNameWT)(HMODULELPWCHDWORD);
MGetModuleFileNameWT?pMGetModuleFileNameW;
pMGetModuleFileNameW?=?(MGetModuleFileNameWT)dwGetModuleFileNameWAddress;
if(hModule?==?NULL?||?hModule?==(HMODULE)MODIFY_PROCESS::dwModulebaseAddress)
{
StringCbCopyW(lpFilenamenSizem_szModulePath);
return?wcslen(m_szModulePath);
}
return?pMGetModuleFileNameW(hModulelpFilenamenSize);
}
CModifyProcessPath::CModifyProcessPath()
{
}
BOOL?CModifyProcessPath::Create()
{
ZeroMemory(MODIFY_PROCESS::m_szModulePathsizeof(MODIFY_PROCESS::m_szModulePath));
MODIFY_PROCESS::dwGetModuleFileNameWAddress=0;
MODIFY_PROCESS::dwModulebaseAddress?=(DWORD)GetModuleHandle(NULL);
GetModuleFileNameW(NULLMODIFY_PROCESS::m_szModulePathMAX_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)lpAPINamesizeof(JMPCODE)PAGE_EXECUTE_READWRITE&dwOldProtect))
return?FALSE;
//保存前5個字節
BYTE?szOldCode[5];
CopyMemory((LPVOID)szOldCode(LPVOID)lpAPINamesizeof(szOldCode));
//構建代碼?
JMPCODE?JmpCode;
JmpCode.bJmp?=?0xE9;
//地址計算公式?目標地址-當前地址?-?5
JmpCode.dwAddr?=?(DWORD)MGetModuleFileNameW?-?lpAPIName?-5;
//寫代碼
CopyMemory((LPVOID)lpAPIName&JmpCodesizeof(JMPCODE));
//恢復內存屬性
DWORD?dwNewProtect=NULL;
//這里就不判斷了。
VirtualProtect((LPVOID)lpAPINamesizeof(JMPCODE)dwOldProtect&dwNewProtect);
CopyMemory((LPVOID)dwGetModuleFileNameWAddressszOldCodesizeof(szOldCode));
JMPCODE?NewJmpCode;
NewJmpCode.bJmp?=?0xE9;
//地址計算公式?目標地址-當前地址?-?5
NewJmpCode.dwAddr?=?lpAPIName-(dwGetModuleFileNameWAddress+sizeof(szOldCode));//+5下一條指令
//寫入指令
CopyMemory((LPVOID)(dwGetModuleFileNameWAddress+sizeof(szOldCode))&NewJmpCodesizeof(JMPCODE));
return?TRUE;
}
//szPath?需要偽裝的路徑
BOOL?CModifyProcessPath::ModifyProcessPath(LPCTSTR?szPath)
{
//?獲取NTDLL.DLL的基址
/*NTDLL.DLL*/
CHAR?szNTDLL[10]={0x4E0x540x440x4C0x4C0x2E0x440x4C0x4C0x11};
szNTDLL[9]=0x00;
HMODULE?hModule?=?GetModuleHandle(
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????751??2012-08-18?14:41??ModifyProcessPath.h
?????文件???????5372??2012-08-18?14:41??ModifyProcessPath.cpp
-----------?---------??----------?-----??----
?????????????????6123????????????????????2