RockHammer Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 (изменено) Добрый день.После о-о-очень длительного отсутствия я наконец-таки собрал комп! Пока что без видеокарты, сижу на встроенке hd 4600. На ней идет только перывый AS на минималках.Итак, захотелось быть бессмертным. Нашел адрес здоровья (благо, он без шифрования и в 4 byte) и адресом жизни игрока занимается одна лишь инструкция, которая легко убивается.Захотелось написать трейнер. Внешний. У кого есть исходник внешнего сканера сигнатур? Поиск процесса, запись - имеется, не хватает только поиска байтов. Изменено 18 июня, 2015 пользователем RockHammer Ссылка на комментарий Поделиться на другие сайты Поделиться
Afro Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 Что значит внешний? Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 18 июня, 2015 Автор Поделиться Опубликовано 18 июня, 2015 (изменено) Что значит внешний?нужна теория...есть два вида хуков: внешние (создание собственного процесса, окна\консоли и из своего адресного пространства ты хукаешь игру) и внутренний (.dll файл инжектишь в процесс и дллка хукает игру)..dll файл эффективен, но он более геморный в плане использования. Хочу сделать внешний трейнер, чтобы из своего процесса хукать чужой. Такое возможно, инфа 168% Изменено 18 июня, 2015 пользователем RockHammer Ссылка на комментарий Поделиться на другие сайты Поделиться
Afro Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 Ах вот ты про что.А чем тебе не нравятся уроки кенга? Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 18 июня, 2015 Автор Поделиться Опубликовано 18 июня, 2015 Ах вот ты про что.А чем тебе не нравятся уроки кенга? си шарп. Как перенести это на с++ ? Ссылка на комментарий Поделиться на другие сайты Поделиться
Afro Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 (изменено) си шарп. Как перенести это на с++ ?Так он там ничего сверхъествественного не использует, перенести в два счёта можно.Разве что типы поменять и в цикле пробел поставить Изменено 18 июня, 2015 пользователем Afro Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 18 июня, 2015 Автор Поделиться Опубликовано 18 июня, 2015 Так он там ничего сверхъествественного не использует, перенести в два счёта можно.Разве что типы поменять и в цикле пробел поставить Сможешь обработать и сюда скинуть? Ссылка на комментарий Поделиться на другие сайты Поделиться
Afro Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 (изменено) Сможешь обработать и сюда скинуть?Делать мне нечего, могу помочь если возникнут вопросы по конкретным вещам.Вот кстати урок от кодера про сканеры сигнатур (на плюсах)P.S. всё уже давно сделано за тебя, знай себе копипасти Изменено 18 июня, 2015 пользователем Afro Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 18 июня, 2015 Автор Поделиться Опубликовано 18 июня, 2015 Делать мне нечего, могу помочь если возникнут вопросы по конкретным вещам.Вот кстати урок от кодера про сканеры сигнатур (на плюсах)P.S. всё уже давно сделано за тебя, знай себе копипасти Я и хочу копипастить! Урок этот от кодера, там приводится пример внутреннего хука. А мне нужен внешний... Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 скопируй блок в котором ехе из проц. игры в трейнер и сканируй, так быстрее.. потом -база +база проц. игры = адресps в длл варианте легче в сотни раз чем в ехе при правильной планировке xD Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 18 июня, 2015 Автор Поделиться Опубликовано 18 июня, 2015 скопируй блок в котором ехе из проц. игры в трейнер и сканируй, так быстрее.. потом -база +база проц. игры = адресps в длл варианте легче в сотни раз чем в ехе при правильной планировке xDдлл геморно инжектить и следить за инжектом Ссылка на комментарий Поделиться на другие сайты Поделиться
gmz Опубликовано 18 июня, 2015 Поделиться Опубликовано 18 июня, 2015 длл геморно инжектить и следить за инжектомдаааа ладно. зацени: http://forum.gamehacklab.ru/topic/3648-need-for-speed-rivals-tablitca-trejner/#entry27837посмотри на нее в CFFExplorer и в дебагере. она сама себя инжектит через виндовую фичу Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 19 июня, 2015 Автор Поделиться Опубликовано 19 июня, 2015 даааа ладно. зацени: http://forum.gamehacklab.ru/topic/3648-need-for-speed-rivals-tablitca-trejner/#entry27837посмотри на нее в CFFExplorer и в дебагере. она сама себя инжектит через виндовую фичуче-че? Ссылка на комментарий Поделиться на другие сайты Поделиться
elvis66666 Опубликовано 19 июня, 2015 Поделиться Опубликовано 19 июня, 2015 (изменено) Вот, из урока Coderа, нахождение адреса по сигнатуре DWORD start_adress, - базовый адрес модуляDWORD length, - размер модуляBYTE * pattern, - сигнатура "\xFF\xFF\x86"char * mask - маска "x?xx" Надеюсь поможет DWORD FindePatern(DWORD start_adress, DWORD length, BYTE * pattern, char * mask) { BYTE* bytebuffer = new BYTE[length]; HANDLE proc_handle = OpenProcess(PROCESS_ALL_ACCESS, false, pID); ReadProcessMemory(proc_handle,(LPCVOID)start_adress, bytebuffer, length, NULL); for (DWORD i = 0; i < length; i++) if (DataCompare((bytebuffer + i), pattern, mask)) { CloseHandle(proc_handle); delete[] bytebuffer; return (DWORD)(start_adress + i); } delete[] bytebuffer; CloseHandle(proc_handle); return NULL; } bool DataCompare(const BYTE* pData, const BYTE* pattern, const char* mask) { for (; *mask; ++mask, ++pattern, ++pData) if (*mask == 'x' && *pData != *pattern) return false; return true; } Изменено 19 июня, 2015 пользователем elvis66666 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Крайслер Опубликовано 19 июня, 2015 Поделиться Опубликовано 19 июня, 2015 DWORD cExMemory::FindSignature(DWORD base, DWORD size, byte* sign, char* mask) { MEMORY_BASIC_INFORMATION mbi = { 0 }; DWORD offset = 0; while (offset < size) { VirtualQueryEx(this->pHandle, (LPCVOID)(base + offset), &mbi, sizeof(MEMORY_BASIC_INFORMATION)); if (mbi.State != MEM_FREE) { byte* buffer = new byte[mbi.RegionSize]; ReadProcessMemory(this->pHandle, mbi.BaseAddress, buffer, mbi.RegionSize, NULL); for (size_t i = 0; i < mbi.RegionSize; i++) { if (DataCompare(buffer + i, sign, mask)) { delete[] buffer; return (DWORD)mbi.BaseAddress + i; } } delete[] buffer; } offset += mbi.RegionSize; } return 0; } bool cExMemory::DataCompare(byte* data, byte* sign, char* mask) { for (; *mask; mask++, sign++, data++) { if (*mask == 'x' && *data != *sign) return false; } return true; } this->pHandle - передаешь хендл нужного процесса 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
RockHammer Опубликовано 20 июня, 2015 Автор Поделиться Опубликовано 20 июня, 2015 DWORD cExMemory::FindSignature(DWORD base, DWORD size, byte* sign, char* mask){ MEMORY_BASIC_INFORMATION mbi = { 0 }; DWORD offset = 0; while (offset < size) { VirtualQueryEx(this->pHandle, (LPCVOID)(base + offset), &mbi, sizeof(MEMORY_BASIC_INFORMATION)); if (mbi.State != MEM_FREE) { byte* buffer = new byte[mbi.RegionSize]; ReadProcessMemory(this->pHandle, mbi.BaseAddress, buffer, mbi.RegionSize, NULL); for (size_t i = 0; i < mbi.RegionSize; i++) { if (DataCompare(buffer + i, sign, mask)) { delete[] buffer; return (DWORD)mbi.BaseAddress + i; } } delete[] buffer; } offset += mbi.RegionSize; } return 0;}bool cExMemory::DataCompare(byte* data, byte* sign, char* mask){ for (; *mask; mask++, sign++, data++) { if (*mask == 'x' && *data != *sign) return false; } return true;}this->pHandle - передаешь хендл нужного процессаОоо, Крайслер? Не ожидал увидеть тебя тут) Спасибо за инфу) Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения