"循序漸進:MacOS工具探索"

這篇文章寫完后煞赢,收到了群里小伙伴的積極反饋,其中一位私聊我說护锤,通過閱讀文章裆操,對Reveal的操作有了更清晰的認(rèn)識怒详,盡管沒有親自動手操作,但通過文章中的描述踪区,他已經(jīng)了解了如何使用昆烁。這讓我感到非常欣慰,證明了逆向文章的價值所在缎岗。

感謝這位朋友的反饋静尼,也感謝大家的支持。接下來传泊,我會繼續(xù)更新更多的逆向文章鼠渺,希望你能夠喜歡,并且期待得到你的反饋和支持眷细。如果有任何問題或建議拦盹,請隨時留言給我,我會盡力改進和完善溪椎。

  • 本篇繼續(xù)介紹逆向工具

下面是我之前寫得逆向工具文章

下面是我最近寫得工具文章

1.MachOView

MachOView
  • MachOView下載地址 地址
MachOView下載地址

最后的更新的版本:2019-07-27,已經(jīng)是最新的了,我們開發(fā)中使用最新版本就可以了.

  • MachOView源碼地址 地址
MachOView源碼地址
  • MachOView是一個可視化的Mach-O文件瀏覽器普舆。它為探索和就地編輯Intel和ARM二進制文件提供了一個完整的解決方案。

  • Mach-O格式全稱為Mach Object文件格式的縮寫池磁,是mac上可執(zhí)行文件的格式.

  • Mach-O文件類型分為:
    1奔害、Executable:應(yīng)用的主要二進制
    2、Dylib Library:動態(tài)鏈接庫(又稱DSO或DLL)
    3地熄、Static Library:靜態(tài)鏈接庫
    4华临、Bundle:不能被鏈接的Dylib,只能在運行時使用dlopen( )加載端考,可當(dāng)做macOS的插件
    5雅潭、Relocatable Object File :可重定向文件類型

  • 使用

在iDA中導(dǎo)出的可執(zhí)行文件,依然可以用MachOView進行打開.

注意
如圖,Mach64 Header(64位架構(gòu)),選中mach header 可以看到每個類的cpu架構(gòu)信息揭厚、load commands數(shù)量 、load commandssize 扶供、file type等信息

  • 64位和32位架構(gòu)有哪些不同?
32位架構(gòu):

struct mach_header {
    uint32_t    magic;      /* mach magic number identifier */
    cpu_type_t  cputype;    /* cpu specifier */
    cpu_subtype_t   cpusubtype; /* machine specifier */
    uint32_t    filetype;   /* type of file */
    uint32_t    ncmds;      /* number of load commands */
    uint32_t    sizeofcmds; /* the size of all the load commands */
    uint32_t    flags;      /* flags */
};
64位架構(gòu):

struct mach_header_64 {
    uint32_t    magic;      /* mach magic number identifier */
    cpu_type_t  cputype;    /* cpu specifier */
    cpu_subtype_t   cpusubtype; /* machine specifier */
    uint32_t    filetype;   /* type of file */
    uint32_t    ncmds;      /* number of load commands */
    uint32_t    sizeofcmds; /* the size of all the load commands */
    uint32_t    flags;      /* flags */
    uint32_t    reserved;   /* reserved */
};
  • 32位和64位架構(gòu)的頭文件區(qū)別是64位多了一個保留字段(reserved)
  • magic:魔數(shù)筛圆,用于快速確認(rèn)該文件用于64位還是32位
  • cputype:CPU類型,比如 arm
  • cpusubtype:對應(yīng)的具體類型椿浓,比如arm64太援、armv7
  • filetype:文件類型,比如可執(zhí)行文件扳碍、庫文件提岔、Dsym文件

2.IDA Pro--匯編程序員的生命

image.png
  • 交互式反匯編器專業(yè)版(Interactive Disassembler Professional),人們常稱其為IDA Pro笋敞,或簡稱為IDA碱蒙。

  • 目前最棒的一個靜態(tài)反編譯軟件,為眾多[0day]世界的成員和[ShellCode]安全分析人士不可缺少的利器夯巷!

  • IDA Pro是一款交互式的赛惩,可編程的,可擴展的趁餐,多處理器的喷兼,交叉[Windows]或[Linux] [WinCE] [MacOS]平臺主機來分析程序, 被公認(rèn)為最好的逆向工程利器后雷。

  • 只需要next進行安裝,然后啟動,就可以分析自己的匯編程序了.

