技术新讯 > 计算推算,计数设备的制造及其应用技术 > 一种基于Frida的多线程应用动态插桩与覆盖率收集方法与流程  >  正文

一种基于Frida的多线程应用动态插桩与覆盖率收集方法与流程

  • 国知局
  • 2024-07-31 22:44:17

本发明实施例涉及模糊测试,特别是涉及一种基于frida的多线程应用动态插桩与覆盖率收集方法。

背景技术:

1、随着模糊测试技术的不断进步,越来越多的软件保密性至上的应用开发商开始重视代码安全性。他们追求在不公开源代码的前提下,实施高效的模糊测试,此时就需要二进制动态插桩技术。尽管传统的二进制动态插桩技术,如基于qemu的模拟执行和基于intelprocessor trace的方法,能够实现动态插桩,但这些技术往往面临执行速度显著下降的挑战,执行速度仅为原始程序的十分之一到一半,并且这些技术对平台具有依赖性。

2、因此,有必要提供一种基于frida的多线程应用动态插桩与覆盖率收集方法以解决上述问题。

技术实现思路

1、本发明提供一种基于frida的多线程应用动态插桩与覆盖率收集方法,能够在不泄露源代码的前提下,对多线程应用程序进行高效、动态的分析和测试。

2、本发明实施例提供一种基于frida的多线程应用动态插桩与覆盖率收集方法,包括:

3、获取目标程序以及所述目标程序启动时的启动参数和环境变量;

4、初始化frida模块、interceptor拦截器、observer观察者、日志流模块以及hook入口函数指针;

5、创建一个全局hash表,当有新的线程被创建后,将所述新的线程id号添加到所述全局hash表中;

6、创建第一线程启动所述目标程序,将所述第一线程的入口地址添加到所述frida模块中;

7、实时监控所述目标程序是否启动子进程或子线程,当所述目标程序启动子进程或子线程时,获取所述子进程或子线程的id号和线程组号,并将id号添加到所述全局hash表和队列中;

8、将所述队列中新增的所述id号的子进程或子线程进行二进制插桩,当所述子进程或子线程的基本块执行完时,所述frida模块同步执行桩函数,统计覆盖率信息。

9、优选地,所述初始化frida模块包括将自身的代码地址从所述frida模块中剔除,以防止追踪自身代码造成覆盖率误报。

10、优选地,所述interceptor拦截器用于拦截所述目标程序正在执行的函数。

11、优选地,使用管道将所述覆盖率信息从各个子进程或子线程流向主收集器,并将所述覆盖率信息汇总到全局的覆盖率数组中。

12、优选地,所述实时监控所述目标程序是否启动子进程或子线程包括:

13、使用ptrace监听所述目标程序是否调用了fork、vfork、pthread_create,当所述目标程序调用了fork、vfork、pthread_create时,则所述ptrace返回所述子进程或子线程的id号和线程组号。

14、优选地,所述实时监控所述目标程序是否启动子进程或子线程包括:

15、监听所述目标程序是否创建了子进程或子线程,在所述目标程序启动时,读取所有进程或线程的id号和线程组号,循环所有进程或线程的id号,判断其线程组号是否和所述目标程序的线程组号相同,若相同则代表其是所述目标程序所创建的,所述frida模块将该有相同的线程组号的线程id保存在所述全局hash表中。

16、优选地,每当有新的进程或线程生成时,判断是否由所述目标程序所创建,若是由所述目标程序所创建,则所述frida模块将所述目标程序的线程id号添加到全局hash变量中,所述frida模块将所述进程或线程的id号添加到所述队列中。

17、优选地,启动所述目标程序时,判断是否设置了入口函数地址,若未设置所述入口函数地址,则启动新线程,采用exec的方式启动所述目标程序;若设置了所述入口函数地址,则判断所述入口函数地址是否可用,若所述入口函数地址可用则将所述入口函数地址转换为函数指针,向所述函数指针中传入相关参数以启动所述目标程序,若所述入口函数地址不可用则采用main函数以启动所述目标程序。

18、优选地,判断所述id号是进程或线程,若是进程则获取所述进程的起始代码地址,将所述起始代码地址和所述id号一起添加到所述frida模块中,若是线程则直接将所述id号添加到所述frida模块中。

19、优选地,所述frida模块获取其基本块的初始代码地址和结束代码地址后运行桩函数,所述桩函数将所述结束代码地址与所述结束代码地址的上一个代码地址做异或运算后得到唯一覆盖率id,通过所述唯一覆盖率id索引在覆盖率数组上进行加1操作。

20、与现有技术相比,本发明实施例的技术方案具有以下有益效果:

