printf黑客的格式字符串

Format string for printf hacking

本文关键字:字符串 格式 黑客 printf      更新时间:2023-10-16

这是黑客为一个有用的(非恶意)目的,我不确定我想要什么可以做,但我想尝试。我运行的软件是闭源的,所以我不能修改原来的函数调用。调用是:

sprintf(string, this->LabelFormat, value)

this->LabelFormat默认为%-#6.3g。目的是为双精度的图例格式化标签,因此value是一个数字。

我可以设置this->LabelFormat为任何我想要的。我想执行从数字到字符串的映射,例如:

value | string
--------------
  0.0 | None
  1.0 | I
  2.0 | J
  3.0 | K

等等。是否有可能操纵格式字符串为我执行指定的映射,因为我不能修改原始代码?

你正在寻找的是可能与API挂钩

API挂钩包括拦截程序中的函数调用并将其重定向到另一个函数。通过这样做,可以修改参数,如果您选择返回错误代码,则可以欺骗原始程序,而实际上它应该成功,等等。所有这些都是在真正的函数被调用之前完成的,最后,在修改/存储/扩展原始函数/参数之后,控制权被移交给原始函数,直到它再次被调用。

您必须使用sprintf拦截对函数的原始调用,并在将控制权交给函数之前用所需的值覆盖this->LabelFormat

有关更多信息,请访问Detours - Microsoft Research

我认为只有格式字符串是不可能的。您应该在某处添加额外的机器指令。例如,您可以用自己的函数替换sprintf

如果您在设置LabelFormat之前可以访问value,那么您所要做的就是将LabelFormat设置为要显示的字符串(其中根本没有任何%代码)。这个函数会忽略这个额外的参数,但是它会打印出你想要的结果。如果你没有访问value,那么我看不到任何方法来做映射只有格式代码