110,567
社区成员
发帖
与我相关
我的任务
分享
static int (WINAPI* OLD_recv)(SOCKET s,char FAR* buf,int len,int flags) = recv;//保存旧的函数指针
int WINAPI NEW_recv(SOCKET s,char FAR* buf,int len,int flags)//定义新的替换函数
{
int stLen = 0;
int recvLen = 0;
SOCKADDR_IN addrClient;
stLen = sizeof(addrClient);
memset(&addrClient,0,stLen);
getsockname(s,(sockaddr *)&addrClient,&stLen);//得到目标客户端信息
//其他代码
return OLD_recv(s,buf,len,flags);
}
VOID Hook()
{
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//这里可以连续多次调用DetourAttach,表明HOOK多个函数
DetourAttach(&(PVOID&)OLD_recv,NEW_recv);
DetourTransactionCommit();
}
VOID UnHook()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK
DetourDetach(&(PVOID&)OLD_recv,NEW_recv);
DetourTransactionCommit();
}
BOOL WINAPI DllMain(HANDLE hInsDLL,DWORD dwReason,LPVOID lpvReserved){
switch(dwReason){
case DLL_PROCESS_ATTACH://进程加载Dll
Hook();
break;
case DLL_PROCESS_DETACH://进程卸载Dll
UnHook();
break;
}
return TRUE;
}
#include <detours.h> //这个需要自己安装
#pragma comment(lib,"ws2_32.lib")
#pragma comment(lib, "detours.lib")
static int (WINAPI* OLD_recv)(SOCKET s,char FAR* buf,int len,int flags) = recv;//保存旧的函数指针
int WINAPI NEW_recv(SOCKET s,char FAR* buf,int len,int flags)//定义新的替换函数
{
int stLen = 0;
int recvLen = 0;
SOCKADDR_IN addrClient;
stLen = sizeof(addrClient);
memset(&addrClient,0,stLen);
getsockname(s,(sockaddr *)&addrClient,&stLen);//得到目标客户端信息
//其他代码
return OLD_recv(s,buf,len,flags);//自己决定是否调用原来的函数
}
VOID Hook()
{
DetourRestoreAfterWith();
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//这里可以连续多次调用DetourAttach,表明HOOK多个函数
DetourAttach(&(PVOID&)OLD_recv,NEW_recv);
DetourTransactionCommit();
fout << l << endl;
fout << flush;
fout.close();
}
VOID UnHook()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//这里可以连续多次调用DetourDetach,表明撤销多个函数HOOK
DetourDetach(&(PVOID&)OLD_recv,NEW_recv);
DetourTransactionCommit();
}
BOOL WINAPI DllMain(HANDLE hInsDLL,DWORD dwReason,LPVOID lpvReserved){
switch(dwReason){
case DLL_PROCESS_ATTACH://进程加载Dll
Hook();
break;
case DLL_PROCESS_DETACH://进程卸载Dll
UnHook();
break;
}
return TRUE;
}
因为 不知道怎么引用 lib 文件 所以才用C++写的
就算不用微软提供的那个什么 也是可以去拦截的 但是。。既然是要去拦截别人的代码 那么问题来了 你的把代码 搞到对方的进程里面去才行 而最简单的方式就是写一个dll 然后注入到对方的进程里面去 貌似C# 也没有办法完成这档子的事情
当然 非要用C#的话 如果 你事先把你要替换的函数非托管代码编译好 然后取出byte字节
通过VirtualAllocEx函数去对方进程申请相应字节的空间 会得到一个地址 然后通过 WriteProcessMemory 在这个地址写入进去
然后去目标进程的读取镜像的PE文件头 替换导入表里面recv函数的地址 改成 刚才申请的那个地址 目标进程在调用recv的时候 就会调用到你的函数了
搞得这个麻烦 还不如直接用C++搞了
可以参考《Windows核心编程》Hook api 章节