通用32位apihook函数(hook socket)

C++代码部分

typedef int(__stdcall *send_)(SOCKET , const char* , int , int );
typedef int(__stdcall *recv_)(SOCKET, const char*, int, int);
int __stdcall fake_send(SOCKET s, const char* buf, int len, int flags)
{
    return old_send(s, buf, len, flags);
}
int __stdcall fake_recv(SOCKET s, const char* buf, int len, int flags)
{
    int r = old_recv(s, buf, len, flags);
    return r;
}
void* hook_x86(const char* dll,const char* func,void* fake_addr)
{
    HINSTANCE hInst = ::GetModuleHandleA(dll);
    if (hInst == NULL)
        hInst = LoadLibraryA(dll);
    if (hInst == NULL)
        return NULL;
    char* p = (char*)::GetProcAddress(hInst, func);
    void* old = (void*)(p + 1);
    DWORD Old = 0;
    VirtualProtect(p - 10, 20, PAGE_EXECUTE_READWRITE, &Old);
    *p++ = 0xEB;
    *p = 0xF9;
    p -= 6;
    *p = 0xE9;
    DWORD* t = (DWORD*)++p;
    DWORD ta = (DWORD)fake_addr - ((DWORD)t - 1) - 5;
    *t = ta;
    VirtualProtect(p - 10, 20, Old, &Old);
    return old;
}
old_send = (send_)hook_x86("ws2_32.dll", "send", fake_send);
old_recv = (recv_)hook_x86("ws2_32.dll", "recv", fake_recv);

E代码和截图部分

代码如下

.版本 2

.子程序 安装, 逻辑型, 公开, 安装APIHOOK
.参数 动态链接库路径, 文本型, , 欲截获的函数名所在动态链接库的路径
.参数 函数名, 文本型, , 欲截获的函数名
.参数 新函数地址, 整数型, , 回调子程序指针地址.可以用 到整数(子程序指针) 获得
.局部变量 模块句柄, 整数型

