首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux内核如何替换内核函数并调用原始函数

替换一个已经在内存中的函数,使得执行流流入我们自己的逻辑,然后再调用原始的函数,这是一个很古老的话题了。...常见的措施有两点: 可执行代码段不可写 这个措施便封堵住了你想通过简单memcpy的方式替换函数指令的方案。...那么如果我们想用替换函数的Trick做正常的事情,怎么办? 我来简单谈一下我的方法。首先我不会去HOOK用户态的进程的函数,因为这样意义不大,改一下重启服务会好很多。...是的,修改页表项即可,即便无法简单地通过memcpy来替换函数指令,我们还是可以用以下的步骤来进行指令替换: 重新将函数地址对应的物理内存映射成可写; 用自己的jmp指令替换函数指令; 解除可写映射。...在我保存原始函数的头n条指令的时候,n到底是多少呢?在本例中,显然n是5,符合如今Linux内核函数第一条指令几乎都是callq xxx的惯例。

3.4K20

Android动态替换Application实现

ClassLoader在加载dex文件的过程中,而AndroidManifest的Application类就在dex文件中,Application通常会做一些全局的初始化工作,在加载dex之前,我们需要替换原有的...在替换Application的过程中,应该注意以下几点: 创建RealApplication,维护正常的生命周期,并进行回调。 对应用中屏蔽掉ProxyApplication,对于下层无感知。...方案实现 在AndroidManifest.xml文件中替换Application为ProxyApplication,可以使用自动化方式,或者打包方式,关于实现的具体细节此处不讨论。...替换了ProxyApplication之后,对于系统而言ProxyApplication就是应用初始化的入口,所有的回调均是在ProxyApplication中发生。...所以我们没有办法在这两个方法生命周期内进行替换为RealApplication。 这种方案,接入成本比较低,但是新系统出现之后,可能出现兼容性的问题,需要每次发布新系统之后进行相关的适配。

