1.下载代码

git clone https://github.com/gaffe23/linux-inject.git
cd linux-inject
make

2.开启2个终端,其中一个终端执行

cd ~/workspace/linux-inject,运行./sample-target

另外一个终端执行

sudo ./inject -n sample-target sample-library.so

注入sample-library.so到一个进程中,进程是通过-n name指定的sample-target。如果你需要注入到指定PID的进程,你可以使用-p PID的方式。

但这有可能无法工作,因为Linux3.4中有一个名为Yama的安全模块可以禁用 ptrace-based代码注入(或者是在代码注入期间有其他的拦截方式)。要想让它在这种情况下正常工作,你需要运行这些命令之一(出于安全考虑,我更喜欢第二个):再次尝试注入,你会在sample-target输出的“sleeping…”中看到“I just got loaded”。

echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope # 允许任何进程注入代码到相同用户启动的进程中,root用户可以注入所有进程echo 2 | sudo tee /proc/sys/kernel/yama/ptrace_scope # 只允许root用户注入代码

3.向目标进程注入自己实现的代码

#include <stdio.h>
__attribute__((constructor)) void hello()
{    puts("Hello world!");
}

这段C语言代码应该很容易理解,attribute((constructor))可能会使人迷惑。它的意思是说在函数库加载之后尽快运行这个函数。换句话说,这个函数就是要注入到进程中的代码。

编译:

gcc -shared -fPIC -o libhello.so hello.c

首先需要运行sample-target,然后我们尝试注入:

sudo ./inject -n sample-target libhello.so

在长串的“sleeping…”中你应该会看到“Hello world!”。
4.延伸问题
如果你尝试循环puts(“Hello world!”);,它会不断打印"Hello world!",主程序在注入的library结束之前不会恢复运行。也就是说,你不会再看到“sleeping…
要解决这个问题,你可以将注入的代码运行在单独的线程中,例如下面这段修改的代码:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
void* thread(void* a) {while (1) {puts("Hello world!");usleep(1000000);}return NULL;
}
__attribute__((constructor))
void hello() {pthread_t t;pthread_create(&t, NULL, thread, NULL);
}

它应该可以正常工作。但如果你注入sample-target,因为sample-target并没有链接libpthread这个库,因此,任何使用pthread的函数都不能正常工作。当然,如果你通过添加参数-lpthread链接了libpthread,它会正常工作。
如果我们不想重新编译目标程序,我们也可以使用一个linux-inject所依赖的函数:__libc_dlopen_mode()。为什么不是dlopen(),因为dlopen()需要链接libdl,而__libc_dlopen_mode()包含在标准C库中(这里是glibc).
这里是代码样例:

#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <dlfcn.h>
/* Forward declare these functions */
void* __libc_dlopen_mode(const char*, int);
void* __libc_dlsym(void*, const char*);
int   __libc_dlclose(void*);
void* thread(void* a) {while (1) {puts("Hello world!");usleep(1000000);}
}
__attribute__((constructor))
void hello() {/* Note libpthread.so.0. For some reason,using the symbolic link (libpthread.so) will not work */void* pthread_lib = __libc_dlopen_mode("libpthread.so.0", RTLD_LAZY);int(*pthread_lib_create)(void*,void*,void*(*)(void*),void*);pthread_t t;*(void**)(&pthread_lib_create) = __libc_dlsym(pthread_lib, "pthread_create");pthread_lib_create(&t, NULL, thread, NULL);__libc_dlclose(pthread_lib);
}