IDA Pro如何使用呢?
  • 1.創(chuàng)建項目
創(chuàng)建項目
  • 2.找到可執(zhí)行文件
找到可執(zhí)行文件
  • 3.IDA打開可執(zhí)行文件
IDA打開可執(zhí)行文件
  • 4.找到main編譯的匯編代碼


    找到main編譯的匯編代碼
  • 5.分析匯編代碼

; int __cdecl main(int argc, const char **argv, const char **envp)
public _main
_main proc near
var_1C= dword ptr -1Ch
var_18= dword ptr -18h
var_14= dword ptr -14h
var_10= qword ptr -10h
var_4= dword ptr -4

push    rbp
mov     rbp, rsp
sub     rsp, 20h
lea     rax, cfstr_D    ; "%d"
mov     [rbp+var_4], edi
mov     [rbp+var_10], rsi
mov     [rbp+var_14], 1
mov     [rbp+var_18], 2
mov     edi, [rbp+var_14]
add     edi, [rbp+var_18]
mov     [rbp+var_1C], edi
mov     esi, [rbp+var_1C]
mov     rdi, rax
mov     al, 0
call    _NSLog
xor     eax, eax
add     rsp, 20h
pop     rbp
retn
_main endp
  • 6.通過對匯編代碼進行分析,可以復(fù)原main方法中的代碼
分析

3.Hopper Disassembler

Hopper Disassembler
  • 官網(wǎng)地址:地址

  • Hopper 是一款幫助我們靜態(tài)分析可執(zhí)行文件的工具.
    它可以將Mach-O文件的機器語言代碼反編譯成匯編代碼,OC/Swift偽代碼
    Hoppe可以讓你進行反匯編褒搔、反編譯和調(diào)試你的應(yīng)用程序。

  • Hopper Disassembler結(jié)構(gòu)


    Hopper Disassembler結(jié)構(gòu)
  • 第一次打開我們可以看到,Hopper Disassembler分幾個模塊.
    1.定義所有符號列表及列表字符串,所看到的類名,方法名等
    2.匯編語言
    3.檢查器,包含有關(guān)探索區(qū)域的上線信息
    4.python命令工具
    5.D,A,C,P,U 數(shù)據(jù),ASCLL,代碼,過程,定義
    6.代碼編譯的幾種模式

  • 我們?nèi)匀皇褂蒙弦黄恼轮械捻椖縏EST

  • 我們打包項目,獲取ipa包(這里不再詳細(xì)描述打包的過程)

TEST
  • 我們點擊TEST,可以看到TEST的Unix可執(zhí)行文件,這就是我們需要的文件
TEST-Unix
  • 我們拷貝TEST到桌面

  • 接著,我們打開Hopper Disassembler

打開Hopper
  • Open TEST-Unix文件
Open TEST-Unix
  • 點擊OK,可以看到項目的結(jié)構(gòu)


    項目結(jié)構(gòu)
  • 我們對照源碼看一下,我把源碼粘貼到這里

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,strong)UIButton *revealBtn;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    [self.view addSubview:self.revealBtn];
}

