-
Постов
705 -
Зарегистрирован
-
Посещение
-
Победитель дней
7
Тип контента
Профили
Форумы
Загрузки
Блоги
Весь контент RockHammer
-
Как будучи дллкой создать MessageBox (о том, что ошибка при записи)? Или нет, еще лучше: как создать отладочную консоль? Но не запускать ее при инжекте дллки, а только когда условие сработает (что VirtualProtect вернет нулик) Вот переделанный код (пока что не тестил): DWORD WINAPI MemoryHook(int Size, int address, char ourByte[]){ DWORD oldProtect; DWORD ReadWriteProtect = VirtualProtect((void*)address, Size, PAGE_EXECUTE_READWRITE, &oldProtect); //VirtualProtect((void*)address, Size, PAGE_EXECUTE_READWRITE, &oldProtect); DWORD ReadProtect = VirtualProtect((void*)address, Size, oldProtect, &oldProtect); DWORD ReadWriteProtect; if (ReadWriteProtect = 0) { //проверочка //сообщенька, что печалька случилась. выходим из функции. } else if (ReadWriteProtect != 0) { memcpy((void*)address, (PBYTE)ourByte, Size); //если все норм - мемсетим адреса DWORD ReadProtect; //ставим прежнюю защиту if (ReadProtect = 0) { //если неудачное восстановление защиты, то... //соощенька, что при восстановлении защиты памяти - печалька случилась. ну и return, конечно же. } else if (ReadProtect != 0) { //сообщенька, что все прошло успешно, все радуются пляшут и повсюду котята) } } return true;}З.ы.ы. попутный вопрос, как менять цвет текста в консоли, не меняя цвет бекграунда? Хочу прикрепить такую штучку, что если успешная запись - текст выводится зеленым. Если нет - красным.
-
С чем-чем?
-
Я замечал. И не только тормоза, еще и глюки конкретные. Создал свою тему в разделе "О работе сайта и форума"
-
Калькулирую! У меня так же тупит. Свою тему в разделе соответствующем я же создал.
-
Нет, ты не понял. В ProtectHacker есть функции записи в память. Массовые. Эта функция инициализируется в потоке, при конекте дллки. Когда функция не закомментирована (т.е. работает) - крашит сразу после инжекта. Теперь, когад функцию ProtectHacker закоментил - крашит при включении любой функции, которая использует запись в память. Думаю проблема как раз функции MemoryHook (запись в память) В таком случае, как быть?
-
Работает, до включения другой функции.
-
Прописать условие с мемхаком можно прямо в менюшке. Втыкать в поток не обязательно. Т.к. по сути условие с мемхаком - это часть менюшки.
-
Пофиксил уже. Помогло в последнем вызове VirtualProtect скармливать не oldProtect, а PAGE_EXECUTE_READ. Однако открылся новый баг... Я худею с этих читов! Одно лечим - другое калечим! В общем, после этого фикса стали не корректно работать некоторые функции. Они крашат. У меня все данные (размеры, байты включения, адреса. в общем - все) лежит в переменных/структурах и в прочих хранилищах, так что при написании очередной функции - я просто передаю MemoryHook переменные с этими данными. Так вот. Стали не корректно работать сначала две функции. Я начал их отлаживать, чтобы понять где конкретно проблема. В итоге дошел до одной. Психанул, передал им все значения не из переменных - а в ручную. У меня была версия, что где-то в переменных или структурах ошибка. Передал все данные, скомпилил, заинжектил. Теперь при запуске крашит. Стоит отметить, что при запуске инициализируются только отрисовка менюшки и взлом античита (который не изменялся). Ну еще функция Beep(500,200). Проблема в page_execute_read?
-
memcpy, а не set) Да, байт одинаковое количество - всегда. Потому что если даже функция убивается - она заменяется нупами. Но ни один из байтов не удаляется. На счет возвращение значения... Где конкретно? VirtualProtect ничего не возвращает - он только записывает. Однако есть некоторые "неточности" в функции записи: void WINAPI MemoryHook(int Size, int address, char ourByte[]){ DWORD oldProtect = 0; VirtualProtect((void*)address, Size, PAGE_EXECUTE_READWRITE, &oldProtect); //вот наша функция изменения защиты на нужную memcpy((void*)address, (PBYTE) ourByte, Size); //пишем... VirtualProtect((void*)address, Size, oldProtect, &oldProtect); //ставим оригинальную защиту... но... как мы можем знать оригинальную защиту? (остальное ниже)}Итак, имхо, проблема в VirtualProtect. Последней записью мы пишем в память НУЛЕВУЮ защиту. (DWORD oldProtect = 0;) А откуда мы знаем что там был ноль? Ведь там могло быть что угодно. Нужные байты пишутся (при включении), при выключении не успеваю трассировать.
-
Осваиваюсь в новом .dll чите. На днях прикрепил функцию записи в память байтов по адресу. Собственно, функции включаются - запись работает. Но функция некорректно выключается. А именно - крашем приложения. Сама функция записи в память: DWORD WINAPI MemoryHook(int Size, int address, char ourByte[]){ DWORD oldProtect = 0; VirtualProtect((void*)address, Size, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)address, (PBYTE) ourByte, Size); VirtualProtect((void*)address, Size, oldProtect, &oldProtect); return true;}Она работает. А вот моя логика. Точнее - программы: if (aFun1 == true) MemoryHook(2, Fun.Kasper1, KasperOneOn); else if (aFun1 == false) MemoryHook(2, Fun.Kasper1, KasperOneOff);Знаю, очень похоже на говнокод) Можно даже спутать))) Просто на switch'e не совсем удобно. Там за один вызов switch можно работать только с одной переменной, а у меня их - уйма. Итак, aFun - булевая переменная. При включении Directx checkBox'a она меняет свое положение с false на true. Собственно, когда выключается - обратно. Перевод логики кода: если чекбокс1 включен, то мемсетим адрес байтами включенной функции. Иначе, если чекбокс выключен - мемсетим адрес байтами выключенной функции. Функция включается. Но не выключается (крашит). Кто знает, как пофиксить?
-
Проблема решена.
-
Решил проблему. Убрал LPVOID из списка аргументов. Сделал универсальный прототип записи в память. DWORD WINAPI MemoryHook(int Size, int address, char ourByte[]){ DWORD oldProtect = 0; VirtualProtect((void*)address, Size, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)address, (PBYTE) ourByte, Size); VirtualProtect((void*)address, Size, oldProtect, &oldProtect); return true;}И воткнул в поток: MemoryHook(5, 0xA04E96, "\x90\x90\x90\x90\x90");Предварительно объявив вначале: DWORD WINAPI MemoryHook(int Size, int address, char ourByte[]);(это чтобы он не кричал: "идентификатор не найден") Вообще - мне понравилось) Это единственный, наверно, участок кода во всем проекте, который я написал сам))) Теперь думаю создать структуру, где будут хранится все адреса (для удобства). Еще они вопросик: как воткнуть в поток... Условно. Т.е. в моей менюшке есть чек боксы с булевыми переменными. Если чекбокс включен - переменная true. Нужно воткнуть в поток условие: if (func_Status == true) MemoryHook(5, 0xA04E96, "\x90\x90\x90\x90\x90");Однако в DLL_PROCESS_ATTACH это не работает. BOOL WINAPI DllMain(HMODULE hDll, DWORD dwReason, LPVOID lpReserved){ if (dwReason == DLL_PROCESS_ATTACH) { new_My_Thread(D3d9_Hook); if (Recoil_Status == true) MemoryHook(5, 0xA04E96, "\x90\x90\x90\x90\x90"); ProtectHacker(5); } return TRUE;}
-
Понял. No. Ломаю античит от Ubisoft (AS:Unity). Он действительно локальный, но никакого вреда мультиплееру нанести не может (по крайней мере как задумывалось). Вопрос актуален. Что передавать функции в потоке?
-
там не в порядке вызова дело, дело в том, что он отказывается вызывать функцию впринципе. вот в чем ошибка. (там если не видно, на верху где LPVOID подчеркнуто компилятором) Верно)))))
-
new_My_Thread() инициализирует d3d менюшку (ее отрисовку) всмысле сама функция Protecthacker уже расписана как тип void.
-
написал) изменил DWORD на void void WINAPI ProtectHacker(LPVOID){ DWORD oldProtect = 0; char ByteForProtect[] = "\xEB\xD4\x90\x90\x90"; char ByteForHDD[] = "\x84\xC0\x90\x90"; int SizeProtect = 5; int SizeHDD = 4; int protectDisabler1 = 0xFD9101; int protectDisabler2 = 0x11786AC; int protectDisabler3 = 0xA13D98; int hardHacker1 = 0x95E0C8; int hardhacker2 = 0x95E0CA; /* Выключение систем защиты #1 */ VirtualProtect((void*)protectDisabler1, SizeProtect, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)protectDisabler1, (PBYTE) ByteForProtect, 5); VirtualProtect((void*)protectDisabler1, SizeProtect, oldProtect, &oldProtect); /* Выключение систем защиты #2 */ VirtualProtect((void*)protectDisabler2, SizeProtect, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)protectDisabler2, (PBYTE) ByteForProtect, 5); VirtualProtect((void*)protectDisabler2, SizeProtect, oldProtect, &oldProtect); /* Выключение систем защиты #3 */ VirtualProtect((void*)protectDisabler3, SizeProtect, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)protectDisabler3, (PBYTE)ByteForProtect, 5); VirtualProtect((void*)protectDisabler3, SizeProtect, oldProtect, &oldProtect); /* Выключение бана по жесткому диску #1 */ VirtualProtect((void*)hardHacker1, SizeHDD, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)hardHacker1, (PBYTE)ByteForHDD, 4); VirtualProtect((void*)hardHacker1, SizeHDD, oldProtect, &oldProtect); /* Выключение бана по жесткому диску #2 */ VirtualProtect((void*)hardhacker2, SizeHDD, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)hardhacker2, (PBYTE)ByteForHDD, 4); VirtualProtect((void*)hardhacker2, SizeHDD, oldProtect, &oldProtect);}все норм, ошибок при написании самой функции не возникло. Однако... Не знаю как воткнуть это в поток. BOOL WINAPI DllMain(HMODULE hDll, DWORD dwReason, LPVOID lpReserved){if (dwReason == DLL_PROCESS_ATTACH) { new_My_Thread(D3d9_Hook); ProtectHacker(LPVOID);}if (d_fun_1 == true) { }return TRUE;}студия говорит что использование имени типа не допускается (lpvoid). Плюс, говорит что идентификатор не найден. что ей нужно?
-
Таак, посмотрел уроки кодера. Там хоть и смутно, но понятно. DWORD WINAPI ProtectHacker(LPVOID){ DWORD oldProtect = 0; int Size = 5; int address1 = 0xFD9101; VirtualProtect((void*)address1, Size, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy((void*)address1, (PBYTE) "\xEB\xD4\x90\x90\x90", 5); VirtualProtect((void*)address1, Size, oldProtect, &oldProtect);}Вот мой код, уже переделаный. Собственно, все круто. Но студия говорит, что: на видео у кодера она ничего не возвращает, и у него все работает. У кодера волшебная студия?
-
BOOL WINAPI VirtualProtect(_In_ LPVOID lpAddress,_In_ SIZE_T dwSize,_In_ DWORD flNewProtect,_Out_ PDWORD lpflOldProtect);первый аргумент - адрес. Врятли, это мой адрес для записи байтов. Что тут указывать? второй - размер. Размер... памяти, в которой меняется защита? третий - новая защита. скорее всего, создаем переменную oldProtectMemory = 0; (или что-то в этом роде) четвертый - старая защита. Что ему передавать? ReadOnly? /*======================================== */ memcpy, так и не разобрался, что ей передавать.
-
Эм... Я имел ввиду пример кода)
-
А можно какой-нибудь пример реализации?
-
Добрый день. Худо-бедно разобрался с directx hook'ом. Нарисовал менюшку (пока не совсем совершенную) Теперь вопросик: как управлять памятью и мыслями людей? ну или процесса? Я знаю как это делается "извне", тоесть из отдельной проги - Write/Read ProcessMemory, однако где-то слышал, что изнутри такой метод не работает (или не актуален) Мол, когда ты заинжектил своего штирлица в стан врага - тебе открывается доступ ко всему внутреннему адресном пространству. Сама задача: Собственно, адреса есть. Нужно в эти адреса писать байты (или делать aobscan)
-
Плагиат? Простите, но... Какой смысл от плагиата? Я в смысле, что сигнатуры можно у кого-то "позаимствовать", а можно самому найти. Ведь в обоих (или обеих) случаях - результат будет один и тот же! За исключением того, что если "заимствовать" все время - то мозгов не прибавится. Хотя, если заимствует опытный проггер - возможно у него просто нет времени на поиск таких банальных вещей. Или я ошибаюсь? P.s. кримсонленд настолько старая игра, что "тру-гейм-хацкеры" уже ее до основания "раздробили". Чего тут плагиать-то?))
-
Вот я и говорю - жаль ( Это немного не то, я имел ввиду закраску автоматическую. Для directx hook'a.
-
Что будет какое-нибудь приложение для "тру-хацкеров2004" где будет одна единственная кнопочка "взломать пентагон" (ну или еще что, в зависимости от цели использования). Как жаль, что такой проги нет... З.ы. нашел ништячек ))))) З.ы.ы. ничего не рекламирую, просто нашел увлекательную статью (для модеров)