一、基本概况
1、不与其他libc库兼容,有自己的动态链接器(linker)
2、不支持c++异常抛出
3、一共有libc(c基础库)、libm(数学库)、libdl(假的链接库,实际是linker)、libstd++(C++功能库)、
libthread_db(多线程调试库)、linker(链接器)
二、系统调用
1、arm cpu 有7种工作模式(类比x86 ring0~ring3特权等级)
用户模式(usr):普通用户进程工作模式、权限比较受限
快速模式(fiq):用于高速数据传输或者通道处理 (硬中断)
外部中断模式(irq):用于通用的中断处理(软中断)
管理模式(svc):操作系统使用的保护模式
数据访问终止模式(abt):当数据或者指令预取终止时进入该模式
系统模式(sys):运行具有特权的操作系统任务
定义指令终止模式(und):当未定义的指令执行时进入该模式
2、用户进程通过软中断来调用系统功能
x86:软中断int80,寄存器eax存放系统调用ID,其他寄存器存放参数
arm:软中断swi0,寄存器r7存放系统调用ID,其他寄存器存放参数
三、系统内存
1、操作系统会同时管理物理内存和地址空间,物理内存与地址空间是一一对应的,分配给用户进程的是地址空间
2、linux提供brk和mmap两种内存分配函数
brk通常用于分配小的内存,mmap用于分配较大的内存块
3、dlmalloc内存分配器以链表的形式管理已使用和未使用的内存块,里面的内存块称为trunk
四、进程通信
1、匿名管道pipe,只能用于父进程与子进程之间的通信,android是支持的
2、命令管道fifo,用于更加开放的进程间通信,android不支持,android使用binder,它的原理是在文件系统上创建一个文件
五、线程管理
1、pthread的实现是基于futex(用户态进程同步)的
2、pthread_create 调用成功后不会立即发生线程切换,只能等待线程调度
3、pthread_attr 线程属性
flags:非分离式线程,当线程退出时不会释放系统资源,只有调用了pthread_join才会释放系统资源,如果是分离的,则退出时自动释放系统资源
stack_base:线程栈基地址
stack_size:线程栈大小
guard_size:线程溢出保护区大小
sched_policy:线程调度方式 SCHED_NORMAL 分时调度 SCHED_FIFO 先到先服务,一旦占用一直运行 SCHED_RR 时间片轮转
sched_priority:线程优先级
4、退出线程
pthread_exit 自己主动调用
设置全局变量,进程自己控制
pthread_kill发送线程信号
使用管道让线程睡眠在select函数中
5、线程本地存储TLS
TLS是线程的私有全局变量,键值对的形式存放在线程栈中
pthread_key_create
pthread_key_delete
pthread_setspecific
pthread_getspecific
6、线程互斥量
mutex的属性有两种 (类型)type 和 (范围)scope
PTHREAD_MUTEX_NORMAL: 不会检查锁死 android是支持的
PTHREAD_MUTEX_ERRORCHECK:会检查锁死 android不支持
PTHREAD_MUTEX_RECURSIVE:android不支持
PTHREAD_PROCESS_PRIVATE:互斥量作用于进程内
PTHREAD_PROCESS_SHARED:互斥量可以用于进程间同步
7、线程条件变量(Condition)
Condition 的属性只有一种 scope(范围) 同上
pthread_cond_init ...
8、futex 用户空间互斥体
基于共享内存实现的,android的属性就使用了这个功能,pthread_mutex也使用futex实现同步的
略
1、ELF文件有三种可执行文件、动态库(.so)、重定位文件(.o)
2、ELF文件格式:elf文件头、程序头、节区1、节区2、...、节区头部表
3、ELF文件内存映像:elf文件头、程序头、段1、段2、...、节区头部表(可选)
4、linker模块负责链接elf进入进程空间
静态链接:静态可执行程序包含了运行所需要的所有函数,链接时,系统会自动先链接crtbegin_static.o和certtend_android.o, 进程入口点在crtbegin_static.o文件的_start函数中
动态链接:动态可执行程序没有包含所需要的库文件,链接时,系统会自动先将linker模块链接,linker链接所需要的动态库并且重定位所有的符号表,然后执行自己的_start函数
5、进程初始化过程
初始化tls
初始化环境变量
初始化debuggerd_init
创建soinfo结构实例,存放elf文件的所有信息,dlopen返回的就是soinfo实例的指针
七、调试器
1、ptrace函数通常用在调试器软件中,功能很丰富,也可用于钩子注入
2、利用ptrace实现代码注入
用ptrace函数attach上目标进程
让目标进程执行mmap函数,分配一段内存空间
把一段机器码复制到目标进程中刚分配的内存中
最后让目标进程执行一下注入的代码
*被注入的代码实现了一个替换函数地址的功能
1、不与其他libc库兼容,有自己的动态链接器(linker)
2、不支持c++异常抛出
3、一共有libc(c基础库)、libm(数学库)、libdl(假的链接库,实际是linker)、libstd++(C++功能库)、
libthread_db(多线程调试库)、linker(链接器)
二、系统调用
1、arm cpu 有7种工作模式(类比x86 ring0~ring3特权等级)
用户模式(usr):普通用户进程工作模式、权限比较受限
快速模式(fiq):用于高速数据传输或者通道处理 (硬中断)
外部中断模式(irq):用于通用的中断处理(软中断)
管理模式(svc):操作系统使用的保护模式
数据访问终止模式(abt):当数据或者指令预取终止时进入该模式
系统模式(sys):运行具有特权的操作系统任务
定义指令终止模式(und):当未定义的指令执行时进入该模式
2、用户进程通过软中断来调用系统功能
x86:软中断int80,寄存器eax存放系统调用ID,其他寄存器存放参数
arm:软中断swi0,寄存器r7存放系统调用ID,其他寄存器存放参数
三、系统内存
1、操作系统会同时管理物理内存和地址空间,物理内存与地址空间是一一对应的,分配给用户进程的是地址空间
2、linux提供brk和mmap两种内存分配函数
brk通常用于分配小的内存,mmap用于分配较大的内存块
3、dlmalloc内存分配器以链表的形式管理已使用和未使用的内存块,里面的内存块称为trunk
四、进程通信
1、匿名管道pipe,只能用于父进程与子进程之间的通信,android是支持的
2、命令管道fifo,用于更加开放的进程间通信,android不支持,android使用binder,它的原理是在文件系统上创建一个文件
五、线程管理
1、pthread的实现是基于futex(用户态进程同步)的
2、pthread_create 调用成功后不会立即发生线程切换,只能等待线程调度
3、pthread_attr 线程属性
flags:非分离式线程,当线程退出时不会释放系统资源,只有调用了pthread_join才会释放系统资源,如果是分离的,则退出时自动释放系统资源
stack_base:线程栈基地址
stack_size:线程栈大小
guard_size:线程溢出保护区大小
sched_policy:线程调度方式 SCHED_NORMAL 分时调度 SCHED_FIFO 先到先服务,一旦占用一直运行 SCHED_RR 时间片轮转
sched_priority:线程优先级
4、退出线程
pthread_exit 自己主动调用
设置全局变量,进程自己控制
pthread_kill发送线程信号
使用管道让线程睡眠在select函数中
5、线程本地存储TLS
TLS是线程的私有全局变量,键值对的形式存放在线程栈中
pthread_key_create
pthread_key_delete
pthread_setspecific
pthread_getspecific
6、线程互斥量
mutex的属性有两种 (类型)type 和 (范围)scope
PTHREAD_MUTEX_NORMAL: 不会检查锁死 android是支持的
PTHREAD_MUTEX_ERRORCHECK:会检查锁死 android不支持
PTHREAD_MUTEX_RECURSIVE:android不支持
PTHREAD_PROCESS_PRIVATE:互斥量作用于进程内
PTHREAD_PROCESS_SHARED:互斥量可以用于进程间同步
7、线程条件变量(Condition)
Condition 的属性只有一种 scope(范围) 同上
pthread_cond_init ...
8、futex 用户空间互斥体
基于共享内存实现的,android的属性就使用了这个功能,pthread_mutex也使用futex实现同步的
五、log管理
略
1、ELF文件有三种可执行文件、动态库(.so)、重定位文件(.o)
2、ELF文件格式:elf文件头、程序头、节区1、节区2、...、节区头部表
3、ELF文件内存映像:elf文件头、程序头、段1、段2、...、节区头部表(可选)
4、linker模块负责链接elf进入进程空间
静态链接:静态可执行程序包含了运行所需要的所有函数,链接时,系统会自动先链接crtbegin_static.o和certtend_android.o, 进程入口点在crtbegin_static.o文件的_start函数中
动态链接:动态可执行程序没有包含所需要的库文件,链接时,系统会自动先将linker模块链接,linker链接所需要的动态库并且重定位所有的符号表,然后执行自己的_start函数
5、进程初始化过程
初始化tls
初始化环境变量
初始化debuggerd_init
创建soinfo结构实例,存放elf文件的所有信息,dlopen返回的就是soinfo实例的指针
七、调试器
1、ptrace函数通常用在调试器软件中,功能很丰富,也可用于钩子注入
2、利用ptrace实现代码注入
用ptrace函数attach上目标进程
让目标进程执行mmap函数,分配一段内存空间
把一段机器码复制到目标进程中刚分配的内存中
最后让目标进程执行一下注入的代码
*被注入的代码实现了一个替换函数地址的功能