这是一个有用(非恶意)目的的黑客攻击,我不确定我想做什么,但我想试试。我正在运行闭源软件,因此我无法修改原始函数调用。电话是:
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
等等。 是否可以操纵格式字符串为我执行指定的映射,因为我无法修改原始代码?
答案 0 :(得分:3)
API挂钩包括拦截程序中的函数调用并将其重定向到另一个函数。通过执行此操作,可以修改参数,如果您选择在确实应该成功时返回错误代码,则可以欺骗原始程序,依此类推。所有这些都是在调用实函数之前完成的,最后,在修改/存储/扩展原始函数/参数之后,控制权将被交还给原始函数,直到再次调用它为止。
您必须使用sprintf拦截原始调用到函数,并在将控制权移交给函数之前用所需的值覆盖this->LabelFormat
。
有关详细信息,请转到Detours - Microsoft Research
答案 1 :(得分:0)
我认为仅使用格式字符串是不可能的。你应该在某处添加额外的机器指令。例如,您可以将sprintf
函数替换为您自己的函数。
答案 2 :(得分:0)
如果您在设置value
之前有权访问LabelFormat
,那么您只需将LabelFormat
设置为您要显示的字符串(不含任何%
代码在其中)。然后该函数将忽略额外的参数,但它将打印出您想要的内容。如果您还没有访问value
,那么我看不到任何方法只使用格式代码进行映射。