2016-07-03 2 views
-5

Я пытаюсь получить доступ к 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); 
+0

Значит, строка завершена нулем? Это то, что ожидает «% s». Кроме того, все это кастинг не помогает. Вы должны печатать, целое целое число, то, что LastText находится в прямом цикле, и отменить 'printf' пока. Тогда вы узнаете, если вы даете бессмыслицу «printf» для печати, или целая последовательность на самом деле представляет собой последовательность печатных символов ASCII. Что касается вашего названия, это вводит в заблуждение, так как 'printf' работает все время. Проблема в том, что вы даете ему для работы. – PaulMcKenzie

+0

в соответствии с моим шестиугольником это не должно быть ... '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' –

+0

Этот шестнадцатеричный дамп показывает, что строка использует 16-битные символы, а не 8-разрядные символы ASCII. «% S» останавливается в первом 0 * байте *, а первый, который он видит, находится после '0x3C'. Строка содержит все символы большой строки символов из-за чередующегося 0 байта после каждого ненулевого байта, другими словами, это 'L" '- обратите внимание на' L' для обозначения широкого строкового литерала. Вывод с использованием '% s' должен был отображать только один символ' <'вместо полной строки. Если вы указали это в своем сообщении, ошибка была бы очевидна для других прямо перед собой. – PaulMcKenzie

ответ

0

Это был широкий характер. Мне пришлось использовать %ls.

0

Во-первых, убедитесь, что эти сдвиги, которые у вас есть (0x. ...) являются правильными. В контексте добавления к целочисленному указателю они будут масштабироваться соответствующим коэффициентом, , а именно., 4. Если предполагается, что они являются жесткими константами, которые представляют собой смещения смещенного байта, вы будете ненадлежащим образом умножать каждый из них на четыре (предполагая 32-битные целые числа).

Помимо всего прочего, что это за ерунда с int * this и int *, что и бесконечные отливки здесь и там? Если все, что вам нужно, это конкретный адрес, который составляет 0xThisMany + 0xThatMany + 0xNextGap байты с определенного базового адреса, тогда вы должны просто добавить их вместе и выполнить один расчет.

Это, вероятно, первое и самое главное из ваших трудностей.

+0

Вы совершенно ошибаетесь, я разыгрываю ... также адрес последнего текста в порядке. Я проверил в olly –

Смежные вопросы