ShadowHook原理分析
ShadowHook原理分析
初始化
无论是使用Native初始化还是Java进行初始化。最后其实都会调用到shadowhook_init方法
init的实际初始化逻辑包含如下几个过程
errno init
信号量处理初始化(sigsegv、sigbus)
enter、exit初始化
mode相关初始化
a) shared: safe_init + hub_init
b) unique: linker_init
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152int shadowhook_init(shadowhook_mode_t mode, bool debuggable) { bool do_init = false; // check是否没有初始化 if (__predict_true(SHADOWHOOK_ERRNO_UNINIT == shadowhook_init_errno)) { s ...
Shadowhook基础使用
ShadowHook
什么是ShadowHook
请看官网
ShadowHook 是一个 Android inline hook 库,它支持 thumb、arm32 和 arm64。
基础概念inline-hook
Inline-hook 通过直接修改目标函数的机器指令来实现。通常情况下,会将目标函数的开头几条指令替换为跳转指令,指向一段插入的代码。这段插入的代码可以执行额外的操作,例如记录函数参数、修改函数返回值,或者完全改变函数的执行逻辑。
——from Gemini(快说:谢谢Gemini)
Android 的Native Hook技术有两类,PLT Hook & Inline Hook
PLT Hook用于有外部的依赖库调用的Hook。
Inline Hook用于Hook内部库的调用
如下是是PLT Hook和Inline Hook的使用场景以及区别
Plt Hook
Inline Hook
shadow hook
Shadow hook是一个Inline Hook框架。
Shadow Hook基础使用Quick Start
Note: 具体可见 ...
bhook基础原理分析
BHook原理解析基础概念PLT/GOT hook
BHook是一个plt/got hook框架。
plt/got hook是指,利用动态链接过程的特点。
即——使用PLT表作为跳板查got表来查询被调用函数的地址在哪。
如果我们修改GOT表内的地址就可以实现劫持函数的执行过程。
示例
test.c
1234567#include <stdio.h>void sayHell() { printf("Hello World");}int main() { sayHello();}
PLT/GOT hook前
hook 后
Relocation
即重定位,讲符号引用转化为直接引用。
说直白点就是:
编译器在编译一个库函数调用的时候,编译器本身是不知道你调用的地址在哪,所以会直接用0填充
于此同时他会在.rela中生成一条记录(我们暂且称之为“坑位“),告知来着,哪个函数调用需要填充地址。
Relocation即填坑的过程。
静态链接
对于 ...
使用C/C++解析ELF文件
ELF文件解析
关于ELF文件我们可以看下面这张大图(总结地很到位)
Note:
由于目前x86 64位架构为主流,后续分析主要是基于Elf64进行分析、介绍
Demo 源代码地址
结构体介绍
文件包含(usr/include/elf.h)
1#include <elf.h>
准备工作
12345#include <stdio.h>int main() { printf("Hello World!");}
1gcc test.c -o test
Elf64_Ehdr
结构体
12345678910111213141516171819#define EI_NIDENT (16)typedef struct{ unsigned char e_ident[EI_NIDENT]; /* Magic number and other info */ Elf64_Half e_type; /* Object file type */ Elf64_H ...
risc-v指令架构基础
RISC-V指令基础RV32RV32I
RV32M
RV32F & RV32D
RV32A
RV32C
RV32V
RV64RV64I
RV64M & RV64A
RV64F & RV64D
RV64C
RiscV中断
分类在Riscv中中断的类型分为3种
software interrupt——软件中断
timer interrupt——时钟中断
external interrupt——外部中断
mstatus(Machine Status),维护各种状态,如全局中断使能状态。
mip(Machine Interrupt Pending),记录当前的中断请求。
mie(Machine Interrupt Enable),维护处理器的中断使能状态。
mcause(Machine Exception Cause),指示发生了何种异常。
mtvec(Machine Trap Vector),存放发生异常时处理器跳转的地址。
mtval(Machine Trap Value),存 ...
C语言内联汇编
ASM
此处的ASM指的是C语言中的asm关键字
asm关键字可以用于内联汇编代码,即在C文件中声明一部分汇编代码,最后在编译器的作用下,实现一部分C语言无法实现的功能。
概念C语言的编译过程
我们知道C语言
1.会汇编为assembly(汇编语言)
2.汇编语言会在汇编器(as)的作用下变为object文件。
3.最后通过会linker链接为elf/exe文件。
为什么需要asm
前面其实有说过asm是C语言中的一个关键字
这个关键字的功能就是使用assembly去实现一部分功能。
这里有一个问题☝️
C语言会有无法实现的功能需要assembly去实现?
有吗?没有吗?
肯定是有的
其实有很多。
我们C语言所有的能力都是基于汇编的。
如果没有汇编,那么就C语言什么都做不了。
所有的C语言特性都是基于assembly去实现的。
那么问题来了?C语言的语言特性能完成所有事情吗?
并不能,不然系统调用,系统注册,操控寄存器,控制屏幕。
这部分内容assembly能实现吗?
太能了,assembly虽然怪难写的,但是人家是正经的,所有的功 ...
Xv6 Makefile解析
Xv6 Makefile解析
XV6构建过程,概览
写在前面的话
本文主要是对xv6-riscv的Makefile进行分析
“只有读懂了Makefile才能更好理解项目的结构”
Makefile可以理解为是make的配置文件,类似的有docker的Dockerfile
分析
严格按照文件从上到下分析
变量声明
模块声明
声明了两个路径,kernel & user路径
推测这两个路径分别对应的是——“系统内核和用户程序”
12K=kernelU=user
输出文件定义,乍一看全是kernel模块的文件
(可能会疑惑为啥叫OBJS呢,因为.c文件的编译文件就是.o即object)
12345678910111213141516171819202122232425262728OBJS = \ $K/entry.o \ $K/start.o \ $K/console.o \ $K/printf.o \ $K/uart.o \ $K/kalloc.o \ $K/spinlock.o \ $K/string.o \ $K/main.o \ ...
面纱读书心得
起因
这本书我是在24/1/8凌晨读完的。
但是在此之前其实已经在我书架放了好几个月
23/10/8日是这本书加入我书架的时候
起因是由于无意间在QQ看点刷到了一条视频,讲解了这本书。
当时我记得讲的是这本书的狗血剧情——“你纵使深情也抵不过那句——死去的是那条狗“
(这里讲述的是男主卑微的婚姻)(在我看完以后发现和解说解释的完全不一样)
具体链接我已经找不到了
既然看了当时的视频讲解,我为什么要看这本书呢?
因为当时我被故事的背景吸引了,我所见的以中国为背景的小说太少了。
故事的内容也是新奇。所以它很不意外地就出现在我书架上了。
感悟为什么书名叫《面纱》
我想封面已经透露了——
“以爱情为名的面纱,遮住了生活的全部”
当然我从网上也搜集了一部分资料有如下观点
1.来源于雪莱的一首诗
别揭开那些活着的人们用来形容生活的彩色面纱,尽管这上面都是些不真实的假象,它只是用随意涂抹的色彩,模拟着我们能够相信的一切事物,在它后面隐藏着恐惧与希望,交织着不同的命运
讲述人性的扭曲,虚伪
2.来源于剧情需要
剧情中女主角一直和她的 ...
xv6内核构建
xv6内核构建概念
xv6
Xv6是由麻省理工学院(MIT)为操作系统工程的课程(代号6.828),开发的一个教学目的的操作系统。
——百度文库
准备设备:Win11
环境:WSL2
WSL 版本: 2.0.14.0内核版本: 5.15.133.1-1WSLg 版本: 1.0.59MSRDC 版本: 1.2.4677Direct3D 版本: 1.611.1-81528511DXCore 版本: 10.0.25131.1002-220531-1700.rs-onecore-base2-hypWindows 版本: 10.0.22631.2861
Linux:Debian
Linux foolish-pc 5.15.133.1-microsoft-standard-WSL2 #1 SMP Thu Oct 5 21:02:42 UTC 2023 x86_64 GNU/Linux
源码:XV6
环境配置
Note: WSL环境配置略
源代码下载
本文主要是对RISC-V架构的xv6)项目进行构建
Risc-V工具链下载
源代码下载
1git clone https:/ ...
动态链接过程分析
动态链接执行过程动态链接的执行分两类
首次会从plt表跳got.plt表,最后通过链接器写入got.plt,调用实际函数
之后访问会直接从plt表跳转到实际函数
概念 & 基础分析
GOT
GOT全称 Global Offset Table 全局偏移表
GOT包含两部分
.got (存放全局变量)
.got.plt (存放函数引用地址)
plt
.plt 主要用于懒惰绑定,执行时负责解析函数地址并填充 .got.plt。
plt.got
.plt.got 是一个结合了 .plt 和 .got 的 section。
它包含了 .plt 中的包装器,并在执行时填充 .got.plt 和 .got。这样,第一次调用时,函数地址被填充到 .got.plt 和 .got,后续调用直接跳转到 .got 中的地址。——ChatGPT
关于plt.got & plt差别可见StackOverflow
The difference between .plt and .plt.got is that .plt uses lazy binding and . ...