多线程中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
使用frida
hook多线程程序的时候,如果不知道关键线程的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){
}
}
})