生活随笔
收集整理的這篇文章主要介紹了
9.IDA-重新设置函数类型、创建数组结构
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1.重新設(shè)置函數(shù)類型
寫一個簡單的代碼做測試:
[cpp] ?view plaincopy
int ?fun( int ?a,? double ?b)?? {?? ????return ?0;?? }?? ?? int ?_tmain( int ?argc,?_TCHAR*?argv[])?? {?? ????int ?c?=?fun(1,?2);?? ????return ?0;?? }??
release生成,去掉pdb,由于fun內(nèi)部沒有任何操作,所以IDA是無法通過類型傳播來得到正確的函數(shù)參數(shù)和數(shù)據(jù)類型的,默認(rèn),IDA會生成如下函數(shù):
為此我們來修正下它,參看下調(diào)用處的匯編
[cpp] ?view plaincopy
008?sub?????esp,?8??????????;?參看標(biāo)識1可知此處開始壓參,此處壓了8,結(jié)合下面,為 double ?? 010?fld?????ds:dbl_4020E8?? 010?fstp????[esp+0Ch+var_C]?? 010?push????1???????????????;?此處壓最左參數(shù)int ?? 014?call????sub_401000??????;?此處堆棧是偏移0x14,0x14-0xc?=?0x8處,標(biāo)識1?? 014?add?????esp,?0Ch????????;?加0xc!說明是c調(diào)用,調(diào)用者平衡??
從而,使用Edit?Functions?Set Function Type命令,或者在函數(shù)名稱上右擊鼠標(biāo)并在上下文菜單中選擇SetFunction Type(或使用熱鍵Y)來設(shè)置函數(shù)的類型
F5反匯編一下:
最后,IDA會向新修改的函數(shù)的所有調(diào)用方傳播這些信息,從而改進(jìn)對此處顯示的所有相關(guān)函數(shù)調(diào)用的附加說明
2.創(chuàng)建數(shù)組結(jié)構(gòu)
示例1.局部數(shù)組
先逐步分析:
修正函數(shù)
對應(yīng)逆向代碼如下
[cpp] ?view plaincopy
void ?*sub_401000()?? {?? ??void ?*result;? ?? ??int ?i;? ?? ??int ?array_int[100];? ?? ?? ??array_int[0]?=?0;?? ??result?=?memset(&array_int[1],?0,?0x18Cu);?? ??array_int[20]?=?15;?? ??for ?(?i?=?0;?i?<?100;?++i?)?? ??{?? ????result?=?(void ?*)i;?? ????array_int[i]?=?i;?? ??}?? ??return ?result;?? }??
示例2.全局?jǐn)?shù)組
[cpp] ?view plaincopy
.text:00401000?sub_401000??????proc?near???????????????;?CODE?XREF:?_main+3p?? .text:00401000?? .text:00401000?var_4???????????=?dword?ptr?-4?? .text:00401000?? .text:00401000?????????????????push????ebp?? .text:00401001?????????????????mov?????ebp,?esp?? .text:00401003?????????????????push????ecx?? .text:00401004?????????????????mov?????[ebp+var_4],?2?? .text:0040100B?????????????????mov?????dword_403018,?0Ah?? .text:00401015?????????????????mov?????dword_40301C,?14h?? .text:0040101F?????????????????mov?????dword_403020,?1Eh?? .text:00401029?????????????????mov?????eax,?[ebp+var_4]?? .text:0040102C?????????????????mov?????dword_403018[eax*4],?28h?? .text:00401037?????????????????mov?????esp,?ebp?? .text:00401039?????????????????pop?????ebp?? .text:0040103A?????????????????retn??
先逐步分析:
[cpp] ?view plaincopy
.text:0040102C?????????????????mov?????dword_403018[eax*4],?28h?;?暗示dword_406018為dword數(shù)組??
基于IDA分配的啞名,我們知道,全局?jǐn)?shù)組由從地址00403018開始的12個字節(jié)組成。在編譯過程中,編譯器使用了固定索引(0、1、2)來計算數(shù)組中對應(yīng)元素的具體地址(00403018、0040301c和00403020),所以跳轉(zhuǎn)到地址00403018
創(chuàng)建數(shù)組結(jié)構(gòu)
要創(chuàng)建數(shù)組,首先選擇數(shù)組中的第一個元素(這里我們選擇的是dword_403018)
1.在創(chuàng)建數(shù)組之前,首先要保證第一個元素的大小更改為適當(dāng)?shù)闹?#xff08;使用D鍵切換,由Option—>Setup Data Types選中項來決定輪換),即確認(rèn)數(shù)組中元素的大小
2.然后通過Edit?Array命令打開如圖所示的“創(chuàng)建數(shù)組”對話框
?Array element Width(數(shù)組元素寬度)。這個值表示各數(shù)組元素的大小(這里為1字節(jié)),它由你在打開對話框時選擇的數(shù)據(jù)值的大小決定。?
??Maximum possible size(最大可能大小)。這個值由自動計算得出,它決定在遇到另一個已定義的數(shù)據(jù)項之前,可包含在數(shù)組中的元素(不是字節(jié))的最大數(shù)目。你可以指定一個更大的值,但這需要隨后的數(shù)據(jù)項為未定義數(shù)據(jù)項,以將它們吸收到數(shù)組中。
?Number of elements(元素數(shù)量)。你可以在這里指定數(shù)組的具體大小。數(shù)組占用的總字節(jié)數(shù)可通過“元素數(shù)量×數(shù)組元素寬度”計算得出。
?Items on a line(行中的項目)。指定在每個反匯編行顯示的元素的數(shù)量。通過它可以減少顯示數(shù)組所需的空間。
?Element width(元素寬度)。這個值僅用于格式化。當(dāng)一行顯示多個項目時,它控制列寬。
?Use“dup”construct(使用重復(fù)結(jié)構(gòu))。這個選項可將相同的數(shù)據(jù)值合并起來,用一個重復(fù)說明符組合成一項。??
?Signed elements(有符號元素)。表示將數(shù)據(jù)顯示為有符號還是無符號的值。??
?Display indexes(顯示索引)。使數(shù)組索引以常規(guī)注釋的形式顯示。如果你需要定位大型數(shù)組中的特定數(shù)據(jù),可以使用這個選項。選擇該選項還將啟用Indexes單選按鈕,這樣就可以選擇每個索引值的顯示格式。??
??Create as array(創(chuàng)建為數(shù)組)。不選擇這個選項似乎有悖于本對話框的目的,該選項默認(rèn)處于選中狀態(tài)。如果你只希望指定一定數(shù)量的連續(xù)項目,而不是將它們組合成一個數(shù)組,即可取消該選項。
?Items on a line(行中的項目)。指定在每個反匯編行顯示的元素的數(shù)量。通過它可以減少顯示數(shù)組所需的空間。?Array element Width(數(shù)組元素寬度)。這個值表示各數(shù)組元素的大小(這里為1字節(jié)),它由你在打開對話框時選擇的數(shù)據(jù)值的大小決定。?? ?Maximum possible size(最大可能大小)。這個值由自動計算得出,它決定在遇到另一個已定義的數(shù)據(jù)項之前,可包含在數(shù)組中的元素(不是字節(jié))的最大數(shù)目。你可以指定一個更大的值,但這需要隨后的數(shù)據(jù)項為未定義數(shù)據(jù)項,以將它們吸收到數(shù)組中。?? ?Number of elements(元素數(shù)量)。你可以在這里指定數(shù)組的具體大小。數(shù)組占用的總字節(jié)數(shù)可通過“元素數(shù)量×數(shù)組元素寬度”計算得出?;贗DA分配的啞名,我們知道,全局?jǐn)?shù)組由從地址0040B720開始的12個字節(jié)組成。在編譯過程中,編譯器使用了固定索引(0、1、2)來計算數(shù)組中對應(yīng)元素的具體地址(0040B720、0040B724和0040B728)
?示例3.棧分配的數(shù)組
?編譯器幾乎以完全相同的方式處理棧分配的數(shù)組和全局分配的數(shù)組。
[cpp] ?view plaincopy
sub_401000?proc?near?? ?? var_10=?dword?ptr?-10h?? var_C=?dword?ptr?-0Ch?? var_8=?dword?ptr?-8?? var_4=?dword?ptr?-4?? ?? push????ebp?? mov?????ebp,?esp?? sub?????esp,?10h?? mov?????[ebp+var_10],?2?? mov?????[ebp+var_C],?10?? mov?????[ebp+var_8],?20?? mov?????[ebp+var_4],?30?? mov?????eax,?[ebp+var_10]?? mov?????[ebp+eax*4+var_C],?40?? mov?????esp,?ebp?? pop?????ebp?? retn??
先逐步分析:
[cpp] ?view plaincopy
mov?????[ebp+eax*4+var_C],?40?;?暗示var_C為 int 數(shù)組??
雙擊var_C,使用array分配:
[cpp] ?view plaincopy
push????ebp?? mov?????ebp,?esp?? sub?????esp,?10h?? mov?????[ebp+var_10],?2?? mov?????[ebp+var_C],?10?? mov?????[ebp+var_C+4],?20?? mov?????[ebp+var_C+8],?30?? mov?????eax,?[ebp+var_10]?? mov?????[ebp+eax*4+var_C],?40?;?暗示var_C為int 數(shù)組??
其代碼如下:
[cpp] ?view plaincopy
int ?L_array[3];?? int ?idx?=?2;?? L_array[0]?=?10;?? L_array[1]?=?20;?? L_array[2]?=?30;?? L_array[idx]?=?40;??
示例4.堆分配的數(shù)組
處理堆分配的數(shù)組的主要區(qū)別在于,它必須根據(jù)內(nèi)存分配函數(shù)返回的地址值,生成對數(shù)組的所有引用
[cpp] ?view plaincopy
push????ebp?? mov?????ebp,?esp?? sub?????esp,?0Ch?? push????0Ch?????????????;?unsigned?int ?? call??????2@YAPAXI@Z????;?operator?new (uint)?? add?????esp,?4?? mov?????[ebp+var_C],?eax?? mov?????eax,?[ebp+var_C]?? mov?????[ebp+var_8],?eax?? mov?????[ebp+var_4],?2?? mov?????ecx,?[ebp+var_8]?? mov?????dword?ptr?[ecx],?0Ah?? mov?????edx,?[ebp+var_8]?? mov?????dword?ptr?[edx+4],?14h?? mov?????eax,?[ebp+var_8]?? mov?????dword?ptr?[eax+8],?1Eh?? mov?????ecx,?[ebp+var_4]?? mov?????edx,?[ebp+var_8]?? mov?????dword?ptr?[edx+ecx*4],?28h?? mov?????esp,?ebp?? pop?????ebp?? retn??
先逐步分析:
[cpp] ?view plaincopy
call??????2@YAPAXI@Z????;?operator? new (uint)?? add?????esp,?4?? mov?????[ebp+var_C],?eax?;?eax保存了new 的堆指針?? mov?????eax,?[ebp+var_C]?? mov?????[ebp+var_8],?eax?;?var_8保存了new 的堆指針?? mov?????[ebp+var_4],?2??;?var_4?=?2?? mov?????ecx,?[ebp+var_8]?;?ecx保存了new 的堆指針?? mov?????dword?ptr?[ecx],?0Ah?;?new 的堆指針( int [0]=0a)?? mov?????edx,?[ebp+var_8]?;?edx保存了new 的堆指針?? mov?????dword?ptr?[edx+4],?14h?;?int [1]=0x14?? mov?????eax,?[ebp+var_8]?;?eax保存了new 的堆指針?? mov?????dword?ptr?[eax+8],?1Eh?;?int [2]=0x1e?? mov?????ecx,?[ebp+var_4]?;?ecx=2?? mov?????edx,?[ebp+var_8]?;?edx保存了new 的堆指針?? mov?????dword?ptr?[edx+ecx*4],?28h?;?int [2]=0x28??
其代碼如下:
[cpp] ?view plaincopy
int ?*heap_array?=? new ? int [3];?? ????int ?idx?=?2;?? ????heap_array[0]?=?10;?? ????heap_array[1]?=?20;?? ????heap_array[2]?=?30;?? ????heap_array[idx]?=?40;??
總結(jié)
以上是生活随笔 為你收集整理的9.IDA-重新设置函数类型、创建数组结构 的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔 推薦給好友。