匯編基礎(chǔ)(七)Ida分析Ipa中的MachO文件闷沥,得到匯編,還原高級(jí)代碼咪鲜、簡(jiǎn)單版

準(zhǔn)備

  • 首先我們準(zhǔn)備一個(gè)工程
  • 添加一些簡(jiǎn)單的函數(shù)調(diào)用狐赡,最基本的運(yùn)算
  • Bulid得到一個(gè)app包
  • 將app包里面的MachO文件放入到ida中分析匯編(ida去網(wǎng)上找資源)
  • 初步的將匯編還原成高級(jí)代碼

操作

1.創(chuàng)建工程名字就叫:還原高級(jí)代碼

2.添加函數(shù)、運(yùn)算

3.Bulid得到得到app包

4.將App包中的MachO文件放入到ida進(jìn)行解析疟丙,生成匯編代碼

匯編颖侄、源代碼

匯編

__text:0000000100006228 _func ; CODE XREF: _main+28↓p
__text:0000000100006228
__text:0000000100006228 var_C = -0xC
__text:0000000100006228 var_8 = -8
__text:0000000100006228 var_4 = -4
__text:0000000100006228 var_s0 = 0
__text:0000000100006228
__text:0000000100006228 SUB SP, SP, #0x20
__text:000000010000622C STP X29, X30, [SP,#0x10+var_s0]
__text:0000000100006230 ADD X29, SP, #0x10
__text:0000000100006234 STUR W0, [X29,#var_4]
__text:0000000100006238 STR W1, [SP,#0x10+var_8]
__text:000000010000623C ADRP X0, #aHaha@PAGE ; "haha"
__text:0000000100006240 ADD X0, X0, #aHaha@PAGEOFF ; "haha"
__text:0000000100006244 BL _printf
__text:0000000100006248 ADRP X30, #_number@PAGE
__text:000000010000624C ADD X30, X30, #_number@PAGEOFF
__text:0000000100006250 LDUR W1, [X29,#var_4]
__text:0000000100006254 LDR W8, [SP,#0x10+var_8]
__text:0000000100006258 ADD W8, W1, W8
__text:000000010000625C LDR W1, [X30]
__text:0000000100006260 ADD W8, W8, W1
__text:0000000100006264 STR W0, [SP,#0x10+var_C]
__text:0000000100006268 MOV X0, X8
__text:000000010000626C LDP X29, X30, [SP,#0x10+var_s0]
__text:0000000100006270 ADD SP, SP, #0x20
__text:0000000100006274 RET
__text:0000000100006274 ; End of function _func

源代碼

int number = 30;
int func(int a, int b){
printf("haha");
return a + b + number;
}
int main(int argc, char * argv[]) {
printf("%d",func(1, 2));
return 0;
}

匯編分析

  1. 定義的4個(gè)變量 將一些偏移量存起來,方便觀看
    __text:0000000100006228 var_C = -0xC
    __text:0000000100006228 var_8 = -8
    __text:0000000100006228 var_4 = -4
    __text:0000000100006228 var_s0 = 0
  2. 下面三句拉伸椣斫迹空間
    __text:0000000100006278 SUB SP, SP, #0x30
    __text:000000010000627C STP X29, X30, [SP,#0x20+var_s0]
    __text:0000000100006280 ADD X29, SP, #0x20
  3. 將w0 w1 放入棧
    __text:0000000100006234 STUR W0, [X29,#var_4]
    __text:0000000100006238 STR W1, [SP,#0x10+var_8]
  4. 獲取一個(gè)常量或者全局變量
    __text:000000010000623C ADRP X0, #aHaha@PAGE ; "haha"
    __text:0000000100006240 ADD X0, X0, #aHaha@PAGEOFF ; "haha"
  5. 打印這個(gè)常量或者全局變量
    __text:0000000100006244 BL _printf
  6. 獲取一個(gè)常量或者全局變量
    __text:0000000100006248 ADRP X30, #_number@PAGE
    __text:000000010000624C ADD X30, X30, #_number@PAGEOFF
  7. 一個(gè)變量
    __text:0000000100006250 LDUR W1, [X29,#var_4]
  8. 一個(gè)變量
    __text:0000000100006254 LDR W8, [SP,#0x10+var_8]
  9. 運(yùn)算 +
    __text:0000000100006258 ADD W8, W1, W8
  10. 一個(gè)變量
    __text:000000010000625C LDR W1, [X30]
  11. 運(yùn)算 +
    __text:0000000100006260 ADD W8, W8, W1
  12. 將w0存入到棧
    __text:0000000100006264 STR W0, [SP,#0x10+var_C]
  13. x0 = x8
    __text:0000000100006268 MOV X0, X8
  14. 讀取回家的路 棧底fp以及l(fā)r
    __text:000000010000626C LDP X29, X30, [SP,#0x10+var_s0]
  15. 將椑雷妫空間收回 用之前需要拉伸、 用完需要恢復(fù)
    __text:0000000100006270 ADD SP, SP, #0x20
  16. 返回main函數(shù)
    __text:0000000100006274 RET

進(jìn)一步簡(jiǎn)化

  1. 因?yàn)橐婚_始就知道func函數(shù)炊琉,并且在main的匯編當(dāng)中我們看到 w8 = #1 w9 = #2 w0 = w8 w1 = w9 所以判定有兩個(gè)參數(shù)



    func(int a, int b){
    }

  2. STUR W0, [X29,#var_4] STR W1, [SP,#0x10+var_8] 存入棧兩個(gè)參數(shù) 就是兩個(gè)變量 main 中w8 = #1 w9 = #2 w0 = w8 w1 = w9
    int var_4 = a展蒂;
    int var_8 = b;
  3. ADRP X0, #aHaha@PAGE ; "haha" ADD X0, X0, #aHaha@PAGEOFF ; "haha" BL _printf
    printf("haha");
  4. ADRP X30, #_number@PAGE ADD X30, X30, #_number@PAGEOFF 拿到的是&number 因?yàn)橄旅娴? LDR W1, [X30],ADD W8, W8, W1 w8 == var_8 var_8 == b b 是int 所以 _number 是int類型
    _number 是全局變量
    int number; &number
  5. LDUR W1, [X29,#var_4]
    int w1 = var_4
  6. LDR W8, [SP,#0x10+var_8]
    int w8 = var_8
  7. ADD W8, W1, W8
    w8 = w1 + w8
  8. LDR W1, [X30]
    w1 = number
  9. ADD W8, W8, W1
    w8 = W8 + W1
  10. W0, [SP,#0x10+var_C]
    int var_c = a;
  11. MOV X0, X8 保存返回值
    return x8;

初步還原的代碼

int number; 
func(int a, int b){
  int var_4 = a苔咪;
  int var_8 = b;
  printf("haha");
  int w1 = var_4;
  int w8 = var_8;
  w8 = w1 + w8;
  w1 =  number;
  w8 = W8 + W1;
  int var_c = a;
  return x8;
} 

最簡(jiǎn)化

最終

int number; 
func(int a, int b){
  printf("haha");
  return a + b + number;
} 

原碼

>int number  = 30;
int func(int a, int b){
    printf("haha");
    return a + b + number;
}
int main(int argc, char * argv[]) {
    printf("%d",func(1, 2));
    return 0;
}

結(jié)論

問題

  • 怎么確定func是否有返回值锰悼?
    因?yàn)閕nt var_c = a; W0, [SP,#0x10+var_C] 這句話,w0都是返回值团赏,如果沒有retrun 為什么多此一舉吶箕般?

  • 為什么有返回值在main函數(shù)中調(diào)用玩func沒有調(diào)用w0這個(gè)返回值吶?
    因?yàn)榇蠹以趯懘a的時(shí)候舔清,函數(shù)有返回值丝里,但是我們調(diào)用的時(shí)候沒用,就會(huì)出現(xiàn)這個(gè)問題体谒。

  • Number的值拿不到嗎杯聚?
    因?yàn)橄到y(tǒng)知道靜態(tài)變量的值,不需要我們做操作抒痒,就好比幌绍,為什么拉伸棧空間的時(shí)候函數(shù)一開始的棧起始位置是多少?因?yàn)橄到y(tǒng)知道傀广,并且我們知道這個(gè)是一個(gè)值就OK痢虹,當(dāng)成一個(gè)常量,只不過不知道它的值

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末主儡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子惨缆,更是在濱河造成了極大的恐慌糜值,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件坯墨,死亡現(xiàn)場(chǎng)離奇詭異寂汇,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)捣染,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門骄瓣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人耍攘,你說我怎么就攤上這事榕栏。” “怎么了蕾各?”我有些...
    開封第一講書人閱讀 163,450評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵扒磁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我式曲,道長(zhǎng)妨托,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,322評(píng)論 1 293
  • 正文 為了忘掉前任吝羞,我火速辦了婚禮兰伤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘钧排。我一直安慰自己敦腔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評(píng)論 6 390
  • 文/花漫 我一把揭開白布卖氨。 她就那樣靜靜地躺著会烙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪筒捺。 梳的紋絲不亂的頭發(fā)上柏腻,一...
    開封第一講書人閱讀 51,274評(píng)論 1 300
  • 那天,我揣著相機(jī)與錄音系吭,去河邊找鬼五嫂。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的沃缘。 我是一名探鬼主播躯枢,決...
    沈念sama閱讀 40,126評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼槐臀!你這毒婦竟也來了锄蹂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,980評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤水慨,失蹤者是張志新(化名)和其女友劉穎得糜,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晰洒,經(jīng)...
    沈念sama閱讀 45,414評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朝抖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了谍珊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片治宣。...
    茶點(diǎn)故事閱讀 39,773評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖砌滞,靈堂內(nèi)的尸體忽然破棺而出侮邀,到底是詐尸還是另有隱情,我是刑警寧澤布持,帶...
    沈念sama閱讀 35,470評(píng)論 5 344
  • 正文 年R本政府宣布豌拙,位于F島的核電站,受9級(jí)特大地震影響题暖,放射性物質(zhì)發(fā)生泄漏按傅。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評(píng)論 3 327
  • 文/蒙蒙 一胧卤、第九天 我趴在偏房一處隱蔽的房頂上張望唯绍。 院中可真熱鬧,春花似錦枝誊、人聲如沸况芒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绝骚。三九已至,卻和暖如春祠够,著一層夾襖步出監(jiān)牢的瞬間压汪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工古瓤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留止剖,地道東北人腺阳。 一個(gè)月前我還...
    沈念sama閱讀 47,865評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像穿香,于是被迫代替她去往敵國(guó)和親亭引。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評(píng)論 2 354

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