首页 > 其他分享 >Qemu中helper机制的理解

Qemu中helper机制的理解

时间:2023-08-09 10:33:41浏览次数:27  
标签:afl log HELPER maybe 理解 helper Qemu name

因为项目中准备使用AFL++ + Qemu下,所以研究了其中AFL++下的Qemuafl的源码,其中插桩的方式与AFL原理一样,但是代码相差很大,因此记录一下。

qemuafl中桩点基本逻辑
1) qemuafl是AFL++直接fork了一份Qemu的源码,在Qemu的源码中直接进行代码修改。
2) 其中使用每个基本块的PC来作为每个基本块的桩点信息。
3) qemuafl直接在TCG的翻译阶段,将桩点代码生成为IR指令,嵌入到每个基本块的TCG-IR开始。
4) 这样子在执行TCG-IR的时候,装点代码就被直接运行了,很巧妙。

qemuafl中将桩点代码插入TCG-IR的方式即使用了Qemu的helper机制,以下说明helper机制。
参考:[http://blog.terrynini.tw/en/2021-QEMU-AFL-and-TCG/]()

1)首先进行宏声明
    DEF_HELPER_FLAGS_1(afl_maybe_log, TCG_CALL_NO_RWG, void, tl)

2)DEF_HELPER_FLAGS_1的声明在两个地方(没太明白qemuafl为啥这么做!!!)
     exec/helper-proto.h

     #define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
     dh_ctype(ret) HELPER(name) (dh_ctype(t1));

3) 但是在exec/helper-proto.h文件的末尾,又使用了#undef DEF_HELPER_FLAGS_1

4) 实际定义的地方
    exec/helper-gen.h
    #define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
   static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \
        dh_arg_decl(t1, 1)) \
   { \
         TCGTemp *args[1] = { dh_arg(t1, 1) }; \
         tcg_gen_callN(HELPER(name), dh_retvar(ret), 1, args); \
    }
5) 宏定义中,调用了tcg_gen_callN函数,这个函数是作用是生成IR指令。这个函数的第一个参数HELPER(name),
   其作用是生成一个helper作为前面的函数名,对于name为afl_maybe_log,则这里的HELPER(afl_maybe_log)
    就是helper_afl_maybe_log,并将这个函数生成IR指令。
6) 而宏DEF_HELPER_FLAGS_1,对于name为afl_maybe_log,则声明一个名为gen_helper_afl_maybe_log的函数。
7) 总结来说,gen_helper_afl_maybe_log函数是为了生成名为helper_afl_maybe_log的函数调用的IR指令。

标签:afl,log,HELPER,maybe,理解,helper,Qemu,name
From: https://www.cnblogs.com/youyipin/p/17616198.html

相关文章

  • 言语理解
             ......
  • 考试英语阅读理解需要全部阅读完吗?
    一般英语考试中阅读理解占分比是挺大的,以高考英语为例。  高考英语题型及分值分布情况如下:  首先听力共有两个部分,总分是30分;第一部分每小题1.5分,共7.5分。第二部分每小题1.5分,共22.5分。  其次是阅读理解,总分是40分。  然后是语言知识运用,总分是4......
  • hadoop组件---spark实战-----airflow----调度工具airflow定时运行任务的理解
    我们在前面已经初步了解了airflow:hadoop组件—spark实战-----airflow----调度工具airflow的介绍和使用示例但是我们开始尝试使用airflow的定时任务的时候,常常遇到一个尴尬的情况,任务没有成功运行,或者说设置开始时间是今天,但是明天才开始运行。本篇文章尝试说明其中的......
  • 【代码块】-Helper-GZIP
    整理代码块代码块整理后存储,供后期使用usingSystem;usingSystem.IO;usingSystem.IO.Compression;usingSystem.Text;publicclassGzipHelper{///<summary>///GZIP解压缩///</summary>///<paramname="data"></param>/......
  • 【代码块】-Helper-开机启动
    整理代码块代码块整理后存储,供后期使用usingMicrosoft.Win32;/*这段代码可以用于将一个程序设置为开机启动项,或者从开机启动项中移除*/publicclassStartupHelper{///<summary>///设置开机启动项///</summary>///<paramname="enabled">是否......
  • soso地图api接口地理解析geocoder检索示例----并在信息框显示经纬度
    api官网:http://api.map.soso.com/doc_v2/example.html?sample-geocoding-simple#8map示例代码如下(保存为html打开可见效果):<!DOCTYPEhtml><html><head><metahttp-equiv="Content-Type"content="text/html;charset=utf-8"/><title>......
  • Spring-1-深入理解Spring XML中的依赖注入(DI):简化Java应用程序开发
    学习目标前两篇文章我们介绍了什么是Spring,以及Spring的一些核心概念,并且快速快发一个Spring项目,以及详细讲解IOC,今天详细介绍一些DI(依赖注入)能够配置setter方式注入属性值能够配置构造方式注入属性值能够理解什么是自动装配一、依赖注入(DI配置)1依赖注入方式【重点】......
  • Spring-2-透彻理解Spring 注解方式创建Bean--IOC
    今日目标学习使用XML配置第三方Bean掌握纯注解开发定义Bean对象掌握纯注解开发IOC模式1.第三方资源配置管理说明:以管理DataSource连接池对象为例讲解第三方资源配置管理1.1XML管理Druid连接池(第三方Bean)对象【重点】数据库准备--创建数据库createdatabaseifno......
  • Spring-2-深入理解Spring 注解依赖注入(DI):简化Java应用程序开发
    今日目标掌握纯注解开发依赖注入(DI)模式学习使用纯注解进行第三方Bean注入1注解开发依赖注入(DI)【重点】问题导入思考:如何使用注解方式将Bean对象注入到类中1.1使用@Autowired注解开启自动装配模式(按类型)@ServicepublicclassStudentServiceImplimplementsStuden......
  • Linux异步通知---fasync_helper()、kill_fasync()函数介绍与使用
    转载:Linux异步通知---fasync_helper()、kill_fasync()函数介绍与使用_面朝大海0902的博客-CSDN博客一、fasync_helper()与kill_fasync()函数应用程序通过fcntl置FASYNC标志位,触发对应驱动文件的fasync()函数执行(上节有解释原因Linux异步通知—signal()、fcntl()函数介绍与使用),该......