21、本发明实施例的基于frida的多线程应用动态插桩与覆盖率收集方法,包括:获取目标程序以及所述目标程序启动时的启动参数和环境变量;初始化frida模块、interceptor拦截器、observer观察者、日志流模块以及hook入口函数指针;创建一个全局hash表,当有新的线程被创建后,将所述新的线程id号添加到所述全局hash表中;创建第一线程启动所述目标程序,将所述第一线程的入口地址添加到所述frida模块中;实时监控所述目标程序是否启动子进程或子线程,当所述目标程序启动子进程或子线程时,获取所述子进程或子线程的id号和线程组号,并将id号添加到所述全局hash表和队列中;将所述队列中新增的所述id号的子进程或子线程进行二进制插桩,当所述子进程或子线程的基本块执行完时,所述frida模块同步执行桩函数,统计覆盖率信息,能够在不泄露源代码的前提下,对多线程应用程序进行高效、动态的分析和测试;

22、进一步地,使用ptrace监听所述目标程序是否调用了fork、vfork、pthread_create,当所述目标程序调用了fork、vfork、pthread_create时,则所述ptrace返回所述子进程或子线程的id号和线程组号,或者监听所述目标程序是否创建了子进程或子线程,在所述目标程序启动时,读取所有进程或线程的id号和线程组号,循环所有进程或线程的id号,判断其线程组号是否和所述目标程序的线程组号相同,若相同则代表其是所述目标程序所创建的,所述frida模块将该有相同的线程组号的线程id号保存在所述全局hash表中,从而确保目标程序创建的进程或线程一定会被frida模块所截获;

23、进一步地,所述frida模块获取其基本块的初始代码地址和结束代码地址后运行桩函数,所述桩函数将所述结束代码地址与所述结束代码地址的上一个代码地址做异或运算后得到唯一覆盖率id,通过所述唯一覆盖率id索引在覆盖率数组上进行加1操作,各线程的覆盖率信息使用线程安全的覆盖率数组来存储覆盖率信息,从而避免在多线程访问和修改共享数据时发生竞态条件。

技术特征:

1.一种基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,包括:

2.根据权利要求1所述的基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,所述初始化frida模块包括将自身的代码地址从所述frida模块中剔除,以防止追踪自身代码造成覆盖率误报。

3.根据权利要求1所述的基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,所述interceptor拦截器用于拦截所述目标程序正在执行的函数。

4.根据权利要求1所述的基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,使用管道将所述覆盖率信息从各个子进程或子线程流向主收集器,并将所述覆盖率信息汇总到全局的覆盖率数组中。

5.根据权利要求1所述的基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,所述实时监控所述目标程序是否启动子进程或子线程包括:

6.根据权利要求1所述的基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,所述实时监控所述目标程序是否启动子进程或子线程包括:

7.根据权利要求6所述的基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,每当有新的进程或线程生成时,判断是否由所述目标程序所创建,若是由所述目标程序所创建,则所述frida模块将所述目标程序的线程id号添加到全局变量中,所述frida模块将所述进程或线程的id号添加到所述队列中。

8.根据权利要求1所述的基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,启动所述目标程序时,判断是否设置了入口函数地址,若未设置所述入口函数地址,则启动新线程,采用exec的方式启动所述目标程序;若设置了所述入口函数地址,则判断所述入口函数地址是否可用,若所述入口函数地址可用则将所述入口函数地址转换为函数指针,向所述函数指针中传入相关参数以启动所述目标程序,若所述入口函数地址不可用则采用main函数以启动所述目标程序。

9.根据权利要求1所述的基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,判断所述id号是进程或线程,若是进程则获取所述进程的起始代码地址,将所述起始代码地址和所述id号一起添加到所述frida模块中,若是线程则直接将所述id号添加到所述frida模块中。

10.根据权利要求9所述的基于frida的多线程应用动态插桩与覆盖率收集方法,其特征在于,所述frida模块获取其基本块的初始代码地址和结束代码地址后运行桩函数,所述桩函数将所述结束代码地址与所述结束代码地址的上一个代码地址做异或运算后得到唯一覆盖率id,通过所述唯一覆盖率id索引在覆盖率数组上进行加1操作。

技术总结本发明提供一种基于Frida的多线程应用动态插桩与覆盖率收集方法,方法包括:获取目标程序以及目标程序启动时的启动参数和环境变量;初始化Frida模块、Interceptor拦截器、Observer观察者、日志流模块以及Hook入口函数指针;创建一个全局Hash表,将新的线程ID号添加到全局Hash表中;创建第一线程启动所述目标程序,将第一线程的入口地址添加到Frida模块中;当目标程序启动子进程或子线程时,获取子进程或子线程的ID号和线程组号,将ID号添加到全局Hash表中和队列中;目标程序运行过程中,将队列中新增的子进程或子线程进行二进制插桩。本发明提供的基于Frida的多线程应用动态插桩与覆盖率收集方法,能够在不泄露源代码的前提下,对多线程应用程序进行高效、动态的分析和测试。技术研发人员:张静宸受保护的技术使用者:上海安般信息科技有限公司技术研发日:技术公布日:2024/7/29

本文地址:https://www.jishuxx.com/zhuanli/20240730/194380.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 YYfuon@163.com 举报,一经查实,本站将立刻删除。