Ghidra 魔改

大类
逆向
Util
技术标签
开发-逆向工具
优先级
High
开始日期
Feb 16, 2023
状态
Accumulative
Public
Public
最后更新
Mar 10, 2023
 

TL;DR

魔改版下载

ghidra_mod
NyaMistyUpdated Apr 17, 2023
可以直接使用CI自动编译出来的包(全平台)
ghidra_mod-ci
NyaMistyUpdated Apr 29, 2023

UI配置

  • (配置好了快捷键、UI布局、基本设置)
 
(旧,现已集成到Ghidra中)RemapCtrl脚本: https://gist.github.com/NyaMisty/dfd8fd9271f70122fb2f83a698baf59d
  • 用于解决Meta键的兼容问题

UI配置&魔改:越像IDA越好

简单UI配置

  • 自动高亮
  • 调整Listing中Field的大小

快捷键配置(KeyBinding)

整合已有的快捷键

  • Ghidra的Keybinding导出后格式为kbxml,在GitHub上面搜索可以找到4个kbxml

Meta键兼容层

需要处理Meta键的兼容,否则同一份快捷键KeyBinding在Windows和Mac上操作体验会差很多:
  • 把所有的Ctrl键KeyBinding转成Meta
  • 把Meta键映射到对应的Ctrl或CommandKey上
旧方案:通过Ghidra Jython Script
新方案:直接整合到GhidraMod中
 

Ghidra功能魔改

修复:魔改Inline逻辑(202302)

  • 通过git am来apply 他的patch
    • git am -3 << XXX 来解决冲突
    • 最后一个commit git am -3也解决不了,在git am后使用patch -p1 --merge好后 git am --continue

修复:MachO Loader PTR_64 Chained Fixup(202302)

Temp fix for PTR_64 DYLD Chained Fixup
  • PTR_64重定位不应该加上imageBase,加了个判断

修复:快捷键弹Multi Action(202302)

  • 修正反编译中按Y:限制在decompiler里,只有对着function identifier时候才能edit signature
Change "Edit Function Signature" enable case in decompiler
  • 修正Listing中按N:原来判断是在Function上按N的时候不触发Edit Label,现在限制在全局变量上面按N的时候也不触发Edit Label

修复:Windows下按空格无法打开Function Graph(202303)

  • 原因:快捷键SPACE同时被其他Action占用

修复:Esc无法关闭很多窗口(202303)

  • 对DetachedWindowNode增加ESCAPE的响应callback

新功能:Xref框改为模态对话框(202303)

  • 和IDA功能相同
  • 困难:需要处理LocationReferencesProvider自动复用的问题(他自己手搓了个pool)

修复:快捷键弹Multi Action(202303)

  • 修复Listing按H:Convert to Decimal/Hex共用
    • 限制仅当当前data type和目标状态不同时启用
 



Ghidra编译基础设施

基础设施:CI

加速CI

  • 基于roblala的ghidra-ci魔改
  • 原版速度慢,需要buildNative、再build java层、再sleighCompile,最后打包
  • 修改后,同时buildNative、编译Java、编译JavaDoc、编译Sleigh,最后打包

Scoop支持

重新针对于我的ghidra魔改版本增加了scoop repo
 

基础设施:自动Merge上游

  • 上游的修改很频繁(一天很多次),不可能手动同步
  • 原来在其他repo尝试过rebase、merge
    • rebase:
      • 优点:保持upstream的commit id
      • 缺点:如果我魔改的commit比较多,那么每次就会有巨多的commit rebase
    • 反着rebase:
      • 优点:保持我魔改的commit id
      • 缺点:完全无法track上游
    • merge:
      • 优点:保持upstream的commit id
      • 缺点:会带来mergecommit,导致log里出现很多个自动merge的commit,不好rebase
  • 考虑之后决定还是用merge,但是避免出现多个AutoMerge commit
    • 加入检查,如果上一个commit就是automerge,那么就drop掉重新automerge一次