【问题标题】:Changing floating point value in exe在exe中更改浮点值
【发布时间】:2016-10-12 11:33:38
【问题描述】:

我有一个几年前用 Delphi(我认为是 Delphi 7)编写的 Windows 程序 (exe),并且该程序仍然偶尔使用。它包含一个 Single 类型变量,在代码中的某个点乘以 0.9。

我想使用十六进制编辑器将 exe 文件中的 0.9 更改为 0.8,我需要帮助才能找到要更改的代码的相关部分。

变量声明为

private  myValue: Single;

当一个按钮被点击时,一个组件的编辑值被设置为 Round(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。

【问题讨论】:

  • 您确实在文件中搜索为 66 66 66 3f 吗?
  • 0.9 无法准确表示。最接近的单曲确实是0x3f666666。但是你怎么知道这个常量是作为一个单一的存储的。解决这个问题的明显方法是自己编译代码并查看省略了什么。试试看。
  • @SamiKuhmonen 也尝试过,因为我不确定字节顺序。
  • @DavidHeffernan 我做了一个(可能是错误的)假设,即常量和它所乘的变量存储为同一类型。

标签: delphi assembly delphi-7 reverse-engineering disassembly


【解决方案1】:

浮点字面量常量在 32 位版本的 Delphi 中存储为 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

【讨论】:

  • 好的,我找到了那个序列。奇怪的是我发现了两个例子。我会一一改变它们,看看会发生什么。我必须将程序连接到数据库服务器以测试更改,并且可能需要一些时间才能有机会这样做。如果它有效(我相信它会),我会接受你的回答。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 2018-03-24
  • 2016-07-16
相关资源
最近更新 更多