Linux Hook技术实践

Linux Hook技术实践LInuxHook技术实践什么是hook简单的说就是别人本来是执行libA.so里面的函数的,结果现在被偷偷换成了执行你的libB.so里面的代码,是一种替换。为什么hook恶意代码注入调用常用库函数时打log改变常用库函数的行为,个性化怎么hook这个东西在win里面有现成的api,但是在linux里面却要主动修改ELF文件,或者修改动态库链接路径。我看网上写的好多挺麻烦的,而且还要调用

大家好,又见面了,我是你们的朋友全栈君。

LInux Hook技术实践

什么是hook

简单的说就是别人本来是执行libA.so里面的函数的,结果现在被偷偷换成了执行你的libB.so里面的代码,是一种替换。

为什么hook

  1. 恶意代码注入
  2. 调用常用库函数时打log
  3. 改变常用库函数的行为,个性化

怎么hook

这个东西在win里面有现成的api,但是在linux里面却要主动修改ELF文件,或者修改动态库链接路径。我看网上写的好多挺麻烦的,而且还要调用各种修改ELF的API。。。。所以这里提供一种简单的方法来hook

下面直接demo吧

/*myselect.c*/
#define _GNU_SOURCE
#include <unistd.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/time.h>
typedef int (*selectType)(int __nfds, fd_set *__restrict __readfds,
            fd_set *__restrict __writefds,
            fd_set *__restrict __exceptfds,
             struct timeval *__restrict __timeout);
int select(int maxfdp1,fd_set* readset,fd_set* writeset,fd_set* exceptset, struct timeval*timeout)
{
    printf("in modified select\n");
    selectType ori_select = (selectType)dlsym(RTLD_NEXT,"select");
    return ori_select(maxfdp1,readset,writeset,exceptset,timeout);
}          

这个代码的逻辑很简单,就是重写一个select,然后打包成库,让程序运行时优先加载这个库,这样程序运行时先在这个库中找到select函数后,就不会再加载原始的select函数。但是多数时候我们并不是要完全改变 原函数的行为 或许只是做一些小的修改,或许只是打一些log。这样我们若能在新函数里面执行以前的旧函数就好了,所以我们拿到原函数的入口地址,并在新函数中调用旧函数。这里可以用dlsym(RTLD_NEXT, functionName ).它返回functionName指示的原始库函数的指针。但是要想RTLD_NEXT这个宏有效,还必须在文件的开头加 #define _GNU_SOURCE。这样我们的代码就完成了

生成库

gcc myselect.c -fPIC -shared -o libmyselect.so

假设程序A调用过select这个函数,以前的启动参数是./A,,这个样子的话,系统会去找原始的链接库。若是变成这样启动LD_PRELOAD = ./libmyselect.so ./A

那A运行时就是调用我们写的select函数。。

对,你可以把一些常用的系统调用改成恶意代码,比如write这样的系统调用,然后注入到别人的程序中,然后别人的程序就被你倾入了,当然前提是你修改了别人的程序的链接路径。。
还有一些比较少用的用法,在某些情况下,一些特定线程的系统调用不应占过多的资源,我们可以通过这个方法让之变得高效,这个说法可能比较古怪。举个例子:
某些系统上select的实现可能与众不同,在没有fd就绪时,并不阻塞,而是忙等,这时便可以通过hook技术,在select中插入usleep,达到释放cpu的作用。当然这种用法是很少的,但也确实是骚操作。。。。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/141655.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • python源码之家_python画图代码大全

    python源码之家_python画图代码大全广告关闭2017年12月,云+社区对外发布,从最开始的技术博客到现在拥有多个社区产品。未来,我们一起乘风破浪,创造无限可能。例如:想了解python做数据可视化的工作。我们可以从互联网找一些python做数据可视化的代码进行阅读,调试和迁移。这样做的好处,突出实用性。同时,我们在结合联想的学习方法,对所用到的可视化函数,做个更深入地了解和使用。我借用《数据科学和人工智能》这个公众号,分享一…

  • pandas数据清洗详细教程_excel数据清洗工具

    pandas数据清洗详细教程_excel数据清洗工具Pandas数据清洗常见方法01读取数据df=pd.read_csv(‘文件名称’)02查看数据特征df.info()03查看数据量df.shape04查看各数字类型的统计量df.describe()05去除重复值df.drop_duplicates(inplace=True)06重置索引data.reset_index(inplace=True,drop=True)07查看缺失值信息data.loc[data[‘列名’].isnull()]01

  • 《前端运维》一、Linux基础–02用户与权限

    其实说真的,这些基础挺枯燥的,内容呢绝大多数都是些静态的。上一篇文章我们学习了基本的指令和vim编辑器的操作方法。这篇文章我们主要来学习下Linux中用户的概念和权限相关的知识。一、用户与用户组

  • django自定义用户认证_编写一个自定义异常类

    django自定义用户认证_编写一个自定义异常类前言如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的源码分析源码的入口在APIView.py文件下的di

  • Visual Studio 2012 Ultimate旗舰版序列号

    Visual Studio 2012 Ultimate旗舰版序列号VisualStudio2012Ultimate旗舰版序列号:YKCW6-BPFPF-BT8C9-7DCTH-QXGWCYQ7PR-QTHDM-HCBCV-9GKGG-TB2TM转载于:https://www.cnblogs.com/jiayue360/p/3166844.html

  • 宽字节注入讲解

    宽字节注入讲解我讨厌现在的自己,一边压抑着自己的情绪,一边装作没事的样子,一到深夜就彻底崩溃了,天亮后还要微笑面对生活。。。—-网易云热评一、原理1、单字节字符集:所有的字符都使用一个字节来表示,比如ASCII编码(0-127)2、多字节字符集:在多字节字符集中,一部分字节用多个字节来表示,另一部分(可能没有)用单个字节来表示。3、宽字节注入是利用mysql的一个特性,使用GBK编码的时候,会认为两个字符是一个汉字二、addslashes()函数1、addslashes(..

    2022年10月14日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号