如何使用 Logos 優(yōu)雅的注入 Mac app

前言

Logos 是 Theos 的一個(gè)組件,它允許程序員使用一組特殊的預(yù)處理器指令來編寫鉤子拢驾,簡潔高效。
做過 iOS 逆向開發(fā)的朋友應(yīng)該非常熟悉拾并,這里筆者將介紹如何在 Mac app 上使用 Logos概疆。

可能用到的工具

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

一個(gè)簡單的例子

  • 編寫一個(gè)簡單的 demo逗威,大概就是 軟件正中一個(gè)按鈕,點(diǎn)擊之后 alert("hi!")岔冀。核心代碼如下:

    #import "ViewController.h"
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        // Do any additional setup after loading the view.
    }
    
    - (IBAction)sayHi:(NSButton *)sender {
        NSAlert *alert = NSAlert.new;
        alert.messageText = @"hi!";
        alert.alertStyle = NSAlertStyleInformational;
        [alert runModal];
    }
    
    - (void)setRepresentedObject:(id)representedObject {
        [super setRepresentedObject:representedObject];
    
        // Update the view, if already loaded.
    }
    
    @end
    
    效果圖

我們的目標(biāo)是注入 sayHi 這個(gè)方法凯旭,使點(diǎn)擊按鈕之后不再說“hi!”,而是“hello world!”

  • 編寫 Logos

    %config(generator=internal)
    
    // You don't need to #include <substrate.h>, it will be done automatically, as will
    // the generation of a class list and an automatic constructor.
    #import <Foundation/Foundation.h>
    
    %hook ViewController
    
    // Hooking an instance method with an argument.
    - (void)sayHi:(id)argument {
        NSAlert *r15 = [[NSAlert alloc] init];
        [r15 setMessageText:@"hello world!"];
        [r15 setAlertStyle:0x1];
        [r15 runModal];
    }
    
    // Always make sure you clean up after yourself; Not doing so could have grave consequences!
    %end
    
    %ctor {
        NSLog(@"!!!!!!inject success!!!!!!!");
    }
    

將以上代碼保存為一個(gè) Tweak.xm 文件(名字后綴名隨意)使套,放在與 SayHi.app 同級(jí)目錄下罐呼,便于后續(xù)操作。

  • 然后我們使用 Theos 的語法分析來把 Logos 轉(zhuǎn)換成普通代碼
    $THEOS/bin/logos.pl Tweak.xm > abc.mm
    注意 abc 應(yīng)該有 mm 作為后綴名侦高,用于告訴 clang 目標(biāo)語言類型

  • 使用 clang 編譯轉(zhuǎn)換后的普通代碼嫉柴,并將結(jié)果放到 app 包內(nèi)
    clang -shared -undefined dynamic_lookup -o ./SayHi.app/Contents/MacOS/lib.dylib ./abc.mm

  • 使用 optool/insert_dylib 往 SayHi 的 MachO 頭部添加我們剛剛編譯的 lib.dylib
    optool install -c load -p @executable_path/lib.dylib -t ./SayHi.app/Contents/MacOS/SayHi

如果你的 Mac app 沒有簽名的話,此時(shí)應(yīng)該已經(jīng)達(dá)成我們的需求了奉呛。但是實(shí)踐中我們肯定不是對(duì)自己導(dǎo)出的未簽名 Mac app 下黑手计螺。所以需要去掉這個(gè)簽名或重簽名。因?yàn)楣P者沒有錢買開發(fā)者賬號(hào)瞧壮,故不知道如何重簽名登馒。

  • 使用 codesign 去除簽名
    codesign --remove-signature SayHi.app

此時(shí)我們的需求已經(jīng)達(dá)成

大成功

但是 codesign 有一個(gè) bug,在刪除代碼簽名之后沒有修復(fù) MachO Header 的偏移咆槽,會(huì)導(dǎo)致生成的 MachO 文件畸形陈轿。筆者曾經(jīng)就遇見一個(gè)不到 1m 的小程序在移除簽名后膨脹到 2g 大小。
所以筆者建議使用開源社區(qū)的代替方案——unsign

后記

筆者把上面的繁瑣命令行操作整合為一個(gè)腳本秦忿,在這里也順便分享出來

#!/usr/bin/env bash

#將xm和文件app包放在同一個(gè)目錄麦射,運(yùn)行本腳步進(jìn)行注入

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 在刪除代碼簽名之后沒有修復(fù)MachO Header的偏移灯谣,導(dǎo)致生成的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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末潜秋,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子胎许,更是在濱河造成了極大的恐慌峻呛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呐萨,死亡現(xiàn)場離奇詭異杀饵,居然都是意外死亡莽囤,警方通過查閱死者的電腦和手機(jī)谬擦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朽缎,“玉大人惨远,你說我怎么就攤上這事谜悟。” “怎么了北秽?”我有些...
    開封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵葡幸,是天一觀的道長。 經(jīng)常有香客問我贺氓,道長蔚叨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任辙培,我火速辦了婚禮蔑水,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扬蕊。我一直安慰自己搀别,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開白布尾抑。 她就那樣靜靜地躺著歇父,像睡著了一般。 火紅的嫁衣襯著肌膚如雪再愈。 梳的紋絲不亂的頭發(fā)上榜苫,一...
    開封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音践磅,去河邊找鬼单刁。 笑死,一個(gè)胖子當(dāng)著我的面吹牛府适,可吹牛的內(nèi)容都是我干的羔飞。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼檐春,長吁一口氣:“原來是場噩夢啊……” “哼逻淌!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疟暖,我...
    開封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤卡儒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后俐巴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體骨望,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年欣舵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了擎鸠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缘圈,死狀恐怖劣光,靈堂內(nèi)的尸體忽然破棺而出袜蚕,到底是詐尸還是另有隱情,我是刑警寧澤绢涡,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布牲剃,位于F島的核電站,受9級(jí)特大地震影響雄可,放射性物質(zhì)發(fā)生泄漏凿傅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一数苫、第九天 我趴在偏房一處隱蔽的房頂上張望狭归。 院中可真熱鬧,春花似錦文判、人聲如沸过椎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疚宇。三九已至,卻和暖如春赏殃,著一層夾襖步出監(jiān)牢的瞬間敷待,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來泰國打工仁热, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榜揖,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓抗蠢,卻偏偏與公主長得像举哟,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子迅矛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容