HexFuncInliner - FunctionInliner跨平台版

大类
逆向
Util
技术标签
原理研究-IDA
开发-逆向工具
优先级
High
开始日期
Jun 23, 2022
状态
Finalized
Public
Public
最后更新
Jun 24, 2022

动机 - FunctionInliner的不足

  • 可以应对clang的-moutline,但是:
    • 仅支持arm64
    • 基于asm patch实现,难以迁移到其他平台(代码量十分庞大)
 

想法 - 通过Function Chunk + Patch Microcode实现

  • Function Chunk实际上更加适合用来描述outline function
    • outline func具有的特点,func chunk全部具备
      • IDA中的Func Trunk可以被多个函数共用,outline func也可
      • IDA的Func Trunk可以无限多个,outline func也可
      • outline func像是parent func的一部分,func chunk也是
  • 我们将outline func加入func chunk,在microcode里修复控制流,就可以直接修复控制流
 

准备 - 让Func Trunk出现在microcode中

  • 对于call到func trunk里面这样的行为,HexRays似乎并不太接受,直接无视了对应块的生成
    • 实际上,这意味着fl_CN和fl_CF类xref类型不会被HexRays解析
  • 将call指令的xref换位fl_JN,反编译器则会将目标func trunk纳入到生成范围中
    • 这样却导致了本应该生成为 m_call 的指令变为了 m_goto
  • 通过将xref换到别的非call指令上,可以让HexRays正常生成call和func trunk
 

开发 - 初始版本

复制粘贴Nollvm的代码,使用完全一致的思路:
  • 根据func chunk的range需要复制的mblock
  • 处理func chunk的mblock结尾
    • 分为goto跳出、jcnd跳出、jcnd fallthrough、return
    • 仅处理return
效果初步不错,但是问题是,如果有三个连着一起的func chunk,会被合并为一个,导致无法使用range区分不同的chunk
notion image
 

开发 - v1.1 支持连续func chunk

由于通过func chunk追踪并不完全可靠
notion image
notion image