結構體
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字節對齊產生數據空隙時,這麼容易判斷的時候,有便宜不佔是白癡。