1.3K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux】进程替换

    今日更新了Linux的进程替换的内容 欢迎大家关注点赞收藏⭐️留言 进程程序替换 代码和现象 运行后,发现使用了ls命令,而且打印end的语句也不见了。...exec*函数的作用:让进程通过exec*函数把全新的程序替换到自己对应的代码和数据,然后执行新的程序。 exec*函数执行完毕后,后续的代码不见了,因为被替换了。...替换函数 其实有六种以exec开头的函数,统称exec*函数: int execl(const char *path, const char *arg, ...); int execlp(const...站在被替换进程的角度,本质就是这个程序由磁盘被加载到内存中了。(冯诺依曼体系) 函数解释 这些函数如果调用成功则加载新的程序从启动代码开始执行,不再返回。...如果调用出错则返回-1 所以exec*函数只有出错的返回值而没有成功的返回值。 如上图,没有lss命令,所以替换会失败。如果替换成功,就不会向后继续运行。

    8010

    linux vi 替换

    基本的替换 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky :s/vivian/sky/g 替换当前行所有 vivian 为 sky :n,$s/vivian/sky/ 替换第.../vivian/s//sky/g) 替换每一行中所有 vivian 为 sky 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符 :s#vivian/#sky/# 替换当前行第一个 vivian.../ 为 sky/ :%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/ 删除文本中的^...M 问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。.../s//str2/g 功能同上 从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作

    8.3K20

    Linux】进程替换

    进程程序替换 1、代码展示效果 首先先使用execl函数,这个比较的简单,所以我们先看这样的代码 为什么我们执行我们的程序,最后跑起来的确实ls的命令?...所以execl的作用是让我们(进程)用exec*函数,执行起来新的程序。 会替换掉原本的程序,执行我们新调用的程序。...所以exec类似于一种Linux上的加载进程。...==之前我们讲过,操作系统对于任何人来说都不会相信的,所以exec函数把一个存在磁盘外设中的代码数据能够运行起来,那就说明其中的exec*要么本身属于系统调的函数,要么就是其中的内核包括系统调用。...4、所有的替换方法以及函数参数的含义 返回值不重要,不多描述 4、1、execl l相当于是list,就是列出所有需要执行的命令行参数。

    7910

    Linux:进程替换

    一、进程替换         为什么要有进程替换呢???比方说我们想用fork创建一个子进程去帮助我们完成一个工作,这个工作我们需要封装成一个函数去使用,但难道我们每次都要自己写一个函数吗?...——>Linux中的可执行程序,是有自己的组织形式的,也就是有自己的格式的(有一张表),我们把这个格式叫做ELF ,比方说这个格式将代码段、数据段、只读数据区这些各个区域的其实地址都分好了,而main函数就在表头...1.3  探究各个程序替换的接口          一共有七个接口,其实2号手册的这个是系统调用接口,而3号手册的这六个是库函数,他们的区别就有点像exit和_exit的区别 其实库函数是做更进一步的封装...1.5.2 执行其他编译型语言或者是脚本语言       Shell脚本  本质上就是把Linux命令放在一个文件里面(后缀sh),并且文件的开头都是#!+脚本语言的解释器。   ...传递给argc 2.4 普通命令 我们普通命令就是bash让子进程去帮助我们完成,所以我们要做的其实就是  进程创建、进程退出、进程等待、进程替换  问题:子进程要去执行程序的时候,要选择exec系列的那个函数

    12210

    Android动态替换Application实现

    ClassLoader在加载dex文件的过程中,而AndroidManifest的Application类就在dex文件中,Application通常会做一些全局的初始化工作,在加载dex之前,我们需要替换原有的...在替换Application的过程中,应该注意以下几点: 创建RealApplication,维护正常的生命周期,并进行回调。 对应用中屏蔽掉ProxyApplication,对于下层无感知。...方案实现 在AndroidManifest.xml文件中替换Application为ProxyApplication,可以使用自动化方式,或者打包方式,关于实现的具体细节此处不讨论。...替换了ProxyApplication之后,对于系统而言ProxyApplication就是应用初始化的入口,所有的回调均是在ProxyApplication中发生。...所以我们没有办法在这两个方法生命周期内进行替换为RealApplication。 这种方案,接入成本比较低,但是新系统出现之后,可能出现兼容性的问题,需要每次发布新系统之后进行相关的适配。

    51130

    x86_64运行时动态替换函数的hotpatch机制

    昨天我发了一篇关于替换运行中的内核函数的文章: Linux内核如何替换内核函数并调用原始函数 :https://blog.csdn.net/dog250/article/details/84201114...我们可以任意将它替换成 jmp $4字节相对偏移 这样,代码指令流就会进入我们自己的HOOK函数里了。...由于用户态可以直接使用mprotect函数更改内存的使用权限,所以就不需要那个stub函数了。今天的这个例子,原理图如下: ?...加上ms_hook_prologue属性修饰的函数,编译好了之后,你会在函数最开头两行找到下面的 废指令 : ? 随意替换之就好。所以对于这个例子,上面图示里的n的值就是5....结果当然是先调用自己的hook函数,然后再调用原始函数咯: ? 为什么不用kprobe机制呢?kprobe的原理是 为了灵活性,使用int 3指令替换被hook的指令。

    1.1K10

    Linux进程控制】四、exec函数族——进程替换详解

    我们要想在新创建的子进程中执行其他程序,需要调用一种exec函数来拉起一个新的进程。当进程调用一种exec函数的时候,该进程的用户空间代码和数据全部被新程序替换掉,从新程序的启动例程开始执行。...调用exec函数的时候,会把当前进程的 .text 和 .data 替换为所要加载的程序的 .text 和 .data ,然后让进程从新的进程的 .text 段的第一条指令开始执行,但是进程ID不变,也就是说壳子没变...用新的进程映像替换原来的进程映像。...这里面重要的是前两个execl和execlp函数,它们都用于使用一个新的进程去替换原来的进程,也就是在新创建的进程中执行其他程序。...\n"); return 0; } 这样我们在执行exec_test程序的时候会被直接替换为 ls -lrt 进程,并且我们的测试语句printf没有打印,这说明execlp()函数执行成功后不会返回

    14710

    Linux】进程程序替换

    Linux进程程序替换也是Linux进程中非常重要的部分。我们将从什么是Linux进程程序替换,为什么要有Linux进程程序替换,以及如何实现Linux进程程序替换(原理)三个方面展开讲解。...(这就是我们所讲的进程程序替换) 一.什么是进程程序替换 进程程序替换顾名思义,就是将其他程序替换过来继续执行,主要是通过exec* 这类函数来帮助我们替换,直接来学这类函数。...二.怎样实现 进程程序替换函数其实不止一个函数,而是由六个以execl开头的函数构成的函数族,如下图: 其中,最常用的就是execl,我们就用execl为例讲解。...关于返回值问题,为什么程序替换成功,没有返回值;程序替换失败返回值为-1? 不需要,因为:exec类函数只要返回了,就一定是失败的。...四.如何利用程序替换函数调用自己写的程序 我们自己写的程序也是可执行程序,理论上也是可以使用程序替换函数进程程序替换的。

    9810

    Linux-程序替换

    文章目录: 进程控制 execl接口介绍 多进程版本程序替换 其他exec接口 接口介绍 替换本地程序 总结 前言:   在Linux系统中,进程程序替换是一种重要的操作,通过进程程序替换,...程序可以更新自己的代码和数据,让进程富有动态性和灵活性,话不多说,开始今天的话题。...在Linux下是可实现的,因为Linux给我们提供了对应的接口:   这些接口支持我们程序在运行的过程中进行程序替换,从而执行到自己想执行的程序。...下面就是带有 ‘v’ 字符的接口,实际上这个v 在参数里表示的是 const char* argv[],我们在main函数里面是见过的,也就是 命令行参数表。...程序替换 不看 是什么 语言 的程序,因为 在Linux下运行起来都是进程。  七个接口只有 execve 是系统调用,其他6个全是由此接口进行封装。   创作不易,还望三联支持博主呀~~

    10510

    初识Linux · 进程替换

    进程替换我们从如下几个点开始介绍,第一,直接看现象,第二,解释原理,第三,将代码改成多线程版本,第四,使用所有的替换函数,认识参数的含义。 废话不多说,直接进入主题。...\n"); return 0; } 根据现象,我们可以看到,第二个printf是没有被执行的,但是第一个被执行了,而我们使用到的函数,叫做进程替换函数,它一共有6种,本质上我们理解了其中的2 - 3...我们不妨使用man手册查看一下: 输入: man exec 从文档里面我们可以看到进程替换函数版本有这么多个,每个函数都有返回值,但是呢我们不必在意返回值,因为通过现象,我们看到了执行进程替换函数之后的代码都失效了...这里我们不妨设想一个点,如果PCB里面是自己替换自己的多没意思,如果.cpp文件里的PCB可以被Java替换,shell脚本替换,岂不美哉? 第二个点,exec函数的作用是什么?...exec函数本质是一个加载函数,因为有了exec函数,在Linux中就可以将程序加载进去,因为进程程序替换的本质就是将不同的程序加载到内存里面,加载靠的就是exec*函数

    9410

    替换与转置函数

    今天要跟大家分享两个经常会用到的函数——替换与转置函数!...▽▼▽ excel中的替换函数有两个:substitute/replace 转置函数:TRANSPOSE 替换函数: substitute函数的语法格式 =substitute(text,old_text...下面看一个例子: 手机号码属于私人信息,在大多数场合,是需要部分加密的,如果有一个很长的关于手机号码的列表信息,你不可能手动得一个个去调,这时候,使用替换函数批量替换就很有必要。 ?...replace函数 replace函数的语法格式 =Replace(old_text,start_num,num_chars,new_text) =replace(要替换的字符串,开始位置,替换个数,新的文本...不过replace好像使用起来没有substitute那么灵活,只能替换连续区域的本文。 转置函数: 关于转置的问题,曾经是专门有一期讲过的: excel数据转置——一维表与二维表之间的转化!

    1.5K60

    linux替换大文件内容,Linux批量替换文件内容

    今天测试人员一不小心把导航的地址改错了,大约6000多个导航文件,要通过后台配置的话也很麻烦,可以通过linux命令实现对批量文件进行内容替换,但是技术经理不在,我对linux命令不熟,没办法只好硬着头皮来...经在网上一番辛苦搜索,找到以下几个命令,并尝试执行……最终终于实现效果,哎,“书到用时方恨少”,特此针对今天的情况总结了一下Linux批量替换文件内容的命令, 第一种: 格式:sed -i “s/oldstr.../newstr/g” filesname 说明:oldstr 需要替换的旧字符串 newstr 替换后的新字符串 filesname 批量文件名称,支持正则,如:ST_*.json 案例...: 如果我想把ST_*.json下面的文件里的“today” 替换为“tomorrow”,那就是: sed -i “s/today/tomorrow/g” ST_*.json 但是这种命令有一个缺陷,就是替换的文件数量有限制...替换后的新字符串 path 文件路径名称 案例: 如果我想把/app/web/sitemap下面的文件里的“today” 替换为“tommorow”,那就是: grep today -

    8.7K30

    Linux】进程的程序替换

    2.了解程序是如何进行替换的 程序替换函数 execl 输入 man execl 查看程序替换接口 int execl(const char *path, const char *arg, ...)...ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux...程序替换的基本原理 当前的进程执行当前代码时,如果执行了函数execl等接口,就会根据你所传入的程序的路径以及你要执行的名称及选项,把磁盘当中的一个其他的程序加载到对应的内存, 用新程序的代码替换当前进程的代码段...,就会跑去执行新程序,失败了就会继续向后运行 所以execl程序替换成功不会有返回值——>如果替换失败,一定有返回值——>如果失败了,必定返回——>只要有返回值就失败了 说明不用对execl函数的返回值进行判断...替换函数 1. execl int execl(const char *path, const char *arg, ...); l 代表 list 链表 path:代表你想执行谁 (需要带路径) 执行一个程序最基本的原则为

    2K30

    R中的替换函数gsub

    R中gsub替换函数的参数如下 gsub(pattern, replacement, x, ignore.case = FALSE, perl = FALSE, fixed = FALSE,...useBytes = FALSE) 其中pattern是要替换的字符,replacement是替换成的字符,x是对应的string或string vector。...Examplers [1] "R Examples" "PHP Examples" "HTML Examples" 还有其他的一些例子来灵活使用这个函数,结合正则表达式。...分期,我们知道组织病理分期分成stage I,stage II,stage III和stage IV四个分期 接下来我们试着把组织病理分期从四个组合并成两个组,并转换成因子 我们使用gsub函数...stage) #转换成因子 stage=factor(stage) stage 可以得到下面这个两分组的因子 接下来我们试着把组织病理分期从四个组合并成三个组,并转换成因子 我们还是使用gsub函数

    3.2K20
    领券