2016-06-11 49 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