.如果真 (函数地址 ≠ 0)
返回 (真)
.如果真结束
模块句柄 = _取模块句柄2 (动态链接库路径)
.如果真 (模块句柄 = 0)
模块句柄 = _装载DLL (动态链接库路径)
.如果真结束
.如果真 (模块句柄 = 0)
返回 (假)
.如果真结束
函数地址 = _取库函数地址 (模块句柄, 函数名) ‘ 获取API函数地址
.如果真 (函数地址 = 0)
返回 (假)
.如果真结束
.如果真 (_修改内存属性1 (函数地址, 5, #PAGE_EXECUTE_READWRITE, 原保护值) = 假)
返回 (假)
.如果真结束
原字节 = 指针到字节集 (函数地址, 5) ‘ 保存API入口前5个字节
新字节 = { 233 } + 到字节集 (到整数 (新函数地址 - (函数地址 + 5)))
写到内存 (新字节, 函数地址, 5) ‘ 修改API入口前5字节
原字节 = 原字节 + { 233, 0, 0, 0, 0 }
原地址 = _取指针_字节集2 (原字节, 原字节, 0)
写到内存 (到整数 (函数地址 + 5 - (原地址 + 10)), 原地址 + 6, 4)
_释放DLL (模块句柄)
返回 (真)

时间: 2024-10-14 00:12:26

通用32位apihook函数(hook socket)的相关文章

写个较通用的32位apihook函数 免得每次都重写

typedef int(__stdcall *send_)(SOCKET , const char* , int , int ); typedef int(__stdcall *recv_)(SOCKET, const char*, int, int); int __stdcall fake_send(SOCKET s, const char* buf, int len, int flags) { return old_send(s, buf, len, flags); } int __stdc

通用32位MD5算法总结:MD5Util

1.小写: 比如 abcdef e80b5017098950fc58aad83c8c14978e public static String HEXAndMd5(String plainText) { try { MessageDigest md = MessageDigest.getInstance("MD5"); try { md.update(plainText.getBytes("UTF8")); } catch (UnsupportedEncodingExc

32位程序下调用64位函数——进程32位模式与64位模式切换

之前学习的32位进程中调用64位进程函数的知识整理一下,也就是32位模式与64位模式之间的切换. 相关博客:http://www.cnblogs.com/lanrenxinxin/p/4821152.html 这个博客中提到了github上的开源库,我在另一份开源项目中也看到了个库,可以切换32位至64位. 如果对这个功能具体实现比较感兴趣的朋友可以看看下面的内容. 我阅读了源码并进行了注释,算是对这个具体方法的分析和学习. 关键: 1.在x64下的进程,不管是32位或者是64位,实际上都映射了

编译器是如何实现32位整型的常量整数除法优化的?[C/C++]

引子 在我之前的一篇文章[ ThoughtWorks代码挑战——FizzBuzzWhizz游戏 通用高速版(C/C++ & C#) ]里曾经提到过编译器在处理被除数为常数的除法时,是有优化的,今天整理出来,一来可以了解是怎么实现的,二来如果你哪天要写编译器,这个理论可以用得上.此外,也算我的一个笔记. 实例 我们先来看一看编译器优化的实例.我们所说的被除数为常数的整数除法(针对无符号整型, 有符号整型我们后面再讨论),指的是,对于unsigned int a, b, c,例如:a / 10, b

<转>32位移植到64位 注意事项

32bit-64bit porting work注意事项 64位服务器逐步普及,各条产品线对64位升级的需求也不断加大.在本文中,主要讨论向64位平台移植现有32位代码时,应注意的一些细小问题. 什么样的程序需要升级到64位? 理论上说,64位的操作系统,对32位的程序具有良好的兼容性,即使全部换成64位平台,依然可以良好的运行32位的程序.因此,许多目前在32位平台上运行良好的程序也许不必移植,有选择,有甄别的进行模块的升级,对我们工作的展开,是有帮助的. 什么样的程序需要升级到64位呢? 除

【转】32位移植到64位 注意事项 ----不错

原文网址:http://blog.csdn.net/w174504744/article/details/8678045 32bit-64bit porting work注意事项 64位服务器逐步普及,各条产品线对64位升级的需求也不断加大.在本文中,主要讨论向64位平台移植现有32位代码时,应注意的一些细小问题. 什么样的程序需要升级到64位? 理论上说,64位的操作系统,对32位的程序具有良好的兼容性,即使全部换成64位平台,依然可以良好的运行32位的程序.因此,许多目前在32位平台上运行良

关于32位程序的内存

在上大学的时候老师提到过这么一个知识点 32位程序的寻址能力是2^32,也就是4G.对于32位程序只能申请到4G的内存.而且这4G内存中,在windows下有2G,linux下有1G是保留给内核态使用,用户态无法访问.故只能分配2G.3G的内存使用. 前几天服务器报警了,无法负载更多的用户进行访问.赶紧看了下程序的自我评分,显示内存占用达到3.6G,无法继续工作. WTF?3.6G?超过linux下32位程序只能使用3G内存的限制? 这个时候怀疑是评分程序写错了,赶紧用TOP看了下内存,也达到了

在32位、64位操作系统下各数据类型所占的字节数

点击打开链接 在32位.64位系统当中,唯一改变的是指针的长度;在32位系统当中是4个字节.64位则是8个字节.所谓的32位.64位,这个指的是寄存器的位宽. 32位平台下结果: 64位平台下结果: 一.下面几点是值得大家注意的: 1.关于 int 的取值范围,缺省的int数值范围是由编译器设计者决定的,通常都是机器最为自然高效的位数.甚至,我们在32位的机器上,前提没有什么指令可以高效的的处理更短的整型值,我们可以将short.int.long都设置成32位. 2.浮点数在缺省的情况下 表示的

驱动级多开工具,支持32位和64位

标题:[原创]驱动级多开工具,支持32位和64位 作者:绿林科技 时间:2015-5-16 链接:http://blog.csdn.net/o6108/article/details/47790019 作者QQ:1473656864 技术交流群1:177822108 技术交流群2:177822398 通用驱动级多开器,可多开市面上的90%的程序. PS:本来想弄个收费版本的,后来想了想,决定弄成免费.店铺为更新软件版本用的. 软件的About页面有我的QQ和Q群号,请大家把使用过程中遇到的BUG