C++ 来自char*的printf不';t工作VS2013 C++;

C++ 来自char*的printf不';t工作VS2013 C++;,c++,string,char,C++,String,Char,我试图从注入的Dll中访问char*。 但不知怎的,它不想printf()。。。 指针是对的,我今天早些时候打印了它(使用了一些奇怪的格式) 工作正常(所以一定是指针出了问题?) 不起作用: int ClientDll = (int)GetModuleHandleA("client.dll"); int RadarBase = *(int*)(ClientDll + 0x4E8395C); int Temp = *(int*)(RadarBase + 0x14); int LastText =

我试图从注入的Dll中访问char*。 但不知怎的,它不想printf()。。。 指针是对的,我今天早些时候打印了它(使用了一些奇怪的格式)

工作正常(所以一定是指针出了问题?)

不起作用:

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 );

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

最重要的是,int*this和int*that以及无休止的铸件在这里和那里有什么废话?如果您只需要一个特定的地址,即来自某个基址的0xThisMany+0xThatMany+0xNextGap字节,那么您应该将它们相加并进行一次计算


这可能是你面临的首要困难

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

你完全错了!我正在解引用。。。另外,lasttext的地址也可以。我签入ollySo字符串以null结尾?这就是“%s”所期望的。而且,所有这些演员都没用。您应该一个整数一个整数地打印出一个简单的循环中最后的文本,并暂时取消
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字节处停止,它看到的第一个字节在
0x3C
之后。由于每个非零字节后都散布着0字节,因此字符串具有宽字符串的所有标记,换句话说,它是
L”
——请注意
L
表示宽字符串文字。使用
%s
的输出应该显示一个

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 );