крэшится клиент при инжекте классического волкинжекта
использую qt, посему приходится все переводить в ат&т.
я уже все попробовал - не могу найти проблему, помогите, пожалуйста
вот скрин дебагера при крэше
[Ссылки могут видеть только зарегистрированные пользователи. ]
для нелюбителей атэтэ - вот скрин функции из дебагера (добавлен call 0x0 для специального крэша, чтобы была возможность заскринить)
[Ссылки могут видеть только зарегистрированные пользователи. ]
источник:
или переделай все как у меня. Инжект работает на любой ос, но вылетает через пару часов, рабочий инжект досих пор никто не выложил(который работает без вылетов).
Добавлено через 20 минут
Цитата:
Сообщение от serbus1
человек, который выложил этот код утверждал о том что он работает.
далее, я нашел рабочего бота с внешним файлом настроек, там была строчка
по сравнению с предыдущей версией фигурирует оффсет 0х10, однако даже после доба...
Это запись с PWA, ofs = 10 может принимать значения 10,18,1С, опытным путем остановился на 1С, как в оригинале.
Свои наработки я выложил, может быть еще кто-то желает поделиться своими? Боты ведь как то двигаются у других? Например гео бот, в котором есть старый инжект и новый инжект движения? Как другие решили эту проблему?(автопуть не предлагать)
Последний раз редактировалось diagnost; 14.09.2015 в 09:42.
Причина: Добавлено сообщение
убирал пуш 0 и в первом, и во втором случае. результат - мгновенный краш
Что то неправильно делаешь, PWA именно на этом инжекте бегает.
Чтобы не быть многословным , прикрепляю файл с ехе и исходниками на делфи ХЕ 8 проверил на вин 10 [Ссылки могут видеть только зарегистрированные пользователи. ]
Последний раз редактировалось diagnost; 14.09.2015 в 11:47.
спасибо, переделал функции и структуру под него
однако, это не помогло - все крашится
честно, изучил много статеек по плюсам\архитектуре памяти\структуре клиента, но, похоже, этих знаний недостаточно чтобы решить проблему
__
добавлю, что вылет происходит на 1м вызове функции клиента "CALL *0x4A1AA0\n\t", т.е. если я вставлю call *0x0 перед этйо функцией то клиент вылетает из-за call *0x0. если же после - то из-за "CALL *0x4A1AA0\n\t". как-то так. думаю проблема не в асме, иначе это было бы слишком просто
Последний раз редактировалось serbus1; 14.09.2015 в 17:24.
Причина: add
спасибо, переделал функции и структуру под него
однако, это не помогло - все крашится
честно, изучил много статеек по плюсам\архитектуре памяти\структуре клиента, но, похоже, этих знаний недостаточно чтобы решить проблему
Код:
void MOVEMENTS::injCTM(params* P) {
float x = P->param4;
float y = P->param5;
float z = P->param6;
unsigned long f = P->param7;
__asm__ (
"PUSHAL\n\t"
"MOVL $0xD2EBE4, %%EAX\n\t"
"MOVL 0x0(%%EAX), %%EAX\n\t" вот это откуда взялось?
"MOVL 0x28(%%EAX), %%EDI\n\t"
"MOVL 0x13F0(%%EDI), %%ECX\n\t"
"PUSHL $0x1\n\t"
"CALL *0x4A1AA0\n\t"
"MOVL %%EAX, %%ESI\n\t"
"LEAL 0x1C(%%ESP), %%EDX\n\t"
"PUSHL %%EDX\n\t"
"PUSHL %0\n\t"
"MOVL %%ESI, %%ECX\n\t"
"CALL *0x4A7DE0\n\t"
"MOVL 0x13F0(%%EDI), %%ECX\n\t"
"PUSHL $0x1\n\t"
"PUSHL %%ESI\n\t"
"PUSHL $0x1\n\t"
"CALL *0x4A2090\n\t"
"MOVL 0x13F0(%%EDI), %%ECX\n\t"
"MOVL 0x18(%%ECX), %%EAX\n\t"
"MOVL 0x0(%%EAX), %%ECX\n\t"
"MOVL %1, %%EAX\n\t" если вы строками пихаете, как параметры xyz собираетесь передавать?
"MOVL %%EAX, 0x20(%%ECX)\n\t"
"MOVL %2, %%EAX\n\t"
"MOVL %%EAX, 0x24(%%ECX)\n\t"
"MOVL %3, %%EAX\n\t"
"MOVL %%EAX, 0x28(%%ECX)\n\t"
"POPAL\n\t"
:
: "a"((unsigned long)f),
"b"((float)x),
"c"((float)z),
"d"((float)y)
);
}
void MOVEMENTS::CTM(float X, float Y, float Z) {
params* tP = new params;
for (int i = 0; i <= 100; ++ i) {
tP->param1[i] = 0;
}
tP->param4 = X; это откуда взялось если выше пишешь 123
tP->param5 = Y;
tP->param6 = Z;
tP->param7 = 1;
void* p;
p = (void*)(&injCTM);
rdr.InjectAndExecute(p, tP);
return ;
}
не думаю, что пробелма в инжекторе, он слизан, хотя кто его знает. так или иначе, инъект функции происходит
Код:
void READER::InjectAndExecute(void *f, void *p) {
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,this->PID);
Зачем открывать процесс если уже должен быть открыт?
void* pFunction = (void*)VirtualAllocEx(hProcess,NULL,255,MEM_COMMIT,PAGE_READWRITE);
почему эта строка совпадает вот
void* pParametrs = (void*)VirtualAllocEx(hProcess,NULL,255,MEM_COMMIT,PAGE_READWRITE);
вот с этой?
WriteProcessMemory(hProcess,pFunction ,f,250,NULL);
WriteProcessMemory(hProcess,pParametrs,p,250,NULL);
HANDLE hProcThread = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)pFunction,pParametrs,NULL,NULL);
WaitForSingleObject(hProcThread,INFINITE);
CloseHandle(hProcThread);
CloseHandle(hProcess); Зачем процесс 2 раза закрывать?
CloseHandle(hProcess);
если работаете со строками, тогда это не ваш инжект, другой должен быть
}
__
добавлю, что вылет происходит на 1м вызове функции клиента "CALL *0x4A1AA0\n\t", т.е. если я вставлю call *0x0 перед этйо функцией то клиент вылетает из-за call *0x0. если же после - то из-за "CALL *0x4A1AA0\n\t". как-то так. думаю проблема не в асме, иначе это было бы слишком просто
Я не знаком с языком возможно где то ошибся, сильно похож на си бульдер ( пометки сделал, проверяйте себя и меня)
Подведем итог где то, что то кусками выдрали перевели на свой язык, а проекта готового нету, даже теряется смысл самого проекта, поэтому что либо вам подсказать затрудняются здесь на форуме, проще заново написать или промолчать.
Сразу отвечу везде все одинаково, только язык правописания разный, синтаксические ошибки ищите сами. Это все равно что с вами я буду разговаривать на английском или немецком языке, а смысловая нагрузка будет таже самая только перевод не точный. У меня на данный момент с делфи проблема заключается в том, что слов не знаю (как в английском языке, надо славарь зазубривать и практика как можно больше) Поэтому мне проще готовый проект поковырять и его доработать используя другие исходники.
Последний раз редактировалось diagnost; 15.09.2015 в 00:10.
да, забыл сказать пишу на Qt. не сталкивался с читмейкерами, пишущими на данном фреймворке, поэтмоу пришлось во многом изобретать велосипед.
постараюсь все объяснить
1. на атэтэ мне приходилось переводить по оф документации, поэтому я решил заменить одну строчку двумя, т.е. не записать в еах то что находится по адресу, а записать в еах адрес и перейти с оффсетом 0х0, то есть по ссылке.
2. в ат&т перед регистарми нужно ставит %%, а параметры передаются следующим образом: после асм кода в кавычках нужно поставить два двоеточия, после первого - выходные данные, после второго - входные, при этом каждому параметру будет присвоен номер от 0, т.е. : "a"((unsigned long)f) = %0, "b"((float)x). насколько я понял, то что в кавычках(а b c d) не имеет значения.
для меня отдельный вопрос как все работает на архитектурном уровне. даже на делфи я не понимаю почему пихая в стек структуру из 5 переменных, при этом пушить только 3 координаты их них, я это не совсем понимаю.
3. насчет инжекта, я забыл сказать что если сделать функцию с асм кодом pushal \ popal без дополнительного кода, то она успешно инъектриуется. в любом клоузхэндл вернет ноль и этим все кончится).
данный код успешно инъектриуется
BYTE INJECTOR::InjectAndExecute(void *Func, void* Params)
{
HANDLE hProcThread;
HANDLE hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid);
if (!hProcess) return 0; // выйдем из функции если не удалось открыть процесс
WriteProcessMemory(hProcess,pFunction,Func,250,NULL);
WriteProcessMemory(hProcess,pParams,Params,250,NULL);
hProcThread = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)pFunction,pParams,NULL,NULL);
if(hProcThread==INVALID_HANDLE_VALUE) return 0; // не удалось создать поток
WaitForSingleObject(hProcThread,INFINITE); // ожидаем завершения работы потока
CloseHandle(hProcThread); // закрываем хэндл нашего потока
CloseHandle(hProcess); // закрываем хэндл процесса
return 1; // успешная инъекция и выполнение кода
}
полагаю, что проблема в том что я передаю не те параметры в стек, косячу с указателями и.т.д.
например, в структуре на делфи
Код:
TWalkParams = packed record
Packet: array [0..100] of byte;
//BaseAddr, GameAddr,
// CallAddress1,CallAddress2,CallAddress3: DWord;
Px,Py,Pz: single;
flying: DWORD;
// Param4: array [1..100] of widechar;
end;
я даже не могу понять это массив, или указатель на массив. конечно, очевидно, что указатель на массив которого нет в памяти клиента пушить бессмысленно, хотя он может пушится для места, или для забитья пустоты стек, которую нужно забить.
BYTE INJECTOR::InjectAndExecute(void *Func, void* Params здесьhProcess должен быть уже открыт )
{
HANDLE hProcThread;
это не надо // HANDLE //hProcess=OpenProcess(PROCESS_ALL_ACCESS,false,pid);
здесь ID процесса надо проверить а не сам процесс if (!hProcess) return 0; // выйдем из функции если не удалось открыть процесс
это правильно WriteProcessMemory(hProcess,pFunction,Func,250,NULL);
здесь не правильно WriteProcessMemory(hProcess,pParams,Params,250,NULL);
hProcThread = CreateRemoteThread(hProcess,NULL,NULL,(LPTHREAD_START_ROUTINE)pFunction,pParams,NULL,NULL);
if(hProcThread==INVALID_HANDLE_VALUE) return 0; // не удалось создать поток
WaitForSingleObject(hProcThread,INFINITE); // ожидаем завершения работы потока
CloseHandle(hProcThread); // закрываем хэндл нашего потока
эта строка совсем не нужна зачем плодить стоко потоков? В одном потоке работай CloseHandle(hProcess); // закрываем хэндл процесса
return 1; // успешная инъекция и выполнение кода
}
полагаю, что проблема в том что я передаю не те параметры в стек, косячу с указателями и.т.д.
например, в структуре на делфи
Код:
TWalkParams = packed record
Packet: array [0..100] of byte; Это резервирование места под пакеты (массив каждая ячейка размером в byte)
//BaseAddr, GameAddr,
// CallAddress1,CallAddress2,CallAddress3: DWord;
Px,Py,Pz: single;
flying: DWORD;
// Param4: array [1..100] of widechar; это под инжекты (массив каждая ячейка размером в widechar)
end;
я даже не могу понять это массив, или указатель на массив. конечно, очевидно, что указатель на массив которого нет в памяти клиента пушить бессмысленно, хотя он может пушится для места, или для забитья пустоты стек, которую нужно забить.[/QUOTE]
Смысл в том что вы работаете с чужим процессом, в этом процессе надо захватить(выделить) место, что бы ваша программа с могла работать, доступ к выделенному месту только через указатели. Получается чтобы не рухнула игра вам нужно перехватить указать место выполнения и вернуть наместо все как было после выполнения.
Итог Сам инжект (шприц по другому) резервирует место под наши действия которые мы хотим произвести. И нет смысла все время открывать и закрывать это место, проще подчистить и использовать повторно. Туда же мы пихаем асм код и данные, и через указатели с ними работаем. Чтобы у вас все заработало начните с простого, например с выделения моба(взять его в таргет), через инжект (пакет не трогайте). Как у вас заработает, перейдете к движению по координатам.
Я могу в некоторых моментах ошибаться сам учусь. Поэтому отцы жука думаю меня поправят.
Оо! Еще раз пересмотрел все, походу уже свое вам навязываю. И ввожу вас в заблуждение не зная вашего языка.
Скорее всего вам надо определиться как асм будете загонять в память? Как строку или используя чистый асм(ваш язык чистый асм поддерживает?) в зависимости от этого шприц разный. Вот пример работы на делфи через строку (на вин 10 не работает, надо пуш 0 убрать, чтобы заработало) Например аутоит(язык) не поддерживает чистый асм, загоняют через опкод по байтно( для меня через строку) описывая каждый опкод, гемор еще тот. Вот [Ссылки могут видеть только зарегистрированные пользователи. ].(можно открыть в блокноте)
Ага нашел, твой язык чистый асм не поддерживает. С++bulder близкий язык. Вот это сможешь перевести на свой язык и запустить?(не забудьте сменить адреса они старые). Смысл такой, кнопка и поле чтобы ввести WID моба, по нажатию на кнопку должен выделится моб. [Ссылки могут видеть только зарегистрированные пользователи. ]
Цитата:
de <tlhelp32.h>
... typedef tagPROCESSENTRY32W pGameProcess;
... bool CallRemoteFunction(pGameProcess pProcess)
{
//Remote Thread Handle
HANDLE hProcess=NULL;
//Inject Thread handle
HANDLE hThread=NULL;
//Inject Fuction Address after allocate
LPVOID ThreadCodeAddr=NULL;
//Inject Function
LPVOID Func=SelectMonster;
//Inject Fuction Stack Address after allocate
LPVOID ThreadDataAddr=NULL;
//Inject Fuction Stack Data
LPCVOID lpParam = NULL;
DWORD Value = 0;
lpParam = &Value;
Привет, ты на писал "Вот пример работы на делфи через строку (на вин 10 не работает, надо пуш 0 убрать, чтобы заработало)" Какой убрать, там только один, но тогда взлета нет. На вин 7 все работает, на 10 клиент вылетает. Уже голову сломал что исправить.
В ЛС просили выложить рабочий walk на делфи (чтобы работало на вин 10) [Ссылки могут видеть только зарегистрированные пользователи. ]
Запуск через админа, окно не переименовывать.
Последний раз редактировалось diagnost; 16.09.2015 в 00:23.
Причина: Добавлено сообщение