C# hook send and recv

chaoliufu2 2015-08-24 04:41:16
求代码例子。 文件包
...全文
242 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
crystal_lz 2015-08-25
  • 打赏
  • 举报
回复
引用 3 楼 crystal_lz 的回复:
微软提供了一套拦截api的接口 百度一下 关键字:detours 需要编译安装 然后只有 lib 文件 然后 由于我不知道怎么让C#调用lib文件 所以我用C++ 写了一个Dll 注入到目标进程里面去 大概代码如下 关键注释已经打上 自己DIY:

#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 章节
刚才的代码没有删除干净 有几句文件输出的代码 是我测试的时候 加上去的 再贴一个吧

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;
}
crystal_lz 2015-08-25
  • 打赏
  • 举报
回复
微软提供了一套拦截api的接口 百度一下 关键字:detours 需要编译安装 然后只有 lib 文件 然后 由于我不知道怎么让C#调用lib文件 所以我用C++ 写了一个Dll 注入到目标进程里面去 大概代码如下 关键注释已经打上 自己DIY:

#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 章节
_lee_chong 2015-08-25
  • 打赏
  • 举报
回复
只用c做过。。。。
孤独de猫 2015-08-25
  • 打赏
  • 举报
回复
C# 就不适合做这个事。用C++ 或 Delphi去做吧。
chaoliufu2 2015-08-24
  • 打赏
  • 举报
回复
本拉灯 2015-08-24
  • 打赏
  • 举报
回复
木有。。

110,567

社区成员

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

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

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