首页 > 其他分享 >多线程中frida定位关键线程的方法

多线程中frida定位关键线程的方法

时间:2024-04-25 11:26:29浏览次数:16  
标签:create internal 线程 pthread tid frida 多线程

pthread_create 会先得到一个pthread_internal_t结构体

最后会调用__pthread_internal_add并将返回值赋给pthread_create的第一个参数thread_out

__pthread_internal_add 会将传入的 pthread_internal_t 加入到g_thread_list全局线程列表中,然后将传入的pthread_internal_t返回,也就是pthread_internal_t实际就等于pthread_t,最后对应的就是pthread_create的第一个参数。

pthread_internal_t 结构体的第三个字段就是创建线程对应线程idtid,64位系统中对应的偏移就是0x10

使用fridahook多线程程序的时候,如果不知道关键线程的start_routine起始地址,但是可以获得关键线程的tid,如果这个时候需要定位到关键线程的调用pthread_create的位置和start_routine的话就可以hook pthread_create并得到返回的tid,然后看是否是关键线程的tid。

var pthread_create_addr = Module.findExportByName("libc.so", "pthread_create");
Interceptor.attach(pthread_create_addr, {
    onEnter:function(args){
        pthread_arg0 = args[0]
        pthread_arg2 = args[2]
    },onLeave:function(){
        try{
            console.log("(tid : ", pthread_arg0.readPointer().add(0x10).readU32(), ")", "pthread_create : ", pthread_arg2.sub(libsgmainso_module));
        }catch(e){
        }
    }
})

标签:create,internal,线程,pthread,tid,frida,多线程
From: https://www.cnblogs.com/revercc/p/18157194

相关文章

  • 多线程如何和连接池交互获取数据?
    在多线程环境中使用连接池来获取数据库连接时,每个线程都可以从池中请求一个连接,然后使用这个连接来执行数据库操作。由于连接池会管理连接的创建和回收,因此它可以有效地减少数据库连接的创建和关闭次数,从而提高性能。以下是一个简单的例子,展示了如何在多线程环境中使用连接池来获......
  • 多线程、分布式处理事务
    分布式事务涉及到多个独立的数据库系统或者多个独立的事务处理,它们需要在一个全局事务中协调一致。这种事务通常用于分布式系统或者微服务架构中,其中不同的服务可能使用不同的数据库。在Python中,实现分布式事务通常需要依赖特定的分布式事务管理器或者框架。例如,可以使用两阶段......
  • C#ManualResetEvent 在线程中的使用
    ManualResetEvent用于表示线程同步事件,可以使得线程等待信号发射之后才继续执行下一步,否则一直处于等待状态中。ManualResetEvent的常用方法构造函数ManualResetEvent(bool);ManualResetEventmanualResetEvent=newManualResetEvent(false);//false将初始状态设......
  • HarmonyOS 实战开发-Worker子线程中解压文件
    介绍本示例介绍在Worker子线程使用@ohos.zlib提供的zlib.decompressfile接口对沙箱目录中的压缩文件进行解压操作,解压成功后将解压路径返回主线程,获取解压文件列表。效果图预览使用说明点击解压按钮,解压test.zip文件,显示解压结果。实现思路在/src/main/ets/workers目录......
  • c# 多线程控制最大线程数
    假定现在存在一个对象数组,需要对数组中的每个对象进行分析,但是分析存在较长的耗时处理,那么单线程处理就显得很局限了,这里就采用多线程处理,但是多线程要控制最大线程数量。线程与线程之间有会争取CPU资源,这就会导致上下文切换,上下文切换过多,必然增加线程的执行时间,影响了整体执......
  • java线程池
    java线程池 一、线程池的7个核心参数 1.corePoolSize 核心线程数 corePoolSize是线程池中保持活动状态的最小线程数。即使线程是空闲的,它们也会一直保持在池中。当有新任务提交时,线程池会优先创建核心线程来处理任务。 2.maximumPoolSize 最大线程数 maximu......
  • 解决多线程竞争条件——临界区
    如图所示,黑色表示没有获得CPU,绿色表示获得CPU,假设为单核两线程程情况。线程1开始运行,并进入临界区,在出临界区运行过程中到了上下文切换时间。线程2获得CPU,正常运行一段时间后需要运行至临界区代码,此时,线程1位于临界区。因为不能两个线程同时位于临界区,所以线程2阻塞。线程1获......
  • Redis--单线程
    redis是单线程的吗?不是,redis的单线程指的是命令的执行是单线程的,如接收客户端请求->解析请求->进行数据读写等操作->发送数据给客户端这个过程是由一个线程(主线程)完成的。而redis程序并不是单线程,redis在启动的时候,会启动后台线程(BIO):Redis在2.6版本,会启动2个后台线程,分......
  • 线程安全
    比如有2个线程同时访问变量a同时给他赋值++操作//共享变量intcount=0; Threadt1=newThread(AddNumber);Threadt2=newThread(AddNumber);t1.Start();t2.Start();//方法用于阻塞调用线程,直到某个线程终止为止。当你想要等待另一个线程完成其任务后再继......
  • 线程池
    线程池前言在执行一个异步任务或并发任务时,往往是通过直接newThread()方法来创建新的线程,这样做弊端较多,更好的解决方案是合理地利用线程池,线程池的优势很明显,如下:降低系统资源消耗,通过重用已存在的线程,降低线程创建和销毁造成的消耗;提高系统响应速度,当有任务到达时,无需......