Я пытаюсь получить доступ к char * изнутри инъецированной Dll. Но почему-то это не хочет printf() ... Указатель прав, я получил его для печати ранее сегодня (использовал какой-то странный формат).printf от char * не работает VS2013 C++
работы (так что это должно быть что-то не так с указателем):
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' работает все время. Проблема в том, что вы даете ему для работы. – PaulMcKenzie
в соответствии с моим шестиугольником это не должно быть ... '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' должен был отображать только один символ' <'вместо полной строки. Если вы указали это в своем сообщении, ошибка была бы очевидна для других прямо перед собой. – PaulMcKenzie