printf hacking的格式字符串

时间:2012-12-28 18:07:42

标签: c++ string-formatting

这是一个有用(非恶意)目的的黑客攻击,我不确定我想做什么,但我想试试。我正在运行闭源软件,因此我无法修改原始函数调用。电话是:

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

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

3 个答案:

答案 0 :(得分:3)

使用API Hooking

可以找到您要找的内容
  

API挂钩包括拦截程序中的函数调用并将其重定向到另一个函数。通过执行此操作,可以修改参数,如果您选择在确实应该成功时返回错误代码,则可以欺骗原始程序,依此类推。所有这些都是在调用实函数之前完成的,最后,在修改/存储/扩展原始函数/参数之后,控制权将被交还给原始函数,直到再次调用它为止。

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

有关详细信息,请转到Detours - Microsoft Research

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果您在设置value之前有权访问LabelFormat,那么您只需将LabelFormat设置为您要显示的字符串(不含任何%代码在其中)。然后该函数将忽略额外的参数,但它将打印出您想要的内容。如果您还没有访问value,那么我看不到任何方法只使用格式代码进行映射。