linux-inject:注入代码到运行的Linux进程中相关推荐

  1. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 三 | 等待远程函数执行完毕 | 寄存器获取返回值 )

    文章目录 前言 一.等待远程进程 mmap 函数执行完毕 二.从寄存器中获取进程返回值 三.博客资源 前言 前置博客 : [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | ...

  2. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 二 | 准备参数 | 远程调用 mmap 函数 )

    文章目录 一.准备 mmap 函数的参数 二.mmap 函数远程调用 一.准备 mmap 函数的参数 上一篇博客 [Android 逆向]Android 进程注入工具开发 ( 注入代码分析 | 远程调 ...

  3. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )

    文章目录 一.获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 二.从 /proc/pid/maps 文件中获取 指定 进程 中的 /system/l ...

  4. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 远程调用 目标进程中 libc.so 动态库中的 mmap 函数 一 | mmap 函数简介 )

    文章目录 一.mmap 简介 二.mmap 函数作用 一.mmap 简介 mmap 函数的作用是 将 文件 映射到 内存中 , 映射的单位必须是 PAGE_SIZE ; mmap 函数引入头文件 : ...

  5. linux常见的几种运行级,linux有几种运行级别

    运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行级别2:多用户状态(没有NFS) 运行级别3:完全的多 ...

  6. 如何向Linux内核提交代码,华人教授向 Linux 内核提交含 Bug 代码,Linux 管理员直接拉黑整所大学!...

    技术编辑:小魔丨发自 思否编辑部公众号:SegmentFault Linux 内核是目前最大的软件项目之一,拥有 2800 万行代码.世界各地的贡献者每天向 Linux 内核管理员提交大量 patch ...

  7. linux查询某域线程是否满了,Linux多线程编程的时候怎么查看一个进程中的某个线程是否存活...

    pthread_kill: 别被名字吓到,pthread_kill可不是kill,而是向线程发送signal.还记得signal吗,大部分signal的默认动作是终止进程的运行,所以,我们才要用sig ...

  8. 用VC写Assembly代码(6)--附录2[windows进程中的内存结构]

    在阅读本文之前,如果你连堆栈是什么多不知道的话,请先阅读文章后面的基础知识. 接触过编程的人都知道,高级语言都能通过变量名来访问内存中的数据.那么这些变量在内存中是如何存放的呢?程序又是如何使用这些变 ...

  9. linux代码怎么运行gedit,Linux中gedit命令起什么作用呢?

    摘要: 下文讲述Linux中gedit的功能说明,如下所示: gedit命令是GNOME桌面环境中的官方文本编辑器 gedit命令功能: 用于创建和编辑各种文本文件 gedit命令的语法格式: ged ...

  10. linux 内核 核心代码,8分钟掌握Linux内核分析的核心科技

    原标题:8分钟掌握Linux内核分析的核心科技 作者: OUYANG_LINUX007 来源: http://blog.csdn.net/ouyang_linux007/article/details ...

最新文章

  1. 【带你重拾Redis】Redis持久化
  2. Shell命令-文件及内容处理之split、paste
  3. 火狐浏览器添加MetaMask钱包和本地开启私有链开发
  4. bash下特殊字符的含义
  5. libssl-dev linux下载,libssl
  6. js 字符串转换成数字(转)
  7. 计算机中的基础元素,数据结构基础
  8. NOIP2017 Day1 T1 小凯的疑惑
  9. 20145238-荆玉茗 《网络对抗》免杀原理与实践
  10. 《构建之法》阅读笔记05
  11. 机器学习数学基础(1)-回归、梯度下降
  12. ae合成设置快捷键_AE中常用的快捷键,你了解多少?(五)
  13. No result defined for action com.lzj.web.action.CustomerAction and result input
  14. CPU微指令相关概念
  15. 三颗锦囊用完,苹果新iPad今年挡得住两大集团军吗?
  16. linux qt编译命令,linux下使用命令模式去编译Qt程序
  17. 清华学姐熬了一个月肝出这份32W字Linux知识手册,在 Github标星31K+
  18. [Python] wxPython 基本控件 (转)
  19. 边边角角,偶尔遇到——javascript
  20. winform实现关闭或最小化隐藏到右下脚

热门文章

  1. 常见Struts、Hibernate、Spring、J2EE、ibatis、Oracle等开发框架架构图及其简介
  2. android studio 安装sdk和android,请问android studio怎么安装sdk
  3. git 拉取某个分支到本地
  4. Redis常见的5种不同的数据类型详解
  5. 100%会问的float?
  6. [20180801]insert导致死锁.txt
  7. ubuntu18 安装 mysql5.7
  8. 一如此前的回应,王劲将景驰科技总部搬到了广州
  9. sqlite3 命令行操作
  10. apk反编译工具Jadx的使用