ida提取hashab算法记录
????? 話說ida f5功能確實(shí)很強(qiáng)大,以后還會(huì)使用到f5進(jìn)行提取代碼,記錄下這次提取代碼過程中的想法。
????? 首先需要注意f5生成的偽代碼函數(shù)內(nèi)的局部變量都是以1字節(jié)對(duì)齊的,f5把一個(gè)函數(shù)使用的堆棧中的地址都對(duì)應(yīng)到了一個(gè)變量上。ida生成的偽代碼中會(huì)經(jīng)常在某個(gè)變量的基礎(chǔ)上對(duì)后面的數(shù)據(jù)進(jìn)行賦值和拷貝。可以使用下面的方法進(jìn)行解決。然后使用全部替換,在所有的變量前都加上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.需要注意的是生成的偽代碼的局部變量中有些變量的大小有誤,在這次提取算法過程中在這點(diǎn)上吃足了苦頭。
比如說在上面的代碼中f5生成的偽代碼最后的兩個(gè)局部變量很可能是:
?????? char v26; // [sp+3Dh] [bp-163h]@3
?? ??? char v27; // [sp+5Ch] [bp-144h]@5
一般都需要對(duì)局部變量的大小進(jìn)行校驗(yàn),比較好的一點(diǎn)是ida生成的偽代碼后面有注釋,會(huì)告訴我們變量的大小是多少,上面的代碼應(yīng)該修改為
?????? char v26[31]; // [sp+3Dh] [bp-163h]@3
?? ??? char v27; // [sp+5Ch] [bp-144h]@5
如果把局部變量的地址對(duì)齊和變量的大小都修改完成后,提取的函數(shù)基本就沒有什么大的問題了。
3. 需要注意的是ida生成的偽代碼會(huì)有一些宏需要自己進(jìn)行補(bǔ)充
#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])
這些都需要自己進(jìn)行補(bǔ)齊
4.ida生成的偽代碼有部分會(huì)出現(xiàn)問題,主要體現(xiàn)在 a * ( b / c)這樣的表達(dá)式寫成a * b / c,這樣的問題需要進(jìn)行具體的跟蹤比對(duì)才能發(fā)現(xiàn),有這樣的問題就會(huì)比較耗時(shí)間,其實(shí)我不想說我在這個(gè)問題上被坑了好多時(shí)間進(jìn)去了。
大體上在使用ida提取算法的時(shí)候注意以上幾點(diǎn),就會(huì)節(jié)省很多時(shí)間。
最后把我使用ida提取的hashab算法共享上來,我把代碼中計(jì)算偏移地址的偏移數(shù)據(jù)刪除了,如果某位需要使用就要自己計(jì)算下獲取偏移地址時(shí)使用的偏移數(shù)據(jù),不多只需要改一行代碼。
?http://files.cnblogs.com/xiaoshame/hashab.zip
轉(zhuǎn)載于:https://www.cnblogs.com/xiaoshame/p/4054827.html
總結(jié)
以上是生活随笔為你收集整理的ida提取hashab算法记录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dtree的使用和扩展
- 下一篇: HTML 媒体