線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:765
推到 Plurk!
推到 Facebook!

已知一個PE文件是由delphi編譯的,但如何知道到底由哪個delphi版本編譯的呢?

尚未結案
test123
一般會員


發表:1
回覆:0
積分:0
註冊:2004-08-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-08-16 19:33:39 IP:221.216.xxx.xxx 未訂閱
我查看了DEDE 3.10 build 1527版本的源碼(網上提供的最高版本就是這個了,實際版本是3.50.2),他是這樣實現的,我測試了一下,好像D6/D7無法區分,但3.50.2就可以,什麼原理,請高手賜之,另問這是最好的獲取delphi版本方式嗎? function MemGetDelphiVersion(MemStr: TMemoryStream; ImageBase, CodeRVA, CodeSize, HeaderSize: DWORD): DWORD; const IDS = 'TControl'; arrBoolean: array[0..7] of byte = ($07, $42, $6F, $6F, $6C, $65, $61, $6E); var b1, b2: Byte; dw, dw1, bkup, Delta, i: DWORD; s: string; buff: array of Byte; bD2, bClassFound: Boolean; function InCODE(DW: DWORD): boolean; begin result := (dw > ImageBase (CodeRVA)) and (dw < ImageBase (CodeRVA) CodeSize) end; begin Result := $FFFE; bD2 := False; Delta := ImageBase CodeRVA - HeaderSize; MemStr.Seek(HeaderSize 5, soFromBeginning); //MemStr.Seek(HeaderSize 1,soFromBeginning); FOR Delphi 2 SetLength(buff, 9); MemStr.ReadBuffer(buff[0], 9); if not CompareMem(@buff[0], @arrBoolean[0], 8) then begin // Check For Delphi 2 MemStr.Seek(HeaderSize 1, soFromBeginning); SetLength(buff, 9); MemStr.ReadBuffer(buff[0], 9); if not CompareMem(@buff[0], @arrBoolean[0], 8) then bD2 := False else bD2 := True; end; if bD2 then Result := $FFF0 else Result := $FFFF; MemStr.Seek(HeaderSize, soFromBeginning); repeat MemStr.ReadBuffer(dw, 4); bkup := MemStr.Position; bClassFound := dw - Delta = MemStr.Position; if bClassFound then begin MemStr.ReadBuffer(b1, 1); if b1 <= 16 then begin //Nasty anti-tirck for nasty dump-hide trick if CodeSize = 0 then CodeSize := $7F000000; MemStr.ReadBuffer(b2, 1); SetLength(s, b2); MemStr.ReadBuffer(s[1], b2); MemStr.ReadBuffer(dw, 4); if InCODE(dw) then begin dw1 := dw - Delta; MemStr.Seek(dw1 - 40, soFromBeginning); MemStr.ReadBuffer(dw, 4); if s = IDS then begin Result := dw; exit; end; end; end; end; MemStr.seek(bkup, soFromBeginning); until (MemStr.Position >= CodeSize); { MemStr.Seek(CodeRVA 5,soFromBeginning); SetLength(s,3); MemStr.ReadBuffer(s[1],3); // Correction for BCB5 if s='C ' then if dw=$120 then Result:=$121; } // $0 : 'D3'; // $B4 : 'BCB4' // $114 : 'D4'; // $120 : 'D5'; // $121 : 'BCB5'; // $15C, $160 : D6 // $FFFF : 'Unknown'; // $FFF0 : 'D2' end;
系統時間:2024-06-30 18:47:23
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!