每天一個IDA小技巧(二):基本代碼轉(zhuǎn)換

      網(wǎng)友投稿 2205 2022-05-29

      重命名和注釋

      變量重命名 快捷鍵(y),若想恢復(fù)則更名為空白名稱即可

      方法/寄存器重命名 快捷鍵(N)

      注釋:常規(guī)注釋(:)/可重復(fù)注釋(;),「;」表示該行為注釋

      如果你所分析的文件類型與常見編譯器生成的普通二進制可執(zhí)行文件相差甚大,你可能需要對反匯編分析和顯示過程進行更多的控制。在分析采用自定義文件格式(IDA無法識別)的模糊代碼或文件時,情況更是如此。

      此時便需要手動幫助IDA分辨代碼和數(shù)據(jù),通常分為以下幾類:

      數(shù)據(jù)轉(zhuǎn)換為代碼

      代碼轉(zhuǎn)換為數(shù)據(jù)

      指定一個指令序列為函數(shù)

      更改現(xiàn)有函數(shù)的起始或結(jié)束地址

      更改指令操作數(shù)的顯示格式

      代碼顯示選項

      在轉(zhuǎn)換之前,可以通過一些設(shè)置來讓IDA展示更多反編譯信息幫助我們判斷和決策。

      常規(guī)的一行反匯編行中包含標簽、助記符和操作數(shù),我們也可以通過options -> general打開IDA Options設(shè)置,選擇「Disassembly」選項卡,為反匯編行選擇其他顯示的部分信息。

      Line prefixes 行前綴,展示樣式為:p:address

      Stack Pointer(棧指針)?這個不必多說,從前一章可以知道棧幀中棧指針多么重要。選中棧指針選項,IDA將會顯示棧指針在每個函數(shù)執(zhí)行過程中的相對變化。這樣做有助于識別調(diào)用約定方面的差異(例如,IDA可能不知道某個特殊的函數(shù)使用的是stdcall調(diào)用約定),或者確定對棧指針的不尋常操縱。任何時候,如果IDA遇到一個函數(shù)返回語句,并檢測到棧指針的值不為0,這時,IDA將標注一個錯誤條件,并將相關(guān)指令以紅色顯示。有時候,這樣做可能是有意阻撓自動分析。這時候就可以手動調(diào)整棧指針來正確反匯編。

      Numbers of opcode bytes(操作碼字節(jié)數(shù))以指定IDA應(yīng)為每個指令顯示的機器語言字節(jié)的數(shù)量,選擇性地查看與匯編語言指令混雜在一起的機器語言字節(jié)。

      棧指針調(diào)整

      如前所述,IDA會盡其所能跟蹤函數(shù)內(nèi)每一條指令上的棧指針的變化。IDA跟蹤這種變化的準確程度,在很大程度上影響著函數(shù)的棧幀布局的準確程度。如果IDA無法確定一條指令是否更改了棧指針,你就需要手動調(diào)整棧指針。

      如果一個函數(shù)調(diào)用了另一個使用stdcall調(diào)用約定的函數(shù),就會出現(xiàn)上述情況,這是最簡單的一種情況。如果被調(diào)用的函數(shù)位于IDA無法識別的共享庫中,那么,IDA并不知道該函數(shù)使用了stdcall調(diào)用約定,也就無法認識到:被調(diào)用的函數(shù)會將棧指針修改后返回。因此,IDA會為函數(shù)的剩余部分提供一個錯誤的棧指針值。

      如何進行調(diào)整:

      首先開啟棧指針選項,假設(shè)有以下幾行指令:

      每天一個IDA小技巧(二):基本代碼轉(zhuǎn)換

      028 call some_imported_func

      028 mov ebx,eax

      mov指令處的棧指針理論上應(yīng)為01C,因為在函數(shù)some_imported_func調(diào)用返回時會清除棧中的3個參數(shù)(stdcall調(diào)用約定),但IDA不知道這是一個stdcall,因此不會進行清除,導致棧指針不變,此時我們可以在call指令處Alt+K(Edit?Functions?Change Stack Pointer),然后指定棧指針更改的字節(jié)數(shù),在本例中為12。

      但這樣只能處理這一處的調(diào)用,假設(shè)有其他地方調(diào)用了some_imported_func,我們可以在該導入函數(shù)的導入表條目中設(shè)置「已刪除字節(jié)的數(shù)量」,通過編輯這個函數(shù),你可以指定它在返回時從棧中刪除的字節(jié)數(shù),IDA將會“擴散”這一信息,將其應(yīng)用于調(diào)用該函數(shù)的每一個位置,立即糾正每個位置的棧指針計算錯誤。

      格式化指令操作數(shù)

      為了使反匯編代碼更具可讀性,IDA盡可能地使用符號名稱,而非數(shù)字。因此我們在IDA的反匯編窗口中,基本看到的都是符號名稱而非數(shù)字常量來代表全局變量、棧幀中的偏移量,但是也存在數(shù)字常量的使用情況,IDA此時會將常量格式化成十六進制表示。

      如果我們可以確定某個常量是個標準符號常量,我們可以右鍵常量 -> Use standard symbolic constant然后將常量用字符串替換,例如0x0AH在X.25網(wǎng)絡(luò)連接中可以替換為AF_CCITT,此時mov [ebp+var_60],0Ah就會被替換為mov [ebp+var_60],AF_CCITT。

      更改函數(shù)的起始或結(jié)束地址

      在某些情況下,你可能需要在沒有函數(shù)的地方創(chuàng)建新函數(shù)。新函數(shù)可以由已經(jīng)不屬于某個函數(shù)的現(xiàn)有指令創(chuàng)建,或者由尚未被IDA以任何其他方式定義(如雙字或字符串)的原始數(shù)據(jù)字節(jié)創(chuàng)建。

      操作方式:Edit?Functions?Create Function,即可創(chuàng)建一個新函數(shù)。在必要時,IDA會將數(shù)據(jù)轉(zhuǎn)換成代碼。接下來,它會向前掃描,分析函數(shù)的結(jié)構(gòu),并搜索返回語句。如果IDA能夠找到正確的函數(shù)結(jié)束部分,它將生成一個新的函數(shù)名,分析棧幀,并以函數(shù)的形式重組代碼。如果它無法找到函數(shù)的結(jié)束部分,或者發(fā)現(xiàn)任何非法指令,則這個操作將以失敗告終。

      你可以使用Edit?Functions?Delete Function命令刪除現(xiàn)有函數(shù)。

      在Edit Function窗口中,可以設(shè)置方法的:

      start address

      end address

      local variables area 函數(shù)局部變量使用的棧字節(jié)數(shù)

      saved registers 函數(shù)為調(diào)用方保護寄存器所使用的字節(jié)數(shù)。

      BP Based frame 這個特性表示函數(shù)利用了一個幀指針。多數(shù)情況下,可以通過分析函數(shù)的“序言”來自動確定這一點。但是,如果通過分析無法確定給定的函數(shù)是否使用了幀指針,就可以手動選擇這個特性。如果你手動選擇了這個特性,一定要相應(yīng)地調(diào)整保存的寄存器的大小

      數(shù)據(jù)與代碼互相轉(zhuǎn)換

      在自動分析階段,字節(jié)有時可能被錯誤地歸類。數(shù)據(jù)字節(jié)可能被錯誤地歸類為代碼字節(jié),并被反匯編成指令;而代碼字節(jié)可能被錯誤地歸類為數(shù)據(jù)字節(jié),并被格式化成數(shù)據(jù)值。

      首先重新格式化反匯編代碼:右擊你希望取消定義的項目,在結(jié)果上下文菜單中選擇Undefine(也可使用Edit?Undefine命令或熱鍵U),即可取消函數(shù)、代碼或數(shù)據(jù)的定義。使用“單擊并拖動”操作選擇一個地址范圍,可以取消大范圍內(nèi)的定義。

      然后重新反匯編該區(qū)域字節(jié):要反匯編一組未定義的字節(jié),右擊其中的第一個字節(jié),在上下文菜單中選擇Code(也可使用Edit ?Code或熱鍵C)。

      指定數(shù)據(jù)大小

      IDA提供了許多數(shù)據(jù)大小/類型說明符。最常見的說明符包括db、dw和dd,分別代表1字節(jié)、2字節(jié)和4字節(jié)數(shù)據(jù)。

      Options? Setup Data Types(選項?設(shè)置數(shù)據(jù)類型)對話框中可以設(shè)置數(shù)據(jù)轉(zhuǎn)盤,然后通過快捷鍵D來不斷切換選中地址所在的數(shù)據(jù)項的數(shù)據(jù)類型。

      如果你縮小某個項,例如,由dd(4字節(jié))轉(zhuǎn)換成db(1字節(jié)),則額外的字節(jié)(這里為3字節(jié))將變成未定義字節(jié)。如果你增大某個項,且該項之后的字節(jié)為已定義字節(jié),這時,IDA會委婉地提醒你:是否希望取消下一個項的定義,以擴大當前的項。這時,IDA顯示的消息為:“直接轉(zhuǎn)換成數(shù)據(jù)嗎?”通常,這條消息表示IDA會取消隨后足夠多的項目的定義,以滿足你的要求。例如,將字節(jié)數(shù)據(jù)(db)轉(zhuǎn)換為雙字數(shù)據(jù)(dd)時,還需要另外3字節(jié)才能構(gòu)成新的數(shù)據(jù)項。

      IDA中的數(shù)組

      數(shù)組是一串連續(xù)的地址空間,在IDA中不會直接提供數(shù)組大小方面的消息,如何識別一個數(shù)組也是IDA中需要學習的知識點。

      例如上述匯編代碼中,unk_402060之后的數(shù)據(jù)聲明其中只有第一個項被指令引用,表明它可能是某個數(shù)組中的第一個元素。通常,數(shù)組中的其他元素并不直接引用,而是需要經(jīng)過更加復(fù)雜的索引計算,通過其與數(shù)組開頭之間的偏移量來引用。

      IDA提供一些工具,可將連續(xù)的數(shù)據(jù)定義結(jié)合起來,組成一個單獨的數(shù)組定義。要創(chuàng)建數(shù)組,首先選擇數(shù)組中的第一個元素(這里我們選擇的是unk_402060),然后通過Edit?Array命令打開“創(chuàng)建數(shù)組”對話框。然后設(shè)置相關(guān)的數(shù)組信息,就可以變成類似:

      byte_402060 db 1A0h dup(0)

      的簡單數(shù)組聲明,它是一個名為byte_402060的字節(jié)數(shù)組(db),由416(1A0h)個0值構(gòu)成。

      數(shù)據(jù)結(jié)構(gòu) 匯編語言

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔相應(yīng)法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:Java基礎(chǔ) 第三節(jié) 第十九課
      下一篇:Three.js案例分析系列1--webgl_animation_cloth 草坪上漂浮的白布
      相關(guān)文章
      精品亚洲456在线播放| 亚洲中字慕日产2020| 亚洲精品9999久久久久无码| 亚洲18在线天美| 亚洲w码欧洲s码免费| 亚洲国产精品久久人人爱| 亚洲国产成人va在线观看网址| 亚洲最大黄色网址| 91亚洲精品麻豆| 亚洲1234区乱码| 在线观看日本亚洲一区| 亚洲综合欧美色五月俺也去| 亚洲熟女乱色一区二区三区| 亚洲国产精品18久久久久久| 亚洲Av永久无码精品一区二区| 亚洲av成人一区二区三区观看在线 | 亚洲精品无码成人AAA片| 亚洲精品蜜桃久久久久久| 国产亚洲人成网站观看| 亚洲va中文字幕无码久久| 久久精品国产亚洲| 91嫩草私人成人亚洲影院| 亚洲国色天香视频| 亚洲色丰满少妇高潮18p| 亚洲JLZZJLZZ少妇| 亚洲福利精品电影在线观看| MM131亚洲国产美女久久 | 亚洲人成影院在线无码按摩店| 亚洲美女又黄又爽在线观看| 久久精品国产96精品亚洲| 亚洲高清中文字幕| 亚洲一区二区三区高清不卡 | 亚洲精品成人av在线| 亚洲国产日韩在线| 亚洲人av高清无码| 亚洲精品成a人在线观看| 亚洲精品无码mv在线观看网站| 久久精品九九亚洲精品| 亚洲国产精品综合久久20| 国产精品亚洲色婷婷99久久精品| 国产乱辈通伦影片在线播放亚洲|