如何使用 Logos 优雅的注入 Mac app

2018-02-10  本文已影响0人  0x11901

前言

Logos 是 Theos 的一个组件,它允许程序员使用一组特殊的预处理器指令来编写钩子,简洁高效。
做过 iOS 逆向开发的朋友应该非常熟悉,这里笔者将介绍如何在 Mac app 上使用 Logos。

可能用到的工具

  1. Theos
  2. optool/insert_dylib
  3. unsign (optional)

一个简单的例子

我们的目标是注入 sayHi 这个方法,使点击按钮之后不再说“hi!”,而是“hello world!”

将以上代码保存为一个 Tweak.xm 文件(名字后缀名随意),放在与 SayHi.app 同级目录下,便于后续操作。

如果你的 Mac app 没有签名的话,此时应该已经达成我们的需求了。但是实践中我们肯定不是对自己导出的未签名 Mac app 下黑手。所以需要去掉这个签名或重签名。因为笔者没有钱买开发者账号,故不知道如何重签名。

此时我们的需求已经达成

大成功

但是 codesign 有一个 bug,在删除代码签名之后没有修复 MachO Header 的偏移,会导致生成的 MachO 文件畸形。笔者曾经就遇见一个不到 1m 的小程序在移除签名后膨胀到 2g 大小。
所以笔者建议使用开源社区的代替方案——unsign

后记

笔者把上面的繁琐命令行操作整合为一个脚本,在这里也顺便分享出来

#!/usr/bin/env bash

#将xm和文件app包放在同一个目录,运行本脚步进行注入

path=`ls | grep *.app | head -1`
tweak=`ls | grep *.xm | head -1`
temp='x11901'
name=${path%.app}

$THEOS/bin/logos.pl "./${tweak}" > "./${temp}.m"
clang -shared -undefined dynamic_lookup -o "./${path}/Contents/MacOS/lib.dylib" "./${temp}.mm"
optool install -c load -p @executable_path/lib.dylib -t "./${path}/Contents/MacOS/${name}"

rm -f ${temp}.m

# 使用unsign效果可能更好,codesign --remove-signature 在删除代码签名之后没有修复MachO Header的偏移,导致生成的MachO文件畸形
# codesign --remove-signature ${name}
if [ ! -e "./${path}/Contents/MacOS/${name}.ori" ]; then
    unsign "./${path}/Contents/MacOS/${name}"
    mv "./${path}/Contents/MacOS/${name}" "./${path}/Contents/MacOS/${name}.ori"
    mv "./${path}/Contents/MacOS/${name}.unsigned" "./${path}/Contents/MacOS/${name}"
fi

open "./${path}/Contents/MacOS/${name}"

下载 Demo

上一篇 下一篇

猜你喜欢

热点阅读