android多线程的本质,[原创]分析unidbg(unidbgMutil)多线程机制

本文深入分析了unidbg多线程的创建机制,探讨了Android如何创建多线程,特别是在unidbg中如何模拟线程创建。通过解析pthread_create和clone系统调用,理解了线程栈分配、子线程函数地址和参数的设置。文章还介绍了在unidbg中实现阻塞和唤醒功能,涉及futex系统调用的关键点。尽管作者在调用一个多线程SO时遇到困难,但通过unidbg的调试方法,对unidbg的理解得到了深化。
摘要由CSDN通过智能技术生成

unidbg多线程分析

一. 概述

由于在工作中遇到了某翻译so中有多线程调用,因此使用unidbg分析(基于unidbgMutilThread)并增加阻塞唤醒机制(futex系统调用),但仍未调用成功,因此本文概述对unidbg多线程的理解、android多线程的创建流程、实现简单的阻塞唤醒、以及近段时间分析的总结,也希望大神网友能提出宝贵意见及分析方向,文末会有相关内容。

二. 准备

相关源码路径

三. 开始分析

3.1 unidbgMutil的多线程创建分析

我们知道,在C中创建一个线程是要用到pthread_create这个函数的,这个函数简单来说,在用户空间通过mmap为子线程分配线程栈空间,在底层的是使用了clone这个系统调用创建线程。

因此unidbgMutil也选择在clone这个系统调用里面实现自己的线程创建。

这里可以看到,在clone的系统调用里,我们取出了R1寄存器的值,然后又通过R1取得了fn、arg,接着创建一个LinuxThread对象,并把当前线程id和这个对象绑定在一起,存入全局的threadMap中。然后在LinuxThread里保存当前cpu上下文,保存线程栈,通过 arg.getPointer(48) 获取子线程函数的地址。通过this.arg.getPointer(52) 获取子线程参数的地址。

d585a4744630ecf94ae4381198533bb7.png

其实到这里,我们需要分析一下,child_stack的连续取地址,arg的pointer 48,52的偏移究竟是什么,不然我们后续增加功能,修改代码,就会一头雾水。

3.2 Android 多线程分析

前边简单概述了pthread_create的相关内容,但如果要了解unidbg的多线程实现,我们则要详细分析Android是如何创建多线程的。我们看代码

6c550ff34f2ed384beddb86aed93e8f1.png

我们知道pthread_create一共有4个参数,这里要关注第三和第四个参数,也就是子线程函数的地址和参数。代码块1 调用了__allocate_thread函数,传入thread变量(pthread_internal_t结构体,很重要),和child_stack指针。

4f662ceb68ffc0147c81660408e227cd.png

进入后我们发现,这个函数的作用其实就是为我们的子线程,开启一份栈空间,attr->guard_size是线程栈的保护区域这里是4k,__create_thread_mapped_space函数内部通过mmap系统调用,分配出一份匿名、私有的空间供子线程使用。然后将分配的内存大小,栈顶地址,赋值给threadp即pthread_internal_t。

a82bea8ace614332a5ed40b9275d70e7.png

到这里我们的栈空间已经分配完成,接下来就要进行子线程函数地址和参数的分配。也就是我们看到的在pthread_create代码块2那里,将start_routine和arg全都赋值给thread这个变量。然后就调用到clone这个函数。

clone

通过查阅资料,linux中进程和线程的创建在内核中都是通过cl

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值