partoftheworlD
-
Постов
2 687 -
Зарегистрирован
-
Посещение
-
Победитель дней
172
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные partoftheworlD
-
-
А что если игра запускает несколько процессов с одинаковыми именами и нам нужен последний запущенный процесс? Например лаунчер и саму игру.
-
Да сбрасывал, из 6-7 попыток 1 раз инжектит. В настройках менял только размер буфера сканирования и установил VEH отладчик.
-
5 часов назад, MasterGH сказал:
А вот мне программа ReClass не понравилась
CE было бы достаточно, просто привычка которая генерирует класс найденных значений. Удобно если пишешь трейнер или ленивый, чтобы выписывать значения руками.
-
15 минуту назад, SER[G]ANT сказал:
На Win10 x64 всё нормально
Только пробовал не могу присоединить VEH отладчик к 64 битному процессу, тоже вин10 х64. На 6.5 работает.
-
Нашел еще способ отключить отдачу и он очень не обычный.
-
У кого-нибудь VEH может инжектиться на 6.5.1?
-
Используемые плагины: REtypedef
Берем любое автоматическое оружие и находим количество патронов.
Ставим бряк на доступ, переходим в игру и стреляем.
Нам нужна инструкция, отнимающая патроны, так мы выйдем на функцию выстрела.
7FFBCE59564A - FF 8F 98000000 - dec [rdi+00000098] <<
Дальше делаем дамп Disrupt_b64.dll, запускаем IDA и ждем пока завершится анализ.
Переходим по адресу 7FFBCE59564A, мы находимся в функции, которая отнимает патроны, значит нам надо посмотреть откуда она вызывается.
Поднимаемся к началу функции видим надпись CODE XREF: переходим по ней дважды кликнув.
Теперь мы находимся в функции выстрела.
Нажимаем F5, чтобы декомпилировать функцию в псевдокод.
Видим, что переменная v1 очень часто используется, скорее всего это базовый адрес. Можно его реконструировать в структуру, для повышения читабельности псевдокода.
Для того чтобы найти скорострельность, надо найти все условия, работающие с типом float, как их проверить? Лучше всего использовать ReClass. Где взять базовый адрес? использовать адрес регистра rdi в нем будет находится базовый адрес текущего оружия.
Я нашел всего 2 условия которые бы нам подходили:
if ( a3 <= *&WeaponBase->field_34 && *&WeaponBase->field_56 <= 0.0 ) if ( WeaponBase->field_152 && *&WeaponBase->field_904 > 0.0 )
После реконструкции типа базового адреса, автоматически дописывается смещение т.е
Field_34 это 0x34 и т.д. Значит нам надо проверить 0x34, 0x56, 0x152 , 0x904.
Единственное смещение, которое реагировало на выстрелы оказалось 0x34.
Теперь добавляем в таблицу базовый адрес оружия + 0x34, ставим бряк на доступ выбираем
F3 41 0F11 4C 24 34 - movss [r12+34],xmm1 <<
И пишем на нее скрипт.
cmp [r12+98],#10 //фильтр свой-чужой jne code mov [r12+34],(float)99 //любое значение больше 5
Скрытый текст- 2
-
Наконец-то появилось время и желание что-нибудь поломать, но раз в игре почти все взломано, хочется чего-то веселого. В общем, если будет кому интересно, могу написать тутор как искал.
Скорострельность работает, пока только на автоматическом оружии, есть желание сделать все оружие автоматическим и анти-отдачу иначе играть не возможно.Ладно хватит слов, приятного просмотра.
Скрипты:
1.Rapidfire
2.Анти-отдача
3.Автострельба
Rapidfire{ Game : watch_dogs.exe Version: Date : 2016-05-13 Author : partoftheworlD This script does blah blah blah } [ENABLE] //code from here to '[DISABLE]' will be used to enable the cheat aobscanmodule(rapidf,Disrupt_b64.dll,F3 41 0F 11 4C 24 34 76) // should be unique alloc(newmem,$1000,"Disrupt_b64.dll"+183A812) label(code) label(return) newmem: push r13 mov r13,[r12+60] cmp byte ptr [r13+20],07 pop r13 jne code mov [r12+34],(float)99 jmp return code: movss [r12+34],xmm1 jmp return rapidf: jmp newmem nop nop return: registersymbol(rapidf) [DISABLE] //code from here till the end of the code will be used to disable the cheat rapidf: db F3 41 0F 11 4C 24 34 unregistersymbol(rapidf) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Disrupt_b64.dll"+183A812 "Disrupt_b64.dll"+183A7D3: E8 98 2D FF FF - call Disrupt_b64.dll+182D570 "Disrupt_b64.dll"+183A7D8: 4C 8B 7C 24 70 - mov r15,[rsp+70] "Disrupt_b64.dll"+183A7DD: F3 41 0F 10 44 24 38 - movss xmm0,[r12+38] "Disrupt_b64.dll"+183A7E4: 0F 28 CE - movaps xmm1,xmm6 "Disrupt_b64.dll"+183A7E7: 0F 2F 05 72 33 4C 01 - comiss xmm0,[Disrupt_b64.dll+2CFDB60] "Disrupt_b64.dll"+183A7EE: F3 41 0F 58 4C 24 34 - addss xmm1,[r12+34] "Disrupt_b64.dll"+183A7F5: 4C 8B 74 24 78 - mov r14,[rsp+78] "Disrupt_b64.dll"+183A7FA: 4C 8B AC 24 80 00 00 00 - mov r13,[rsp+00000080] "Disrupt_b64.dll"+183A802: 48 8B BC 24 88 00 00 00 - mov rdi,[rsp+00000088] "Disrupt_b64.dll"+183A80A: 48 8B 9C 24 C0 00 00 00 - mov rbx,[rsp+000000C0] // ---------- INJECTING HERE ---------- "Disrupt_b64.dll"+183A812: F3 41 0F 11 4C 24 34 - movss [r12+34],xmm1 // ---------- DONE INJECTING ---------- "Disrupt_b64.dll"+183A819: 76 0B - jna Disrupt_b64.dll+183A826 "Disrupt_b64.dll"+183A81B: F3 0F 5C C6 - subss xmm0,xmm6 "Disrupt_b64.dll"+183A81F: F3 41 0F 11 44 24 38 - movss [r12+38],xmm0 "Disrupt_b64.dll"+183A826: 0F 28 C6 - movaps xmm0,xmm6 "Disrupt_b64.dll"+183A829: F3 41 0F 58 44 24 3C - addss xmm0,[r12+3C] "Disrupt_b64.dll"+183A830: F3 41 0F 11 44 24 3C - movss [r12+3C],xmm0 "Disrupt_b64.dll"+183A837: 0F 2F 0D 22 E6 CC 01 - comiss xmm1,[Disrupt_b64.dll+3508E60] "Disrupt_b64.dll"+183A83E: 76 19 - jna Disrupt_b64.dll+183A859 "Disrupt_b64.dll"+183A840: 49 C7 44 24 40 00 00 00 00 - mov [r12+40],00000000 "Disrupt_b64.dll"+183A849: 0F 28 74 24 60 - movaps xmm6,[rsp+60] }
Анти-отдача{ Game : watch_dogs.exe Version: Date : 2016-05-13 Author : partoftheworlD This script does blah blah blah } [ENABLE] aobscanmodule(norecoil_y,Disrupt_b64.dll,49 89 44 24 08 48 8D 45 A0) // should be unique aobscanmodule(norecoil_x,Disrupt_b64.dll,4D 89 5C 24 08 4C 89 1A) // should be unique alloc(newmem_x,$1000,"Disrupt_b64.dll"+18445BD) alloc(newmem_Y,$1000,"Disrupt_b64.dll"+1844542) label(code_y) label(code_x) label(return_y) label(return_x) newmem_Y: jmp return_y code_y: mov [r12+08],rax jmp return_y newmem_x: jmp return_x code_x: mov [r12+08],r11 jmp return_x norecoil_x: jmp newmem_x return_x: registersymbol(norecoil_x) norecoil_y: jmp newmem_Y return_y: registersymbol(norecoil_y) [DISABLE] norecoil_y: db 49 89 44 24 08 norecoil_x: db 4D 89 5C 24 08 unregistersymbol(norecoil_y) unregistersymbol(norecoil_x) dealloc(newmem_Y) dealloc(newmem_x) { // ORIGINAL CODE - INJECTION POINT: "Disrupt_b64.dll"+1844542 "Disrupt_b64.dll"+184451A: 8D 4A 50 - lea ecx,[rdx+50] "Disrupt_b64.dll"+184451D: 4D 8B E1 - mov r12,r9 "Disrupt_b64.dll"+1844520: 49 8B D8 - mov rbx,r8 "Disrupt_b64.dll"+1844523: E8 28 62 90 FE - call Disrupt_b64.dll+14A750 "Disrupt_b64.dll"+1844528: 48 8B 55 30 - mov rdx,[rbp+30] "Disrupt_b64.dll"+184452C: F3 0F 10 4B 14 - movss xmm1,[rbx+14] "Disrupt_b64.dll"+1844531: 4C 8B D8 - mov r11,rax "Disrupt_b64.dll"+1844534: 48 8D 45 A0 - lea rax,[rbp-60] "Disrupt_b64.dll"+1844538: F3 0F 11 4D C4 - movss [rbp-3C],xmm1 "Disrupt_b64.dll"+184453D: F3 0F 10 4B 1C - movss xmm1,[rbx+1C] // ---------- INJECTING HERE ---------- "Disrupt_b64.dll"+1844542: 49 89 44 24 08 - mov [r12+08],rax // ---------- DONE INJECTING ---------- "Disrupt_b64.dll"+1844547: 48 8D 45 A0 - lea rax,[rbp-60] "Disrupt_b64.dll"+184454B: F3 0F 11 4D CC - movss [rbp-34],xmm1 "Disrupt_b64.dll"+1844550: 48 89 02 - mov [rdx],rax "Disrupt_b64.dll"+1844553: 48 8B 43 20 - mov rax,[rbx+20] "Disrupt_b64.dll"+1844557: 8B 4B 04 - mov ecx,[rbx+04] "Disrupt_b64.dll"+184455A: F3 0F 10 43 08 - movss xmm0,[rbx+08] "Disrupt_b64.dll"+184455F: F3 0F 11 45 B8 - movss [rbp-48],xmm0 "Disrupt_b64.dll"+1844564: F3 0F 10 43 10 - movss xmm0,[rbx+10] "Disrupt_b64.dll"+1844569: 44 8B 03 - mov r8d,[rbx] "Disrupt_b64.dll"+184456C: 48 89 45 D0 - mov [rbp-30],rax }
Скрытый текст{ Game : watch_dogs.exe Version: Date : 2016-05-13 Author : partoftheworlD This script does blah blah blah } [ENABLE] aobscanmodule(Autoshot,Disrupt_b64.dll,C6 43 49 01 0F 28 BC 24 D0 00 00 00) // should be unique alloc(newmem,$1000,"Disrupt_b64.dll"+1838C67) label(code) label(return) registersymbol(Autoshot) newmem: mov byte ptr [rbx+49],00 movaps xmm7,[rsp+000000D0] jmp return code: mov byte ptr [rbx+49],01 movaps xmm7,[rsp+000000D0] jmp return Autoshot: jmp newmem nop nop nop nop nop nop nop return: [DISABLE] Autoshot: db C6 43 49 01 0F 28 BC 24 D0 00 00 00 unregistersymbol(Autoshot) dealloc(newmem) { // ORIGINAL CODE - INJECTION POINT: "Disrupt_b64.dll"+1838C67 "Disrupt_b64.dll"+1838C3E: 80 78 5C 00 - cmp byte ptr [rax+5C],00 "Disrupt_b64.dll"+1838C42: 74 09 - je Disrupt_b64.dll+1838C4D "Disrupt_b64.dll"+1838C44: 8B 40 60 - mov eax,[rax+60] "Disrupt_b64.dll"+1838C47: 89 83 90 00 00 00 - mov [rbx+00000090],eax "Disrupt_b64.dll"+1838C4D: 4C 8D 44 24 40 - lea r8,[rsp+40] "Disrupt_b64.dll"+1838C52: 48 8D 54 24 30 - lea rdx,[rsp+30] "Disrupt_b64.dll"+1838C57: 41 B1 01 - mov cl,01 "Disrupt_b64.dll"+1838C5A: 48 8B CB - mov rcx,rbx "Disrupt_b64.dll"+1838C5D: 44 89 74 24 20 - mov [rsp+20],r14d "Disrupt_b64.dll"+1838C62: E8 D9 D1 FF FF - call Disrupt_b64.dll+1835E40 // ---------- INJECTING HERE ---------- "Disrupt_b64.dll"+1838C67: C6 43 49 01 - mov byte ptr [rbx+49],01 "Disrupt_b64.dll"+1838C6B: 0F 28 BC 24 D0 00 00 00 - movaps xmm7,[rsp+000000D0] // ---------- DONE INJECTING ---------- "Disrupt_b64.dll"+1838C73: 0F 28 B4 24 E0 00 00 00 - movaps xmm6,[rsp+000000E0] "Disrupt_b64.dll"+1838C7B: 44 0F 28 84 24 C0 00 00 00 - movaps xmm8,[rsp+000000C0] "Disrupt_b64.dll"+1838C84: 48 8B B4 24 28 01 00 00 - mov rsi,[rsp+00000128] "Disrupt_b64.dll"+1838C8C: 48 8B BC 24 30 01 00 00 - mov rdi,[rsp+00000130] "Disrupt_b64.dll"+1838C94: 49 8B 5D 00 - mov rbx,[r13+00] "Disrupt_b64.dll"+1838C98: 4C 8B B4 24 F0 00 00 00 - mov r14,[rsp+000000F0] "Disrupt_b64.dll"+1838CA0: 4C 8B A4 24 00 01 00 00 - mov r12,[rsp+00000100] "Disrupt_b64.dll"+1838CA8: FF 4B 18 - dec [rbx+18] "Disrupt_b64.dll"+1838CAB: 4C 8B AC 24 F8 00 00 00 - mov r13,[rsp+000000F8] "Disrupt_b64.dll"+1838CB3: 75 10 - jne Disrupt_b64.dll+1838CC5 }
- 1
-
-
В студии все отлично.
-
Скрытый текст
#include <windows.h> #include <vector> #include <algorithm> typedef struct _PEB_LDR_DATA { UINT8 _PADDING_[12]; LIST_ENTRY InLoadOrderModuleList; LIST_ENTRY InMemoryOrderModuleList; LIST_ENTRY InInitializationOrderModuleList; } PEB_LDR_DATA, *PPEB_LDR_DATA; typedef struct _PEB { #ifdef _WIN64 UINT8 _PADDING_[24]; #else UINT8 _PADDING_[12]; #endif PEB_LDR_DATA* Ldr; } PEB, *PPEB; typedef struct _LDR_DATA_TABLE_ENTRY { LIST_ENTRY InLoadOrderLinks; LIST_ENTRY InMemoryOrderLinks; LIST_ENTRY InInitializationOrderLinks; VOID* DllBase; } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY; typedef struct _UNLINKED_MODULE { HMODULE hModule; PLIST_ENTRY RealInLoadOrderLinks; PLIST_ENTRY RealInMemoryOrderLinks; PLIST_ENTRY RealInInitializationOrderLinks; PLDR_DATA_TABLE_ENTRY Entry; } UNLINKED_MODULE; #define UNLINK(x) \ (x).Flink->Blink = (x).Blink; \ (x).Blink->Flink = (x).Flink; #define RELINK(x, real) \ (x).Flink->Blink = (real); \ (x).Blink->Flink = (real); \ (real)->Blink = (x).Blink; \ (real)->Flink = (x).Flink; std::vector<UNLINKED_MODULE> UnlinkedModules; struct FindModuleHandle { HMODULE m_hModule; FindModuleHandle(HMODULE hModule) : m_hModule(hModule) { } bool operator() (UNLINKED_MODULE const &Module) const { return (Module.hModule == m_hModule); } }; void RelinkModuleToPEB(HMODULE hModule) { std::vector<UNLINKED_MODULE>::iterator it = std::find_if(UnlinkedModules.begin(), UnlinkedModules.end(), FindModuleHandle(hModule)); if (it == UnlinkedModules.end()) { return; } RELINK((*it).Entry->InLoadOrderLinks, (*it).RealInLoadOrderLinks); RELINK((*it).Entry->InInitializationOrderLinks, (*it).RealInInitializationOrderLinks); RELINK((*it).Entry->InMemoryOrderLinks, (*it).RealInMemoryOrderLinks); UnlinkedModules.erase(it); } void UnlinkModuleFromPEB(HMODULE hModule) { std::vector<UNLINKED_MODULE>::iterator it = std::find_if(UnlinkedModules.begin(), UnlinkedModules.end(), FindModuleHandle(hModule)); if (it != UnlinkedModules.end()) { return; } #ifdef _WIN64 PPEB pPEB = (PPEB)__readgsqword(0x60); #else PPEB pPEB = (PPEB)__readfsdword(0x30); #endif PLIST_ENTRY CurrentEntry = pPEB->Ldr->InLoadOrderModuleList.Flink; PLDR_DATA_TABLE_ENTRY Current = NULL; while (CurrentEntry != &pPEB->Ldr->InLoadOrderModuleList && CurrentEntry != NULL) { Current = CONTAINING_RECORD(CurrentEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); if (Current->DllBase == hModule) { UNLINKED_MODULE CurrentModule = { 0 }; CurrentModule.hModule = hModule; CurrentModule.RealInLoadOrderLinks = Current->InLoadOrderLinks.Blink->Flink; CurrentModule.RealInInitializationOrderLinks = Current->InInitializationOrderLinks.Blink->Flink; CurrentModule.RealInMemoryOrderLinks = Current->InMemoryOrderLinks.Blink->Flink; CurrentModule.Entry = Current; UnlinkedModules.push_back(CurrentModule); UNLINK(Current->InLoadOrderLinks); UNLINK(Current->InInitializationOrderLinks); UNLINK(Current->InMemoryOrderLinks); break; } CurrentEntry = CurrentEntry->Flink; } }
Одно время пришлось долго искать, так что вдруг кому пригодится.
Для использования добавить в DllMain:
UnlinkModuleFromPEB(hInstDll);
- 1
-
https://www.easyanticheat.net/features/
Во втором абзаце написано как он определяет "чит".А в общем, то:
- забыть про dll, если не обойтись, то позаботиться об изменении хеша и скрытии заголовков dll.
- не менять .rdata и .text секции.
- не менять значения консольных команд.
- если будешь что-то рисовать, на всякий случай используй оверлей или cleanscreen пиши, вдруг анти-чит делает скриншоты как Punkbuster.
-
Спасибо за ответы, буду пробовать.
-
Переписал код на c++ теперь все работает, осталась единственная функция, которую не могу найти для c++.
new Random(System.nanoTime()).nextInt(25)
-
Скрытый текст
int getRandom() { return 98 + new Random(System.nanoTime()).nextInt(25); } String hasher(int paramInt) { String str1 = String.valueOf(paramInt); String str2 = new String(); int i = 0; if (i >= str1.length()) {} for (String str3 = (char)getRandom() + str2 + (char)getRandom();; str3 = str3.substring(0, str3.length() / 2) + (char)getRandom() + str3.substring(str3.length() / 2, str3.length())) { if (str3.length() >= 15) { return str3; int j = str1.charAt(i); if (j == 48) {} for (str2 = str2 + 'a';; str2 = str2 + j * 3) { i++; break; } } } } String hasher(long paramLong) { String str1 = String.valueOf(paramLong); String str2 = new String(); int i = 0; if (i >= str1.length()) {} for (String str3 = (char)getRandom() + str2 + (char)getRandom();; str3 = str3.substring(0, str3.length() / 2) + (char)getRandom() + str3.substring(str3.length() / 2, str3.length())) { if (str3.length() >= 15) { return str3; int j = str1.charAt(i); if (j == 48) {} for (str2 = str2 + 'a';; str2 = str2 + j * 3) { i++; break; } } } }
Разобрал apk нашел шифровку сохранений, но ios-вский бинарник еще нужен.
-
Нужна помощь, тех у кого джеилбрейк и кто может с помощью Clutch декомпилировать бинарник игры.
В общем в игре Cимулятор Гаишника используется интересный способ защиты от изменения данных с помощью сравнивания хешей.
Есть база данных(SQL Lite 3) со всеми значениями.
Хочу найти функцию которая генерирует хэши и подменить на свои значения.
-
+ знания для работы с сетью и протоколами.
Лучше возьми игру с открытым исходным кодом с мультиплеером и разбирайся.
Для начала можешь написать свое приложение клиент и сервер(WinSocket). -
Ищи SaveEditor или выдирай функцию из игры которая считывает сохранение при запуске игры.
-
Я думаю это сохранения.
-
у тебя будет вместо 12-ой виртуальной функции, 37 вроде бы точно сейчас не скажу. В IDA можно уточнить скачав плагин Class informer и игру под macos, там все функции с отладочной информацией идут т.е подписаны.
или искать C_BaseAnimating::SetupBones это будет начало функции и смотреть по коду, если в асме разбираешься, восстановишь функцию и быстро найдешь.(SDK в помощь) Инструкция будет выглядеть как-то так:
mov [esi+смещение], eax(ecx было в соурс)
EntityBase(esi) + смещение = C_BaseAnimating::SetupBones
-
unsigned char* trampoline = nullptr;
Попробуй закоментить эту строку , а вообще лучше отладчиком пройдись, чтобы найти проблему.
По коду trampoline обнуляется в main и используешь уже 0, вместо расчета обратного прыжкаtrampoline = reinterpret_cast<unsigned char*> (HookHelper::Alloc(totalLen + 5, PAGE_EXECUTE_READWRITE));
и скорее всего не там восстанавливается функция.
-
Как на счет вырвать функцию работы с сохранениями из игры, а потом делать уже редактор. Например скинул сэйв в свою программу, открыл(расшифровал, если используется какой-нибудь алгоритм), изменил(зашифровал), сохранил. Или использовать сигнатуры для поиска нужных байт и с помощью memcpy изменять байты на нужные.
-
Можешь поискать структуру оружия обычно в ней все характеристики Если в игре есть улучшения, то можно попробовать улучшать скорострельность и искать неизвестное типа float (Изменилось/Неизменилось). Просто ты не расписал какими способами уже искал. Поиском может ничего и не найти в зависимости от игры, например в L4D2 там значение скорострельности подгружается с модулем и не меняется т.е всегда значение 0,35 для дробовика например.
-
а зачем тебе SDK компилировать? Его просто подключают в настройках и используют.
Watch_Dogs RapidFire(Видео-урок)
in Статьи для продвинутых
Опубликовано
Ну что, первый видео урок. Буду ждать критику, коментарии и пожелания, чтобы следующие записи были лучше.