c# 写的 CULHook(含原版C++的),高手帮忙看下问题

gh57897053 2008-10-26 10:17:28
c++
class CULHook{
public:
CULHook(LPSTR pszModName,LPSTR pszFuncName,PROC pfnHook);
~CULHook();
void Unhook();
void Rehook();
protected:
PROC m_pfnOrig;
BYTE m_btNewBytes[8];
BYTE m_btOldBytes[8];
HMODULE m_hModule;
};

CULHook::CULHook(LPSTR pszModName,LPSTR pszFuncName,PROC pfnHook){
BYTE btNewBytes[8]={0xB8,0x00,0x00,0x40,0x00,0xFF,0xE0,0x00};
memcpy(m_btNewBytes,btNewBytes,8);
*(DWORD *)(m_btNewBytes+1)=(DWORD)pfnHook;
m_hModule=::LoadLibrary(pszModName);
if(m_hModule==NULL){
m_pfnOrig=NULL;
return;
}
m_pfnOrig=::GetProcAddress(m_hModule,pszFuncName);
if(m_pfnOrig!=NULL){
DWORD dwOldProtect;
MEMORY_BASIC_INFORMATION mbi;
::VirtualQuery(m_pfnOrig,&mbi,sizeof(mbi));
::VirtualProtect(m_pfnOrig,8,PAGE_READWRITE,&dwOldProtect);
memcpy(m_btOldBytes,m_pfnOrig,8);
::WriteProcessMemory(::GetCurrentProcess(),(void *)m_pfnOrig,
m_btNewBytes,sizeof(DWORD)*2,NULL);
::VirtualProtect(m_pfnOrig,8,mbi.Protect,0);
}
}

c#
private IntPtr apiAddress; //目标API函数地址
private IntPtr dllModule; //新构建的8字节
private byte[] btNewBytes = new byte[8]; //原来的8字节
private byte[] btOldBytes = new byte[8]; //目标API所属模块
//……
public CULHook(string moduleName, string apiName, IntPtr myFunAddress)
{
byte[] newBytes = new byte[8] { 0xB8, 0x00, 0x00, 0x40, 0x00, 0xFF, 0xE0, 0x00 };
Buffer.BlockCopy(newBytes, 0, btNewBytes, 0, 8);
byte[] temp = new byte[8];
Marshal.Copy(myFunAddress, temp, 0, 8);
Buffer.BlockCopy(temp, 0, btNewBytes, 1, 4);

//加载模块,获取api函数地址
dllModule = LoadLibrary(moduleName);
if (dllModule == IntPtr.Zero)
{
apiAddress = IntPtr.Zero;
return;
}
apiAddress = GetProcAddress(dllModule, apiName);

//修改api函数的前8个字节,使其指向我们的函数
if (apiAddress != IntPtr.Zero)
{
int oldProtect;
MEMORY_BASIC_INFORMATION mbi = new MEMORY_BASIC_INFORMATION();
VirtualQuery(apiAddress, ref mbi, Marshal.SizeOf(mbi));
VirtualProtect(apiAddress, 8, 0x40, out oldProtect);//0x40 : PAGE_EXECUTE_READWRITE

//保存原来的执行代码
Marshal.Copy(apiAddress, temp, 0, 8);
Buffer.BlockCopy(temp, 0, btOldBytes, 0, 8);

//写入新执行代码
WriteProcessMemory(GetCurrentProcess(), apiAddress, btNewBytes, sizeof(int) * 2, IntPtr.Zero);
VirtualProtect(apiAddress, 8, mbi.Protect, out oldProtect);

}
}
...全文
127 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
fdx2005129 2009-03-08
  • 打赏
  • 举报
回复
小红我看到了~~~~
这个的作用是什么,小伟的代码我还是没看东.指导下啦
enihs 2008-10-27
  • 打赏
  • 举报
回复
...
enihs 2008-10-27
  • 打赏
  • 举报
回复
既然解决了就帮你解决下分发分的问题咯:)
gh57897053 2008-10-27
  • 打赏
  • 举报
回复
哈哈,自己解决了
gh57897053 2008-10-26
  • 打赏
  • 举报
回复
自己写的C#不能用,不知道是不是内存地址改错了,高手们看看啊!
源码下载地址: https://pan.quark.cn/s/40677b766bda "ContextCapture 倾斜摄影快速、创新及全面空三建模与单机集群硬件部署方案2018" 此资源聚焦于倾斜摄影(ContextCapture)空三建模及单机集群硬件部署方案,致力于为用户呈现最快、最优成本效益的台式工作站、移动工作站、并行集群的多样化部署选择。以下是该资源的详细知识点概述: 一、相关设备型号说明 * UltraLAB 是西安坤隆计算机科技有限公司推出的专属图形工作站品牌,具备三大卓越优势:顶尖的计算硬件架构、精准的行业应用定制服务、专业的硬件系统优化工艺。 二、硬件部署方案 * 台式工作站部署建议:设备特色在于当前市场上最快的台式计算架构,适用于办公场景下,部门层级常规的倾斜摄影空三处理、三维建模。 * 便携式工作站部署建议:设备特色在于当前市场上最快的移动计算架构,适用于移动倾斜摄影的空三处理、三维建模工作站。 * 大数据量处理工作站推荐:设备特色在于极限自动超频加速与16个并行存储构造,具备空三处理和三维建模最强的计算性能及海量高速并行存储性能。 * 多设备并行计算集群部署建议:针对海量图像数据计算产生的巨大需求,单机计算能力处理时间过长,效率不高,通过多台机器并行集群,进行空三处理、三维建模,显著减少处理时间。 三、部署方案深入解析 * 2.1 倾斜摄影建模(台式工作站)部署方案:设备特色在于最高的计算处理能力~6核5.2GHz,内存最大配置可达64GB,配备最新图灵架构的RTX显卡,相比市场其他品牌机器(单CPU、双Xeon处理器)更快、更具成本效益。 * 2.2 倾斜摄影建模(移动便携式工作站)硬件部署方案:设备特色在于最高的计算处理能力~6...

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