【发布时间】:2016-07-03 00:26:31
【问题描述】:
我正在尝试从注入的 Dll 中访问 char*。 但不知何故它不想 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的输出应该显示单个<而不是完整的字符串。如果您在帖子中提到这一点,那么该错误对于其他人来说就很明显了。