2016-06-11 52 views
5

我有一個Windows程序(EXE)是寫在德爾福(德爾福7我認爲)幾年前,該程序仍然偶爾使用。它包含一個Single類型變量,它在代碼中的某個點乘以0.9。更改浮點數值在exe

我想使用十六進制編輯器在exe文件中將0.9更改爲0.8,我需要幫助來查找要更改的代碼的相關部分。

變量聲明爲

private myValue: Single; 

,當點擊一個按鈕組件的編輯值被設置爲圓形(myvalue的* 0.9)

procedure MyForm.buttonClick(Sender: TObject); 
begin 
    if button.Down then 
    myEditComponent.EditValue := Round(myValue * 0.9); 
end; 

值0.9只使用一次整個代碼,所以我認爲它應該很容易找到它。 我知道0.9作爲DWORD的十六進制表示應該是0x3f666666,但我無法在exe中找到該值。

那麼它要麼是我不對,0.9表示了不同的十六進制字符串或編譯器制定這一計算以不同的方式(比如myvalue的* 9/10或其他方式)或..

之前你建議我重新編譯該項目:我有源代碼,但它是一個具有多個依賴項的大型項目。該代碼依賴於多個組件包庫和數十個第三方組件。爲了重新編譯代碼,可能需要幾天時間才能獲得並安裝舊版本的德里並註冊所有組件。不是我想爲一個不經常使用的程序的這麼小的改變做的事情。

如果我安裝了Delphi,我只需編寫這幾行代碼並反彙編/調試它就可以看到彙編代碼。有了這個程序集,我可以弄清楚在exe中需要改變什麼。我希望有人能指出我正確的方向,所以我不必安裝Delphi的舊版本。

+3

你做搜索它作爲66 66 66 3F替換文件中呢? –

+0

0.9不能準確表示。最接近的單個確實是'0x3f666666'。但是,你怎麼知道常量是作爲一個單獨存儲的。解決這個問題的顯而易見的方法是自己編譯代碼並查看省略的內容。試試看。 –

+0

@SamiKuhmonen嘗試這種方式,因爲我不確定字節順序。 – tinform

回答

9

浮點字面常量在Delphi的32位版本中存儲爲80位擴展。

值0.9存儲爲66 66 66 66 66 66 66 E6 FE 3F

0.8與CD CC CC CC CC CC CC CC FE 3F

+0

好的,我發現了那個序列。奇怪的是,我發現了兩個實例。我會逐一改變他們看看會發生什麼。我必須將程序連接到數據庫服務器以測試更改,在我有機會這樣做之前可能需要一些時間。如果它有效(我相信會),我會接受你的答案。 – tinform