动机 - FunctionInliner的不足想法 - 通过Function Chunk + Patch Microcode实现准备 - 让Func Trunk出现在microcode中开发 - 初始版本开发 - v1.1 支持连续func chunk
动机 - FunctionInliner的不足
- 2022的IDA Plugin Contest出现了这个插件:https://github.com/cellebrite-labs/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
开发 - v1.1 支持连续func chunk
由于通过func chunk追踪并不完全可靠