IDA docker化

大类
Util
技术标签
环境增强
原理研究-IDA
云服务-CI
优先级
Low
开始日期
Aug 17, 2021
状态
Maintaining
Public
Public
最后更新
Jan 29, 2022
 

封装的历程

背景

  1. 之前我封装了一波wine的dotnet docker,这次正好基于他继续封装
  1. 网上直接找到了非常新的工作,里面有封装Python的方法,直接抄过来用hhh:https://github.com/nicolaipre/idapro-docker

历程 - 把IDA在docker里面跑起来

但是我照着网上工作的步骤ida跑不起来,结果发现/root文件夹下面的IDA确实跑步起来。我想了一下,安装程序的时候都是装C盘,所以我把xcopy了进C盘,结果真的正常了
 
然后就开始配Python,但是Python也天天gg,在原始docker的builder里面他天天display检测不到X11, 在buildkit的docker里面他整天被seccomp:https://github.com/Winetricks/winetricks/issues/1525
  • 然而我本机的buildkit一开security=insecure就死机build没反应
  • 最后发现原始docker只是概率性display找不到,我做了两次entrypoint就好了
 
接着想适配IDA 7.0,但是发现ida7需要Python2.7,但是Python2.7安装方法跟3.x不一样,msi死活装不上去,提示platform不支持,但是cmd里面跑msi却是可以的,迷惑

历程 - 在GitHub actions里面构建

最后是迁移到github actions,docker的buildkit要想开insecure既需要docker/setup-buildx-action@v1里面开allow insecure,也需要docker/build-push-action@v2里面开allow: security.insecure
 

历程 - 解决IDAPython的警告问题

我们已经知道问题来自于FreeLibrary,所以我们自然是觉得尽可能修复一下比较好
  • 用插件来hook:IDAPython的加载时间比所有插件要早,因此在插件中hook不可行
  • 用插件来patch,直接去除preload的逻辑:同样不行
  • 用劫持来hook:
    • crypt32.dll死活劫持不了
    • secur32.dll确实可以劫持
      • 逆向了一波7.6sp1的其他人的patch,偷到了他们的mem scan实现
      • 同时也发现了基于delayload的DLL Redirect技术,可以只需要一个DLL完成所有的重定向操作
    • hook可以、patch也可以,windows下面也都能正常跑,但是就是不知道为什么在wine下面就崩溃,且崩溃栈不全,难以查明原因
  • 直接patch二进制文件,把preload解决一切问题(
 

历程 - 在Wine中跑起来IPython Kernel

  • IDAPython正常了,但是ipykernel却一直挂
  • 每次崩溃的RaiseException显示都是libzmq的epoll挂了,errno是Invalid Argument
    • 很显然,wine对windows的事务api的支持不全
    • 显然,就不应该用epoll,简单搜索可知zmq支持select、poll等各种poller
    • 但是pyzmq直接从bintray拉取的官方dll,因此直接开了epoll
    • 通过源码重新编译可以解决
      • python3 setup.py fetch_libzmq python3 -m cibuildwheel . --platform windows
 

问题

问题1:IDAPython无法加载,导致ida崩溃

根据 @zhangyoufu 描述,是因为wine处理引用计数不当,导致wine错误的卸载dll
python3.dll 是个空的 DLL,导出表里面都是 forward 到 python38.dll 的同名函数 wine 在处理这些 forward 条目的时候,虽然加载了 python38.dll,但是没有给 python38.dll 的引用计数 +1,所以一旦有谁触发 FreeLibrary 就会被干掉 IDA 在加载插件的过程中,对 idapython 做了特判,弄了一个特殊的步骤叫 preload(涉及到 Get/SetDllDirectory,控制 DLL 加载路径) IDA 会额外做一步 LoadLibraryW(L"...\\python38.dll"),再走普通的插件加载流程 LoadLibrary("idapython3.dll") 并触发加载 python3.dll 走完这个流程后,会FreeLibrary(python38.dll),在Windows下有引用计数保护,不会真正unload,但是Wine就gg了
 
但是我懒得写patch,所以我发现idapyswitch之后,删除掉Python3TargetDLL,即可继续正常运行hhh
 

问题2:Wine display问题

似乎Xvfb启动速度有点慢,要是紧接着&&一路跑下去容易gg,所以entrypoint执行了两次
 

问题3:License agreement问题

License由 HKEY_CURRENT_USER\Software\Hex-Rays\IDA\License XXX键值控制,XXX为license name,但是破解版license name不同。
本着正好学习ida keygen的思路,找到了http://h4ck.org.cn/2021/08/ida-pro-7-6-sp1-keygen/ 这一系列keygen,均可用;)