【问题标题】:printf from char* doesn't work VS2013 C++来自 char* 的 printf 不起作用 VS2013 C++
【发布时间】:2016-07-03 00:26:31
【问题描述】:

我正在尝试从注入的 Dll 中访问 c​​har*。 但不知何故它不想 printf() ...... 指针是对的,我今天早些时候打印了它(使用了一些奇怪的格式)。

有效(所以它一定是指针有问题?):

char* TestStr = "dsds";
printf("%s \n", TestStr);

不起作用:

int ClientDll = (int)GetModuleHandleA("client.dll");
int RadarBase = *(int*)(ClientDll + 0x4E8395C);
int Temp = *(int*)(RadarBase + 0x14);
int LastText = *(int*)(Temp + 0x11C);//Getting the right pointer from memory
printf("%s \n", (char*)LastText );

【问题讨论】:

  • 所以字符串是空终止的?这就是“%s”所期望的。此外,所有这些铸造都无济于事。您应该逐个整数地打印出 LastText 在一个简单循环中的内容,并暂时废弃printf。然后你就会知道你是在给printf打印废话,还是整数序列实际上是一个可打印的ASCII字符序列。至于你的标题,这是一种误导,因为printf 一直在工作。问题是你给它的工作。
  • 根据我的 hexdump 这不应该是这种情况...3C 00 66 00 6F 00 6E 00 74 00 20 00 63 00 6F 00 6C 00 6F 00 72 00 3D 00 22 00 23 00 66 00 66 00 64 00 66 00 39 00 33 00 22 00 3E 00
  • 该十六进制转储显示该字符串使用 16 位字符,而不是 8 位 ASCII 字符。 "%s" 在第一个 0 byte 处停止,它看到的第一个是在0x3C 之后。由于在每个非零字节之后散布了 0 字节,因此该字符串具有作为宽字符串的所有标记,换句话说,它是 L"<font color="#ffdf93"> - 请注意 L 表示宽字符串文字。您使用 %s 的输出应该显示单个 < 而不是完整的字符串。如果您在帖子中提到这一点,那么该错误对于其他人来说就很明显了。

标签: c++ string char


【解决方案1】:

首先,确保您拥有的那些偏移量 (0x....) 是正确的。在添加到整数指针的上下文中,它们将按适当的因子放大,viz.,四。如果这些应该是表示字面字节偏移量的硬常量,那么您将不恰当地将它们中的每一个乘以四(假设为 32 位整数)。

除此之外,int *this 和 int *that 以及到处都是无休止的强制转换是什么废话?如果你想要的只是一个特定地址,即来自某个基地址的 0xThisMany + 0xThatMany + 0xNextGap 字节,那么你应该将它们加在一起并进行一次计算。

这可能是您遇到的第一个问题,也是最重要的问题。

【讨论】:

  • 你完全错了!我正在取消引用... lasttext 的地址也可以。我签到了 olly
【解决方案2】:

这是一个宽字符。我不得不使用%ls

【讨论】:

    猜你喜欢
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 2021-04-10
    相关资源
    最近更新 更多