rdtsc 可以轻松修补吗?

Can rdtsc be easily patched out?

在多核处理器之前的时代创建的许多程序,使用指令 rdtsc 来获取精确数据。

这在多线程程序中是一个严重的问题,因为它们可能以冲突的值结束,并且许多程序因此而彻底崩溃(一些单线程程序也可能崩溃,具体取决于它们使用 rtdsc 的方式) .

至少在 Windows 上,通常建议只设置 "processor affinity",不幸的是,这也严重削弱了一些设计(不正确,显然)使用并行性的程序。

所以我在想,即使没有任何类型的源代码,也很难找到崩溃程序中的 rdtsc 调用并将其替换为其他程序吗? (我不知道那是什么东西...)

作为一般规则,如果有人给你一个机器代码二进制文件,你可能会非常(图灵!)很难确定其中的哪些字节是指令,哪些是代码。如果你做错了,你甚至找不到要修补的 RDTSC 指令。 (更糟糕的是:一些程序 生成 代码;现在数据区域中的东西 运行time 可能会短暂地包含 RDTSC)。在非常奇特的程序中,一些指令可能确实与其他指令重叠,导致一些 JMP 确实落在了被识别为长指令的中间。 (x86 指令可能有 16 个字节长!)。

二进制逆向工程的人有这个问题。总的来说,我不知道他们是如何成功的。我怀疑这是因为大多数程序目标代码是由没有试图隐藏任何东西的编译器生成的(当你遇到隐藏任何东西的编译器时要小心)。

如果您能找到它们,我假设您会通过对例程的函数调用来替换它们,该例程将已知常量加载到寄存器中以避免您建议的不一致问题。修补他们的位置可能会很尴尬; RDTSC 是(我认为)2 个字节,它们可能夹在另外两条由于某种原因无法移动的指令之间。因此,您可能被迫在每个 RDTSC 上仅使用一个断点(1 字节)来陷入 RDTSC 模拟器;如果有人,这可能会造成性能问题 正在使用 RDTSC 读取计时循环中的纳秒时钟滴答。

总而言之,这似乎是一条艰难的道路。您有多想要 运行 真正的旧程序,为什么?