-(UIButton*)revealBtn{
    if (!_revealBtn) {
        _revealBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        _revealBtn.frame = CGRectMake(100,100, 100,40);
        _revealBtn.backgroundColor = [UIColor redColor];
        [_revealBtn setTitle:@"測試" forState:UIControlStateNormal];
        [_revealBtn setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    }
    return _revealBtn;
}

@end
  • 我們看一下創(chuàng)建revealBtn按鈕反編譯后的源碼
revealBtn反編譯
nop
ldr        x0, #0x100008d78
nop
ldr        x1, #0x100008d38 ; @selector(buttonWithType:)
movz       x2, #0x0
bl         imp___stubs__objc_msgSend
mov        x29, x29
bl         imp___stubs__objc_retainAutoreleasedReturnValue
ldr        x8, x19, x22
str        x0, x19, x22
mov        x0, x8
bl         imp___stubs__objc_release
ldr        x0, x19, x22
nop
ldr        x1, #0x100008d40 ; @selector(setFrame:)
nop
ldr        d0, #0x100006b68
nop
ldr        d3, #0x100006b70
mov        v1, v0
mov        v2, v0
bl         imp___stubs__objc_msgSend
adrp       x21, #0x100008000
ldr        x0, [x21, #0xd80] ; objc_cls_ref_UIColor,_OBJC_CLASS_$_UIColor
nop
ldr        x1, #0x100008d48 ; @selector(redColor)
bl         imp___stubs__objc_msgSend
mov        x29, x29
bl         imp___stubs__objc_retainAutoreleasedReturnValue
mov        x20, x0
ldr        x0, x19, x22
nop
ldr        x1, #0x100008d50 ; @selector(setBackgroundColor:)
mov        x2, x20
bl         imp___stubs__objc_msgSend
mov        x0, x20
bl         imp___stubs__objc_release
ldr        x0, x19, x22
nop
ldr        x1, #0x100008d58 ; @selector(setTitle:forState:)
adr        x2, #0x100008060
nop
movz       x3, #0x0
bl         imp___stubs__objc_msgSend
ldr        x20, x19, x22
ldr        x0, [x21, #0xd80] ; objc_cls_ref_UIColor,_OBJC_CLASS_$_UIColor
nop
ldr        x1, #0x100008d60 ; @selector(whiteColor)
bl         imp___stubs__objc_msgSend
mov        x29, x29
bl         imp___stubs__objc_retainAutoreleasedReturnValue
mov        x21, x0
nop
ldr        x1, #0x100008d68 ; @selector(setTitleColor:forState:)
mov        x0, x20
mov        x2, x21
movz       x3, #0x0
bl         imp___stubs__objc_msgSend
mov        x0, x21
bl         imp___stubs__objc_release
ldr        x0, x19, x22
  • 下面看一下對比
源碼對比

我們通過觀察,創(chuàng)建按鈕的代碼我們都可以猜到.當(dāng)然這是很簡單的Demo,復(fù)雜一些我們就要通過匯編代碼及偽代碼進行靜態(tài)分析.

  • 記得 在我的iOS逆向系列的第二篇文章中喷面,我分享了我的逆向經(jīng)歷。在逆向過程中走孽,我們不需要完全翻譯應(yīng)用的代碼惧辈,因為這樣會耗費大量的時間。相反磕瓷,通過分析匯編代碼盒齿,我們可以猜測應(yīng)用的實現(xiàn)邏輯,從而了解其功能實現(xiàn)的原理困食。因此边翁,我們不必要花費過多的時間和精力在這方面。
  • Hopper的其他功能你可以自己嘗試操作一下,可以幫助到你逆向分析.

總結(jié)

本篇文章主要介紹MacOS上安裝的應(yīng)用:

  • MachOView
  • IDA Pro
  • Hopper Disassembler

這些應(yīng)用都會對你的逆向分析有輔助作用.

下一篇文章我們將要介紹iOS的逆向工具及調(diào)試工具.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末硕盹,一起剝皮案震驚了整個濱河市符匾,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘩例,老刑警劉巖啊胶,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件甸各,死亡現(xiàn)場離奇詭異,居然都是意外死亡焰坪,警方通過查閱死者的電腦和手機趣倾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來某饰,“玉大人儒恋,你說我怎么就攤上這事∏” “怎么了诫尽?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長瘟仿。 經(jīng)常有香客問我箱锐,道長,這世上最難降的妖魔是什么劳较? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任驹止,我火速辦了婚禮,結(jié)果婚禮上观蜗,老公的妹妹穿的比我還像新娘臊恋。我一直安慰自己,他們只是感情好墓捻,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布抖仅。 她就那樣靜靜地躺著,像睡著了一般砖第。 火紅的嫁衣襯著肌膚如雪撤卢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天梧兼,我揣著相機與錄音放吩,去河邊找鬼。 笑死羽杰,一個胖子當(dāng)著我的面吹牛渡紫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播考赛,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼惕澎,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颜骤?” 一聲冷哼從身側(cè)響起唧喉,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后欣喧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腌零,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年唆阿,在試婚紗的時候發(fā)現(xiàn)自己被綠了益涧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡驯鳖,死狀恐怖闲询,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浅辙,我是刑警寧澤扭弧,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站记舆,受9級特大地震影響鸽捻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜泽腮,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一御蒲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诊赊,春花似錦厚满、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鲸郊,卻和暖如春丰榴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背秆撮。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工多艇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人像吻。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像复隆,于是被迫代替她去往敵國和親拨匆。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359