- 上一篇文章: 深入解讀:探索Reveal調(diào)試工具的奧秘
這篇文章寫完后煞赢,收到了群里小伙伴的積極反饋,其中一位私聊我說护锤,通過閱讀文章裆操,對Reveal的操作有了更清晰的認(rèn)識怒详,盡管沒有親自動手操作,但通過文章中的描述踪区,他已經(jīng)了解了如何使用昆烁。這讓我感到非常欣慰,證明了逆向文章的價值所在缎岗。
感謝這位朋友的反饋静尼,也感謝大家的支持。接下來传泊,我會繼續(xù)更新更多的逆向文章鼠渺,希望你能夠喜歡,并且期待得到你的反饋和支持眷细。如果有任何問題或建議拦盹,請隨時留言給我,我會盡力改進和完善溪椎。
- 本篇繼續(xù)介紹逆向工具
下面是我之前寫得逆向工具文章
下面是我最近寫得工具文章
1.MachOView
- MachOView下載地址 地址
最后的更新的版本:2019-07-27,已經(jīng)是最新的了,我們開發(fā)中使用最新版本就可以了.
- 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--匯編程序員的生命
交互式反匯編器專業(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)建項目
- 2.找到可執(zhí)行文件
- 3.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
官網(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的Unix可執(zhí)行文件,這就是我們需要的文件
我們拷貝TEST到桌面
接著,我們打開Hopper Disassembler
- 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按鈕反編譯后的源碼
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)試工具.