printf黑客的格式字符串
Format string for printf hacking
这是黑客为一个有用的(非恶意)目的,我不确定我想要什么可以做,但我想尝试。我运行的软件是闭源的,所以我不能修改原来的函数调用。调用是:
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
,那么我看不到任何方法来做映射只有格式代码
相关文章:
- 字符串::格式有什么用. 我也没有在互联网上得到它
- 如何检查字符串格式在读取C++文本文件时是否有效?
- 十进制到八进制递归C++.以标准::字符串格式输出
- 如何从字符串格式中提取 3 个整数"v%d.%d.%d"?
- 查找可变参数列表的字符串格式指定符
- 字符串格式替换为 snprintf 中字符中的值
- 使用堆栈将字符串格式的十进制转换为双精度
- 使用字符串格式限制十六进制数字的数量
- 视觉C++:字符串格式
- C++字符串格式实现错误
- 如何在Xcode中将长双精度转换为字符串格式?或如何解决错误"use of undeclared identifier 'to_string' "
- C++以字符串格式 YYYYMMDD 减去天数
- 如何在windows和linux中使用相同的宽字符串格式
- 如何将标准::字符串格式的 JSON 解码为 Boost 属性树
- C++格式的字符串格式
- 使用C++将任何形式的日期-时间字符串格式更改为美国日期-时间格式
- 使用C/C++设置字符串格式
- 如何创建以字符串格式使用给定变量文本的宏(或其他工具)
- 如何转换?toString() 的 C 字符串格式
- 用字符串格式运算符替换C++字符串