ida提取hashab算法记录
????? 話說ida f5功能確實很強大,以后還會使用到f5進行提取代碼,記錄下這次提取代碼過程中的想法。
????? 首先需要注意f5生成的偽代碼函數內的局部變量都是以1字節對齊的,f5把一個函數使用的堆棧中的地址都對應到了一個變量上。ida生成的偽代碼中會經常在某個變量的基礎上對后面的數據進行賦值和拷貝。可以使用下面的方法進行解決。然后使用全部替換,在所有的變量前都加上data.。
#pragma pack(1)
?? ?struct data_t
?? ?{
?? ??? ?signed int v3; // esi@1
?? ??? ?signed int v4; // esi@3
?? ??? ?__int16 v6; // [sp+8h] [bp-198h]@1
?? ??? ?char v7; // [sp+Ah] [bp-196h]@1
?? ??? ?int v8; // [sp+Ch] [bp-194h]@1
?? ??? ?__int16 v9; // [sp+10h] [bp-190h]@1
?? ??? ?char v10; // [sp+12h] [bp-18Eh]@1
?? ??? ?int v11; // [sp+14h] [bp-18Ch]@1
?? ??? ?int v12; // [sp+18h] [bp-188h]@1
?? ??? ?int v13; // [sp+1Ch] [bp-184h]@1
?? ??? ?char v14; // [sp+20h] [bp-180h]@1
?? ??? ?char v15; // [sp+24h] [bp-17Ch]@1
?? ??? ?char v16; // [sp+25h] [bp-17Bh]@1
?? ??? ?int v17; // [sp+26h] [bp-17Ah]@1
?? ??? ?int v18; // [sp+2Ah] [bp-176h]@1
?? ??? ?int v19; // [sp+2Eh] [bp-172h]@1
?? ??? ?char v20; // [sp+32h] [bp-16Eh]@1
?? ??? ?__int16 v21; // [sp+33h] [bp-16Dh]@1
?? ??? ?char v22; // [sp+35h] [bp-16Bh]@1
?? ??? ?int v23; // [sp+36h] [bp-16Ah]@1
?? ??? ?__int16 v24; // [sp+3Ah] [bp-166h]@1
?? ??? ?char v25; // [sp+3Ch] [bp-164h]@1
?? ??? ?char v26[31]; // [sp+3Dh] [bp-163h]@3
?? ??? ?char v27; // [sp+5Ch] [bp-144h]@5
?? ?}data;
#pragma pack()
2.需要注意的是生成的偽代碼的局部變量中有些變量的大小有誤,在這次提取算法過程中在這點上吃足了苦頭。
比如說在上面的代碼中f5生成的偽代碼最后的兩個局部變量很可能是:
?????? char v26; // [sp+3Dh] [bp-163h]@3
?? ??? char v27; // [sp+5Ch] [bp-144h]@5
一般都需要對局部變量的大小進行校驗,比較好的一點是ida生成的偽代碼后面有注釋,會告訴我們變量的大小是多少,上面的代碼應該修改為
?????? char v26[31]; // [sp+3Dh] [bp-163h]@3
?? ??? char v27; // [sp+5Ch] [bp-144h]@5
如果把局部變量的地址對齊和變量的大小都修改完成后,提取的函數基本就沒有什么大的問題了。
3. 需要注意的是ida生成的偽代碼會有一些宏需要自己進行補充
#define _HIDWORD(x) (((_DWORD*)&x)[1])
#define _LODWORD(x) (((_DWORD*)&x)[0])
#define _HIWORD(x) (((_WORD*)&x)[1])
#define _LOWORD(x) (((_WORD*)&x)[0])
//#define __PAIR__(x,y) (((unsigned long long)(x) << 32) + (y))
#define _LOBYTE(x) (((_BYTE*)&x)[0])
#define BYTE1(x) (((_BYTE*)&x)[1])
#define BYTE2(x) (((_BYTE*)&x)[2])
#define BYTE3(x) (((_BYTE*)&x)[3])
這些都需要自己進行補齊
4.ida生成的偽代碼有部分會出現問題,主要體現在 a * ( b / c)這樣的表達式寫成a * b / c,這樣的問題需要進行具體的跟蹤比對才能發現,有這樣的問題就會比較耗時間,其實我不想說我在這個問題上被坑了好多時間進去了。
大體上在使用ida提取算法的時候注意以上幾點,就會節省很多時間。
最后把我使用ida提取的hashab算法共享上來,我把代碼中計算偏移地址的偏移數據刪除了,如果某位需要使用就要自己計算下獲取偏移地址時使用的偏移數據,不多只需要改一行代碼。
?http://files.cnblogs.com/xiaoshame/hashab.zip
轉載于:https://www.cnblogs.com/xiaoshame/p/4054827.html
總結
以上是生活随笔為你收集整理的ida提取hashab算法记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dtree的使用和扩展
- 下一篇: HTML 媒体