多线程中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){
        }
    }
})
posted @ 2024-04-25 11:12  怎么可以吃突突  阅读(30)  评论(0编辑  收藏  举报