跟踪变量访问/使用说明

逆向工程 视窗 二元分析 调试 局部变量
2021-06-13 19:47:36

有一个很棒的小型闭源免费 Windows 程序(用 Delphi 编写),我已经使用了多年。WinBar 在任务栏上方显示一个小栏,它提供一些系统信息并提供对一些有用功能的访问。

不幸的是,它有一个非常烦人的错误。Memory Usage 组件只显示已安装内存的一半,并显示 0MB 已使用,直到至少有一半内存已被使用,然后它从那里开始计数(例如,如果安装了 4GB,并且 1GB 正在使用中,它说0MB/2047MB;如果正在使用 3GB,则显示 1024MB/2047MB)。

看起来这是因为它对已安装和已使用的内存计数使用有符号的 32 位值。这应该是一个非常简单的修复,但可惜的是,它的开发早已停止(SourceForge 上有一个 2.x 版本——也已停产——它没有受到这个错误的影响,但它太不同了,我没有喜欢它)。

我想通过查找处理相关值的代码位并更改它们以将其视为无符号来深入研究并解决此问题。这可能很容易(更改printf格式说明符),也可能很困难,这取决于代码的性质(如果没有看到确切的汇编指令就无法判断)。

不久前我尝试通过 WDasm32 运行它,但找不到任何好的线索。它在栏中显示 ThunderRT6PictureBoxDC 控件中的值。

有人对如何做到这一点有任何建议吗?

1个回答

正如@Igor Skochinsky已经评论过的那样,该软件确实是用在本机模式下编译的Visual Basic 6编写的(VB6 也支持 P 模式)。您可以使用Detect It Easy等 PE 信息工具来验证这一点(但在此之前您需要解压ASPack包装器)。

该错误的原因是由于多种原因。

该软件使用 WinApi 函数GlobalMemoryStatus来检索当前使用的系统内存。现在这个函数有几个怪癖:

第一的

内存超过 4 GB 的计算机上,GlobalMemoryStatus 函数可能返回错误信息,报告值 –1 表示溢出。为此,应用程序应改用 GlobalMemoryStatusEx 函数

因此,如果您的系统内存超过 4 GB,则此函数的输出不可靠,因此可能会显示错误值。解决这个问题很困难。

第二

内存大于 2 GB 且小于 4 GBIntel x86 计算机上,GlobalMemoryStatus 函数将始终在 MEMORYSTATUS 结构的 dwTotalPhys 成员中返回 2 GB同样,如果总可用内存在 2 到 4 GB 之间,则 MEMORYSTATUS 结构的 dwAvailPhys 成员将向下舍入为 2 GB如果使用 /LARGEADDRESSAWARE链接器选项链接可执行文件,则 GlobalMemoryStatus 函数将返回两个成员中正确的物理内存量

要修复此错误,您需要使应用程序具有Large Address Aware这可以通过在CFF Explorer 中加载它来完成,Nt Headers -> File headers -> Characteristics检查标志App can handle > 2GB address space


现在,要将从中获得的整数内存值转换GlobalMemoryStatus为字符串,应用程序使用该CStr函数。

VB6 没有无符号的 32 位整数数据类型唯一的无符号数据类型是 8 位Byte

假设您的系统内存大于 2GB 但小于 4GB,并且您已经修复了上面提到的第二个错误。

假设您的系统有 3GB 内存。这相当于3,22,12,25,472十进制1100 0000 0000 0000 0000 0000 0000 0000字节二进制字节。
由于此值MSB为 1,因此传递给 时将被视为负数CStr因此,结果字符串将- 1GB代替3GB. 对此也没有简单的解决方法。

因此,总而言之,该软件仅在您的系统内存小于 2GB 时可用

更新(有符号整数错误修复)

可以修补有符号整数错误,使应用程序可用到 4GB。修补二进制以将SAR(有符号移位)转换SHR(无符号移位)指令。

原始代码

00092DCD  and edx,000FFFFF
00092DD3  add eax,edx
00092DD5  sar eax,14        ; <<<<<<<<<<<
00092DD8  mov dword ptr [ebp-28],eax
00092DDB  mov eax,dword ptr [ebp-54]
00092DDE  cdq
00092DDF  and edx,000FFFFF
00092DE5  add eax,edx
00092DE7  sar eax,14        ; <<<<<<<<<<<
00092DEA  mov dword ptr [ebp-30],eax

修补代码

00092DCD  and edx,000FFFFF
00092DD3  add eax,edx
00092DD5  shr eax,14        ; <<<<<<<<<<<
00092DD8  mov dword ptr [ebp-28],eax
00092DDB  mov eax,dword ptr [ebp-54]
00092DDE  cdq
00092DDF  and edx,000FFFFF
00092DE5  add eax,edx
00092DE7  shr eax,14        ; <<<<<<<<<<<
00092DEA  mov dword ptr [ebp-30],eax

结合大地址感知和带符号整数补丁,该应用程序可用于 4 GB 内存