數據逆向(四)——結構體識別

結構體

       struct是由一系列具有相同類型或不同類型的數據構成的數據集合,也叫結構。它的實現方法上和數組是一樣的,即每一個成員的訪問是直接尋址方式。唯一的區別是,爲了提高訪問效率,成員無論類型爲何,編譯器將它們按照4字節對齊。

 

eg:struct test

       {

            char str;

            int i;

        };

       test a={'A',0};

 

debug:

0041139E  mov         byte ptr [ebp-0Ch],41h //4字節對齊
004113A2  mov         dword ptr [ebp-8],0

 

同樣的尷尬

      和數組一樣,直接從二進制代碼上判斷結構體邊界,並且它比數組的判斷更難。尤其是自定義結構體。

1. struct TimeCount

   {

     time_t Begin;

     time_t End;

   };

   TimeCount clock;//很好的書寫習慣

 

2. tme_t Begin,End;//稍微懶一點

3.time_t a[2];//太惡劣了

    

     這三個聲明是等價的,struct的界定應該說很多時候是非常隨意的,但是以下情況是必須準確判斷:

    1. 變量是結構體數組時如果不想還原的代碼,寫滿屏幕的話,嘿嘿...

 

    2. 以指針形式在函數間傳遞時好在這種情況很少是自定義結構體,這使得我們通常可以藉助OD、IDA幫你判斷。出現自定義結構體時,絕大多數情況又是隊列、二叉樹等等,只要經驗足夠的話是不難的。

    3.4字節對齊產生數據空隙時,這麼容易判斷的時候,有便宜不佔是白癡。

   

  

 


發佈了41 篇原創文章 · 獲贊 4 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章