MacOS - 某AllInOne开发小工具DevUtils 不完美逆向分析

查看 172|回复 11
作者:Vvvvvoid   
前言
偶然发现一块开源的 MacOS APP, 适合开发用; 功能齐全;
开源版本编译了下, 发现跟 Release 发布版本差别很大, 功能也差很多 ; 奈何 买不起付费版,于是想着简单分析分析..
软件功能介绍
  - Unix 时间转换器
  - URL编码器/解码器
  - JSON Formatter/Validator
  - JWT调试器
  - Base64编码/解码器
  - 查询字符串解析器
  - HTML实体编码器/解码器
  - 反斜杠 Escaper/Unescaper
  - UUID生成器/解码器
  - HTML预览
  - 文本差异检查器
  • ..等 42 个功能



    Untitled1 (1).gif (1.85 MB, 下载次数: 0)
    下载附件
    2022-8-15 23:28 上传

    环境信息
    DevUtils 官方下载地址:https://devutils.com/
    当前分析版本号 : 1.15(132D)
  • IDAFree
  • HopperDemo

    分析 1 : 基于About页面
    打开软化后, 可以发现 只有基本的俩个功能能用;
    其他功能都需要付费才行;
    并且付费功能的页面默认是只读状态, 修改就会弹窗, 如下图


    0000.png (296.6 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:29 上传

    关于 页面有 license 信息; 我们先从这里入手看看;


    1.png (302.11 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:30 上传

    拖入 IDA 后, 搜索下关键字, 如下
    还有意外收获, 关键字下方就是认证成功的? 难道这次轻松秒杀?


    license2.png (415.99 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:31 上传

    X 一下, 查看引用 ; 发现这三个 字符串 都是在同一个引用链路里的; 这就好办了呢;


    license3.png (588.42 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:31 上传

    在想要的 认证成功 这个点开始, 往前一直 X, X一次 下一个断点 , 直接 X 到函数头为之 ; X完之后 F9运行 ;
    程序运行之后, 点 Refresh 然后段下来了 ; 我们按照我们 前面 X 好的 路线来走 ; 走不通就改跳转;
    断点下了十多个, 实际上只改了一处跳...   Whatever ..
    看看效果 ,注册成功了 ;


    4.png (55.76 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:32 上传

    然后满怀信心的 点付费功能使用的时候, 还是不能用. 还是弹窗+付费; ...
    而且比较麻烦的是, 这个弹窗的字符串是搜不到的 ..
    分析 2 : 基于窗口事件
    一筹莫展的时候, 想到了, 能不能试试 搜索 checkLicense / validationLicense 之类的方法; 忙乎了半天 然而 没什么成效;
    突然之间, 偶然看到了 这么一个东西 ;
    我们开发GUI 程序的时候, 通常会给窗口控件绑定些函数, 比如 clickEvent/doubleClickEvent/changeEvent , 恰好, 这个软件弹框的效果也是类似于 监听 文本框 内容改变;
    然后我们找到了如下 函数列表;


    textdidchange1.png (354.03 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:34 上传

    看来是每一个功能窗口, 都有绑定一个监听函数 ; 我们选择一个 MarkDown 格式化的 这个选项跟踪下试试;


    event_fun_head.png (293.79 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:35 上传

    在函数头,下断点; 之后随便输入点东西; 然后一步一步跟;
    跟踪的过程就不多说了, 其实就是一个call 一个 call 的试 ; 判断哪个 call 是 弹框的;
    最后 定位到了 这里 ; (实际上分析的过程痛苦且漫长, 逆向这个东西嘛 , 耐心还是要有多)


    showDiaLog.png (327.88 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:36 上传

    就这么俩句 本来以为 改一下上面的跳转 绕过弹框 就解决了;
    然而改完后发现, 跳转是没有了, 但是输入的文本也没有了...... 搞过头了 ;
    我想我们一定是错过了些什么;
    我们回到函数头看看,
    看到一个可疑的 标记 ; OBJCIVAR$__TtC8DevUtils18ToolViewController_locked


    lock.png (215.55 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:36 上传

    看着像是一个全局变量+标记, 并且下面紧跟着有一个判断的大跳;


    lock_jmp.png (18.23 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:37 上传

    右面那根粗粗的绿色的就是它没有达到的的大跳,
    我们改一下这个 跳试试
    000000010003C973 jnz     short loc_10003C9AA
    000000010003C973 jz     short loc_10003C9AA
    改完之后, 再试试, 居然成功了;
    好家伙, 不用license 不用 validation 用 lock。; 又学会一个关键字;
    之后 我们 X 一个 Lock 这个地址; 看看哪些引用 ; 之后将引用这个变量的后面的一句跳转全部改成 jmp , 完事


    lock_x.png (215.15 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:37 上传

    具体修改如下:
    000000010003C13F    0x3 0F 85 E3    E9 E4 00
    000000010003C922    0x4 0F 85 62 02     E9 63 02 00
    000000010003CBB4    0x3 0F 85 A4    E9 A5 00
    000000010003D204    0x3 0F 85 E8    E9 E9 00
    改完之后效果就达成了;如下图


    success.png (185.25 KB, 下载次数: 0)
    下载附件
    2022-8-15 23:38 上传

    好了, 至此 就能 能快乐的学习了 !!
    后记
    不完美的逆向分析;
    虽然使用不影响, 但是 界面上其实还是有锁的icon图标 ,还是有 unlicense 按钮 ;  有大佬 在看看吧, 我要睡了
    Arm M1 本 的 IDA  是分析不了的,应该是因为 free 版的 IDA 不支持 arm  
    所以本次分析全是在 inter 的 x86 下 运行的,
    修改完后 也可以在 m1 上运行, 但是需要配置强制用 inter 来解释
    改完需要重新签名
    如果打不开的话 , 关闭 Mac SIP 并且 允许任意来源


    arm.png (205.77 KB, 下载次数: 0)
    下载附件
    2022-8-16 11:19 上传

    仅供研究学习使用,请勿用于非法用途
    注:若转载请注明来源(本贴地址)与作者信息。
    补充 (2021-08-20)
    又继续更了下, 算是实现完美爆破了, DEMO 按钮没有了, lock 图标也没有了, 双字节即可爆破...;
    就不详细说过程了, 看看有时间的话 把算法整整吧
    修改如下 (可以恢复掉上面之前所有的修改):
    双字节功能爆破:
    每个菜单下都维护一个变量 freeTrial 来 标记该项功能是收费还是免费的,
    正常来说前俩个功能为1 免费, 其余的都是0 收费
    我们强制将所有的赋值为 1 , 即可免费所有 (我这里使用了 mov 指令来赋值, 改成用 or 按位或指令 应该也是可以的)
    000000010004E5DE        and     al,1     >     mov     al, 1
    000000010004E5DE        0x1        24         B0
    想去掉 unlicense 按钮的话,如下:
    00000001000F58A5    0x2 75 66   90 90
    想改版权信息的话, 如下:
    000000010005836F    0x1 84  85
    00000001000584AD    0x6 0F 85 B5 08 00 00   90 90 90 90 90 90
    00000001000584BA    0x6 0F 8C FA 00 00 00   90 90 90 90 90 90
    0000000100058BDB    0x2 75 0F   90 90
    0000000100058BE0    0x2 75 0A   90 90
    00000001003B70D0
    最终效果如图:


    bea.png (633.52 KB, 下载次数: 0)
    下载附件
    2022-8-21 00:04 上传

    下载次数, 下载附件

  • eec   

    由于楼主已经说明了相关需要修改的地方,那么ARM的代码可以直接静态修改(我这边在windows下用IDA7.5打开):


    01.png (24.65 KB, 下载次数: 0)
    下载附件
    2022-8-18 20:14 上传

    在ARM代码块中搜索字符串:_TtC8DevUtils18ToolViewController


    02.png (128.75 KB, 下载次数: 0)
    下载附件
    2022-8-18 20:14 上传

    然后查找所有引用就能发现并定位:


    03.png (37.08 KB, 下载次数: 0)
    下载附件
    2022-8-18 20:14 上传



    04.png (125.78 KB, 下载次数: 0)
    下载附件
    2022-8-18 20:14 上传



    05.png (74.5 KB, 下载次数: 0)
    下载附件
    2022-8-18 20:14 上传

    那么我们来对比下x86和ARM引用的此Locked代码:


    06.png (160.34 KB, 下载次数: 0)
    下载附件
    2022-8-18 20:14 上传

    跳转第一条后对比:


    07.png (130.6 KB, 下载次数: 0)
    下载附件
    2022-8-18 20:14 上传

    那么ARM修改思路就是把BNE(对应JNZ)换成BEQ(对应JZ)即可,那么用在线ARM汇编转机器码来看看:


    08.png (41.94 KB, 下载次数: 0)
    下载附件
    2022-8-18 20:14 上传

    所以此处最终代码为:
    _text:0000000100033238 61 07 00 54     B.NE   loc_100033324   ->  60 07 00 54     B.EQ   loc_100033324
    (汇编:BEQ 236  机器码:60 07 00 54)
    其他同理,我就不再演示,全部修改完自签名即可运行
    Vvvvvoid
    OP
      


    gz7uuuuuuuuu 发表于 2022-9-3 23:51
    大佬 这个有办法解决吗,后台一段时间就会弹出来

    去弹框
    000000010007D15E jz     short loc_10007D1D9 > jnz     short loc_10007D1D9
    pdc9911   

    支持一下大佬,感谢分享思路
    shehuizhuyihao   

    膜拜大佬~~~
    feob   

    感谢分享
    Barbara   

    功能细致,都是经常需要用到的功能,谢谢!
    afak   

    早晨,学习下。
    El28PoJie   

    早安,谢谢大佬
    IKYool   

    早安,谢谢大佬~
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部