多线程中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){
}
}
})

浙公网安备 33010602011771号