Bionic 学习

一、基本概况
    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函数,分配一段内存空间
        把一段机器码复制到目标进程中刚分配的内存中
        最后让目标进程执行一下注入的代码
        *被注入的代码实现了一个替换函数地址的功能
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值