2014-01-25 33 views
-3

要挑戰我的自我我試圖學習組裝。使用IDA我發現這個功能:最好的方法來了解裝配中會發生什麼?

Question - (void)setCorrectAnswerIndex:(int) 

; void __cdecl -[Question setCorrectAnswerIndex:](struct Question *self, SEL, int) 
__Question_setCorrectAnswerIndex__ 
MOV    R1, #(_OBJC_IVAR_$_Question.correctAnswerIndex - 0x5C750) ; int correctAnswerIndex; 
ADD    R1, PC ; int correctAnswerIndex; 
LDR    R1, [R1] ; int correctAnswerIndex; 
STR    R2, [R0,R1] 
BX    LR 
; End of function -[Question setCorrectAnswerIndex:] 

我只是很難弄清楚它是如何工作的,我怎麼修改它。所以setCorrectAnswerIndex將始終設置爲靜態數字或其他東西。

回答

2

讓我們來看看爲什麼看編譯的高級代碼不是一個很好的學習方式。但從ARM彙編點什麼事情是這樣的:

  • 移動常數到寄存器R1
  • 添加當前程序計數器,爲了創造一個相對從這個碼偏移到其他部分的地址節目圖像
  • 加載任何值存儲在該地址爲R1
  • 商店通過跳轉到在鏈接中保存的地址在R2舉行的由R0 + R1做出
  • 返回給調用者的地址值註冊

這是什麼意思,在任何程序的情況下,這是什麼意思? 我不知道。我不知道它是從哪個語言編譯而來的,所以我不知道參數是如何傳遞的*。我不知道事物的結構和佈局(這取決於語言和個人計劃),所以我不知道那些偏移和指針指向什麼。說這個彙編代碼的確如此遠遠沒有說什麼達到了。如果這個函數實際上做了一些與索引無關的事情,而且只是有一個真正令人誤解的名字呢?

總之,如果你想learn assembly,learn assembly

如果你想學逆向工程,learn assembly然後擁有這些知識,開始學習逆向工程非常困難的任務。

以下是一個提示:此函數的唯一副作用是將R2存儲在某處。你不能在不破壞所有前面的指令的情況下進行修補,因此在寫入R2之前獲得與R2不同的值是非常困難的。在呼叫站點可能有空間嗎?用一個相對分支來修補返回到附近的地方,在那裏有更多代碼打補丁的空間,重新使用R0和R1來寫一個新的值,然後返回到原來的LR將是我的想法。

*是的,我在這裏玩的很蠢。我猜這是Objective-C,這是可能使用ARM EABI,但我不想看它確認。此外,任何與XCode有關的事情再次發生的想法再次讓我不寒而慄。

相關問題