首页
社区
课程
招聘
未解决 [求助]请问c#借助dll实现了hook,但是c#如何获取hook的数据呢?
发表于: 2020-7-30 23:10 3640

未解决 [求助]请问c#借助dll实现了hook,但是c#如何获取hook的数据呢?

2020-7-30 23:10
3640

求教大佬们一个问题。
最近在搞一个网页游戏的封包解析,我是用c#写的。然后需要hook socket。
最初我是用easyhook实现的,但是发现不知道为啥经常莫名其妙的断开hook(经过测试,运行大量代码时更加容易断开hook,但是注释掉那些影响效率的代码后,hook的稳定性会有所提高,但偶尔也会断开hook)。不过这个不是我提问的要点。
我因此弃用了easyhook,参考《加密与解密》,改用inline hook,用c++额外写了一个dll用于hook socket中的send和recv。
目前我写的这个dll可以稳定地实现hook,但是有个问题,我在c#中如何才能获取到这个dll中的hook的数据呢?这里特指如何获取recv和send的数据。
以recv为例,游戏客户端调用ws2_32.dll中的recv函数来接受数据,由于hook了,所以跳转至dll中的My_Recv继续执行。

int WINAPI My_Recv(SOCKET s, char *buf, int len, int flags)
{
    PFN_Recv OriginalRecv = (PFN_Recv)RecvHookData.pfnTrampolineFun;
    int ret = OriginalRecv(s, buf, len, flags);
    if (ret > 0) {
        printf("recvnum : %d\n", recvnum);
        printf("recvret : %d\n", ret);
        PrintHexDump(buf, ret);
        recvnum++;
    }
    return ret;
}

上面代码中的buf就是我需要的recv的数据。但是这个数据只能由dll访问,我的c#程序该如何才能拿到这个数据呢?
有个朋友让我通过dll将数据写入文件,然后c#读文件,感觉这个效率很低啊,请问大佬们有没有其他可行的方案呢?谢谢~


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2020-7-30 23:10 被iyzyi编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 2620
活跃值: (1965)
能力值: ( LV8,RANK:121 )
在线值:
发帖
回帖
粉丝
2
或者我换句话说:当dll处理完一次hook(比如说recv了一次)后,该如何向c#告知这一事件。
2020-7-30 23:22
0
雪    币: 2822
活跃值: (154)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
c#建立一个套接字和dll通信
2020-7-31 00:01
0
雪    币: 1042
活跃值: (500)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
createfilemappingA
2020-7-31 01:31
0
雪    币: 2620
活跃值: (1965)
能力值: ( LV8,RANK:121 )
在线值:
发帖
回帖
粉丝
5
谢谢大佬们给出的多个思路~不过我刚刚用回调函数实现了我的需求,参考了这个项目:https://github.com/mathes006/CSharp_Join_CPlus
2020-7-31 02:57
0
雪    币: 3725
活跃值: (619)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
6
hook用的dll再导出一个函数, 函数里面申明几个static类型的变量, 这样dll也能访问, C#也能访问. 
可以用C#写一个回调, 每次hook的dll做完事, 就调用回调通知C#, 还有就是 dll 申请的内存, 最好由dll 释放, 因为其他模块释放可能会崩溃.
你应该就是要简单能用的, 邮槽,管道,sendmessage什么的用起来太啰嗦.
2020-7-31 09:21
1
雪    币: 3496
活跃值: (749)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark一下 。。。。
2020-7-31 11:08
0
游客
登录 | 注册 方可回帖
返回
//