日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

9.IDA-重新设置函数类型、创建数组结构

發(fā)布時間:2024/4/11 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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;?//?eax@1??
  • ??int?i;?//?[sp+0h]?[bp-194h]@1??
  • ??int?array_int[100];?//?[sp+4h]?[bp-190h]@1??
  • ??
  • ??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)容還不錯,歡迎將生活随笔推薦給好友。