如何使用hook?
目标:将posix函数hook住
一个简单的例子
(连接mysql服务),连接成功则打印success
mysql.c
#include <mysql/mysql.h>
#include <stdio.h>
int main(){MYSQL* mysql = mysql_init(NULL);if(!mysql){printf("mysql_init failed\n");return 0;}if(!mysql_real_connect(mysql, "127.0.0.1", "root", "123456","mysql", 3306, NULL, 0)){printf("mysql connect failed\n");return 0;}printf("success!\n");
}
编译
gcc -o mysql mysql.c -lmysqlclient
运行
$ ./mysql
success!
成功连接到mysql服务
mysql服务的连接少不了posix API例如connect,recv,send,其中mysql_real_connect函数中一定调用了这些函数,我们就可以使用hook技术来将其hook住捕获原始posixAPI
目标:将posixAPI捕获然后在其调用之前打印一定信息
main函数的主要代码完全不用修改,底层hook了后用户是无法感知的
操作步骤
一、定义要hook的posixAPI的函数指针
typedef int (*connect_t)(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
typedef ssize_t(*recv_t)(int sockfd, void *buf, size_t len, int flags);
typedef ssize_t(*send_t)(int sockfd, const void *buf, size_t len, int flags);connect_t connect_f = NULL;
recv_t recv_f = NULL;
send_t send_f = NULL;
- 返回值和参数必须与原
posixAPI相同
二、修改posixAPI
int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen){printf("CONNECT\n");return connect_f(sockfd, addr, addrlen);
}
ssize_t recv(int sockfd, void *buf, size_t len, int flags){printf("RECV\n");return recv_f(sockfd, buf, len, flags);
}
ssize_t send(int sockfd, const void *buf, size_t len, int flags){printf("SEND\n");return send_f(sockfd, buf, len, flags);
}
- 让
posixAPI被触发之前能够触发打印
三、添加相关头文件并初始化hook
#define _GNU_SOURCE
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/socket.h>// ...void init_hook(void){if(!connect_f)connect_f = dlsym(RTLD_NEXT, "connect");if(!recv_f)recv_f = dlsym(RTLD_NEXT, "recv");if(!send_f)send_f = dlsym(RTLD_NEXT, "send");
}
在上述mysql.c中添加上述代码,并在程序开始前调用init_hook函数
#define _GNU_SOURCE
#include <dlfcn.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <mysql/mysql.h>
#include <stdio.h>typedef int (*connect_t)(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
typedef ssize_t(*recv_t)(int sockfd, void *buf, size_t len, int flags);
typedef ssize_t(*send_t)(int sockfd, const void *buf, size_t len, int flags);connect_t connect_f = NULL;
recv_t recv_f = NULL;
send_t send_f = NULL;int connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen){printf("CONNECT\n");return connect_f(sockfd, addr, addrlen);
}
ssize_t recv(int sockfd, void *buf, size_t len, int flags){printf("RECV\n");return recv_f(sockfd, buf, len, flags);
}
ssize_t send(int sockfd, const void *buf, size_t len, int flags){printf("SEND\n");return send_f(sockfd, buf, len, flags);
}void init_hook(void){if(!connect_f)connect_f = dlsym(RTLD_NEXT, "connect");if(!recv_f)recv_f = dlsym(RTLD_NEXT, "recv");if(!send_f)send_f = dlsym(RTLD_NEXT, "send");
}int main(){init_hook();MYSQL* mysql = mysql_init(NULL);if(!mysql){printf("mysql_init failed\n");return 0;}if(!mysql_real_connect(mysql, "127.0.0.1", "root", "123456","mysql", 3306, NULL, 0)){printf("mysql connect failed\n");return 0;}printf("success!\n");
}
编译
gcc -o mysql mysql.c -lmysqlclient -ldl
运行
$ ./mysql
CONNECT
RECV
SEND
success!
可以发现mysql_real_connect中的posixAPI被捕获了
总结
按照以下步骤,就可以自定义其他的hook
-
定义想要
hook的函数的指针(别名),并初始化NULL -
自定义原函数的操作并在最后返回
hook后的函数调用体 -
初始化hook
- 使用
dlysm
- 使用
文章参考与<零声教育>的C/C++linux服务期高级架构系统教程学习
相关文章:
如何使用hook?
目标:将posix函数hook住 一个简单的例子 (连接mysql服务),连接成功则打印success mysql.c #include <mysql/mysql.h> #include <stdio.h> int main(){MYSQL* mysql mysql_init(NULL);if(!mysql){printf("my…...
双指针技巧秒杀七道链表题目
文档阅读 文档阅读 题目 141. 环形链表 https://leetcode.cn/problems/linked-list-cycle/ public class Solution {public boolean hasCycle(ListNode head) {ListNode fast head, slow head;while(fast ! null && fast.next ! null){fast fast.next.next;slo…...
在“裸奔”时代保护我们的隐私:网络攻击、数据泄露与隐私侵犯的应对策略与工具
摘要:随着信息技术的普及和发展,个人隐私和数据安全问题日益受到威胁。本文将讨论如何有效应对网络攻击、数据泄露和隐私侵犯,并提供一系列实用的技巧和工具,以帮助我们在“裸奔”时代更好地保护数据安全和隐私。 当今社会&#…...
如何写出高质量代码
你是否曾经为自己写的代码而感到懊恼?你是否想过如何才能写出高质量代码?那就不要错过这个话题!在这里,我们可以讨论什么是高质量代码,如何写出高质量代码等问题。无论你是初学者还是资深开发人员,都可以在…...
[oeasy]python0048_注释_comment_设置默认编码格式
注释Comment 回忆上次内容 使用了版本控制 git 制作备份进行回滚 尝试了 嵌套的控制结构 层层 控制 不过 除非 到不得以尽量不要 太多层次的嵌套 这样 从顶到底含义 明确而且 还扁平 扁平 也能 含义明确 还可以 做点什么? 让程序含义 更加明确呢?&…...
C++中的queue与priority_queue
文章目录 queuequeue的介绍queue的使用 priority_queuepriority_queue介绍priority_queue使用 queue queue的介绍 队列是一种容器适配器,专门用于上下文先进先出的操作中。队列的特性是先进先出,从容器的一端插入,另一端提取元素。 队列…...
电脑发挥极致,畅游永恒之塔sf
随着22寸显示器的普及,玩永恒之塔势必会对显示卡造成了很大负担。不要说效果全开,就连简洁的玩,都成了问题,那是不是就要重金把才买的显示卡又要拿掉呢? 最出众的解决办法,是超频。 主要就具有以下条件最佳…...
ChatGPT :十几个国内免费可用 ChatGPT 网页版
前言 ChatGPT(全名:Chat Generative Pre-trained Transformer),美国OpenAI 研发的聊天机器人程序 ,于2022年11月30日发布 。ChatGPT是人工智能技术驱动的自然语言处理工具,它能够通过理解和学习人类的语言…...
5 分钟教你如何免费用上 GPT-4
今天要分享的就是普通用户,没有 OpenAI 账号,不需要写代码,你依然可以免费体验 GPT-4,当然,会有一些缺点,本篇文章将会手把手教你怎么用上免费版的 GPT-4 以及它的一些限制。 第一步:打开 Stea…...
安卓手机搭建智能语音客服/通话播音/聊天播音乐技术实现
声明,此项技术需要root支持,如果因为刷机导致手机变砖或其他不可预料的后果请自行解决。 场景 我有一个朋友他是做业务的,主要还是做电销,其实电销相对于以前纪念没那么好做了(我自己觉得主要是互联网冲击,…...
【学习笔记】PKUSC2023 不知道咋记
挺快乐的。到 P K U PKU PKU感受了一下北大校园,其实并没有想像中那么令人惊艳,但是看到了许多亲切的学长以及他们的热心陪伴(虽然有的我甚至不认识),感觉心里还是挺暖的。 如果不算上 D 2 T 1 D2T1 D2T1被平衡树板子…...
Packet Tracer - 配置基于区域的策略防火墙 (ZPF)
Packet Tracer - 配置基于区域的策略防火墙 (ZPF) 拓扑图 地址分配表 设备 接口 IP 地址 子网掩码 默认网关 交换机端口 R1 G0/1 192.168.1.1 255.255.255.0 不适用 S1 F0/5 S0/0/0 (DCE) 10.1.1.1 255.255.255.252 不适用 不适用 R2 S0/0/0 10.1.1.2 255…...
全方位揭秘!大数据从0到1的完美落地之运行流程和分片机制
一个完整的MapReduce程序在分布式运行时有三类实例进程: MRAppMaster: 负责整个程序的过程调度及状态协调MapTask: 负责Map阶段的整个数据处理流程ReduceTask: 负责Reduce阶段的整个数据处理流程 当一个作业提交后(mr程序启动),大概流程如下࿱…...
后端程序员的前端必备【Vue】 - 07 ES6新语法
ES6新语法 1 let定义变量2 const定义常量3 模板字符串4 方法默认值5 箭头函数6 解构6.1 对象解构6.2 数组解构6.2 使用解构实现变量交换 7 Spread Operator8 模块化编程 1 let定义变量 使用let定义变量能更加精准的确定变量的作用域 //for(var i 0 ; i < 10 ; i){} for(let…...
AI落地:程序员如何用AI?
对于程序员来说,真正能提高效率、可落地的AI应用场景都有哪些? 目前已经能切实落地,融入我日常工作生活的有以下几个场景: 开发工作:自然语言生成代码,自动补全代码 日常工作学习:写作、翻译、…...
掌握优化+创新模式,轻松提升APP广告eCPM
无论是市场占有率高的综合性应用程序(App),还是透过特定目的所设计的专业化应用程序(App),内部嵌入广告已成为其主要的盈利方式。 而优化和创新作为提升广告收益的两大关键词。通过不断的数据分析和优化,结合对用户需求的深刻理解去优化和…...
在docker上安装运行Python文件
目录 一、在docker中安装python 1.1 输入镜像拉取命令 1.2 查看镜像 1.3 运行 1.4 查看是否成功 1.5 查看python版本 二、运行py文件 2.1准备运行所需文件 2.2 准备文件夹 2.3 大概是这幅模样 2.4 打包上传到服务器上 2.5 构建镜像示例 2.6 查看镜像 2.7 优化镜像的…...
RocketMQ第三节(生产者和消费者)
目录 1:生产者(同步、异步、单向) 1.1:同步发送消息(每发送一条等待mq返回值) 1.2:异步发送消息 1.3:单向发送消息(不管成功失败,只管发送消息)…...
人大金仓亮相国际金融展,打造“金融+产业+生态”创新模式
4月27日,以“荟萃金融科技成果,展现数字金融力量,谱写金融服务中国式现代化新篇章”为主题的2023中国国际金融展圆满落幕。作为已经举办30年的行业盛会,人大金仓再一次重磅亮相,全方位展示国产数据库前沿应用和创新服务…...
Syslog-ng RHEL 的安装和配置
syslog-ng 作为 syslog 的替代工具,可以完全替代 syslog 的服务,并且通过定义规则,实现更好的过滤功能。 作为运维来说一个好的日志工具比什么都重要。 通常我们会管理不同的服务器,因此我们需要把日志集中一下以便于快速查找。…...
SITS2026到底是什么?3类企业已紧急升级AI部署栈,第4类正在掉队(附Gartner未公开验证数据)
更多请点击: https://intelliparadigm.com 第一章:SITS2026的定义与演进逻辑 SITS2026(Semantic Integration and Trustable Systems 2026)是新一代面向语义互操作与可信协同的系统架构规范,由国际开放系统联盟&…...
10分钟为Royal TSX打造完美中文界面:从英文迷茫到母语掌控
10分钟为Royal TSX打造完美中文界面:从英文迷茫到母语掌控 【免费下载链接】Royal_TSX_Chinese_Language_Pack Royal_TSX的简体中文汉化包 项目地址: https://gitcode.com/gh_mirrors/ro/Royal_TSX_Chinese_Language_Pack 当您第一次打开Royal TSX这款强大的…...
LinkSwift:九大网盘直链下载终极解决方案,三步告别限速困扰
LinkSwift:九大网盘直链下载终极解决方案,三步告别限速困扰 【免费下载链接】Online-disk-direct-link-download-assistant 一个基于 JavaScript 的网盘文件下载地址获取工具。基于【网盘直链下载助手】修改 ,支持 百度网盘 / 阿里云盘 / 中国…...
XGBoost交叉验证超简单
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 XGBoost交叉验证:三步法,让模型评估变得如此简单目录XGBoost交叉验证:三步法,让模…...
RPFM:全面战争MOD开发的终极效率提升指南
RPFM:全面战争MOD开发的终极效率提升指南 【免费下载链接】rpfm Rusted PackFile Manager (RPFM) is a... reimplementation in Rust and Qt6 of PackFile Manager (PFM), one of the best modding tools for Total War Games. 项目地址: https://gitcode.com/gh_…...
个人开发者选择Taotoken Token Plan套餐的成本控制心得
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 个人开发者选择Taotoken Token Plan套餐的成本控制心得 1. 背景与需求:从按需计费到寻求稳定预算 作为一名独立开发者…...
三指拖拽神器:让Windows触控板拥有MacBook般的流畅体验
三指拖拽神器:让Windows触控板拥有MacBook般的流畅体验 【免费下载链接】ThreeFingersDragOnWindows Enables macOS-style three-finger dragging functionality on Windows Precision touchpads. 项目地址: https://gitcode.com/gh_mirrors/th/ThreeFingersDragO…...
专业级系统控制工具:5步掌握极域电子教室破解与权限管理实战
专业级系统控制工具:5步掌握极域电子教室破解与权限管理实战 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer JiYuTrainer是一款专注于破解极域电子教室控制的开源工具…...
基于OpenClaw的本地AI品牌内容引擎:Abra架构解析与实战部署
1. 项目概述:Abra,一个本地AI驱动的个人品牌管理引擎如果你和我一样,每天在社交媒体内容创作上花费大量时间,从构思、撰写、配图到排版发布,整个过程繁琐且难以保持品牌调性统一,那么今天分享的这个项目“A…...
Keil MDK编译89C51老项目,遇到error C132报错别慌,先检查这个分号
Keil MDK编译89C51老项目遇到error C132报错的系统排查指南 当你在维护一个尘封多年的89C51项目时,Keil MDK突然抛出一连串error C132和C244错误,那种感觉就像打开一个老式收音机却只听到刺耳的杂音。但别急着重写整个项目——根据我的经验,…...
