• 大小: 3KB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: 其他
  • 标签:

资源简介

代码完全远程。 可以在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


评论

共有 条评论

相关资源