Всем привет. Сегодня будем учиться писать свой обход Bypass для standoff 2. Приступим. ⭐ Логаем античит Давайте начнем. Во первых я научу вас логать античит. Для начало вам нужно: - Оффсет - Код Для того,что-бы найти оффсет для лога,вам нужен дамп. Заходим в "dump.cs" и пишем в поиск: "= 10)" и вам выдается один оффсет! Дальше вам нужен код. Это обычный код войда который просто хукнут на LOGI. Вот он код: void* (*old_Log)(void* inst, monoString* sub_704, uint sub_347); void* Log(void* inst, monoString* sub_704, uint sub_347) { if (inst != NULL) { LOGI("%s", sub_704->toChars()); } return old_Log(inst, sub_704, sub_347) } Этот код нужно поместить в место где у вас находятся хуки. Если вы это не понимаете,то в вашем сурсе должна быть внизу надпись "---- Hooking ----" или что-то похожее,нужно вставить этот код после этого текста,если этого текста нет то просто вставьте этот код после кейсов. Пример: Case 123: feature1 = !feature1; break; void* (*old_Log)(void* inst, monoString* sub_704, uint sub_347); void* Log(void* inst, monoString* sub_704, uint sub_347) { if (inst != NULL) { LOGI("%s", sub_704->toChars()); } return old_Log(inst, sub_704, sub_347) } Должно быть понятно. Если у вас ошибки,то нужно найти файл logger.h, он может быть в любом сурсе в папке includes, по путю : /app/src/main/jni/Includes и потом нужно файл logger.h перенести в ваш сурс,по такому же путю и указать в файле main.cpp на первой строке: #include <Includes/Logger.h> Все, мы вставили код,что теперь? Теперь нужно прявязать наш код к оффсету. MSHookFunction((void *) getAbsoluteAddress("libil2cpp.so", 0x123456), (void *) Log, (void **)&old_Log); Вместо 0x123456 мы должны вставить оффсет который мы получили из "dump.cs". Готово, компилим наш сурс. Кстати, чуть не забыл, вам обязательно нужны рут права чтобы получить ****. Вот мы скомпилили наш сурс и теперь переходим в "play market". Вводим в поиск "logcat reader". Скачиваем это приложение,даем ему все разрешения и выбираем корневой метод, разрешаем рут и все. Теперь то меню которые мы скомпилили нужно вшить в игру, и добавить туда .smali обход, к примеру mUnityPlayer.smali, его можно найти везде в группах телеграмма. Просто переносим этот обход по путю smali/com/unity3d/player и потом возвращаемся обратно и заходим в файл: "Androidmanifest.xml" и переходим к : < aplication android:label="string_inactive408037/app_name" android:icon="Mipmap/app_icon" android:allowBackup="false" android:supportsRtl="true" android:banner="@drawable/app_banner" android:isGame="true" android:roundIcon="Mipmap/app_icon_round" android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:requestLegacyExternalStorage="true" и после строки android:icon="Mipmap/app_icon" мы пишем: - android:name=".mUnityPlayer" Потом нам нужно будет перенести оригинальный апк стандоффа в папку assets и указать название: - base.apk Потом нам нужно будет перейти в приложение "Logcat Reader" и потом зайти в нашу игру, и зайти через фейсбук аккаунт, и подождать пока пройдет проверка данных пользователя до конца. И захадить в приложение "Logcat reader" и в приложение в поиск ввести "Mod_Menu". Все, я вас поздравляю,вы логнули античит! 1 ЭТАП Для начала,я расскажу вам основы. Чтобы научиться писать обход, сначало нужно логнуть античит это есть в спойлере - "логаем античит". После того как вы логнули античит полетели писать свой обход. -------------------------------------------- Для начала,существуют два способа написать обход. Через "monoString" и через "void". Я бы советовал писать через "monoString", так как код получается меньше. Начнем с начала, нам нужно знать типы данных с++. В обход нужно ретурнуть текст, поэтому тип данных - "string". В тип данных "string" входит "void" и "monoString", так как "monoString" - монострока, а void — тип, спецификатор типа и ключевое слово в языках программирования С, C++, Java, C#, Objective-C, D, ActionScript и PHP. Среди современных языков программирования ключевое слово void впервые появилось в C++ для поддержки концепции обобщенных указателей. -------------------------------------------- Теперь пишем начало обхода. Я покажу как писать начало. Начало каждого хука: monoString* (*old_safestring)(void* inst); monoString* safestring(*void inst){ } Далее нам нужно писать внутренности обхода. monoString* (*old_safestring)(void* inst); monoString* safestring(*void inst){ std::string valtostd(old_safestring(inst)->toChars()); } Теперь, когда мы пишем поиск чего-либо, нам нужно указать переменую valtostd. Теперь пишем поиск. monoString* (*old_safestring)(void* inst); monoString* safestring(*void inst){ std::string valtostd(old_safestring(inst)->toChars()); if (contains(valtostd, "base.apk:") && contains(valtostd, "|main.")){ } } Так,вот я написал поиск base.apk и |main. , чтобы вернуть оригиальные кэши игры. Которые мы получили в ****, вот пример: base.apk:495616b01919ae6fb793dbd30df08015:94530818|main.2010.com.axlebolt.standoff2.obb:933bf54569583031ecfe5ff367c76958:1401339473 Я написал в поиск - "base.apk" и "|main.", потому-что в начале нашех хэшей указаны эти названия. Теперь мы пишем ретурн. monoString* (*old_safestring)(void* inst); monoString* safestring(*void inst){ std::string valtostd(old_safestring(inst)->toChars()); if (contains(valtostd, "base.apk:") && contains(valtostd, "|main.")){ return CreateMonoString("base.apk:495616b01919ae6fb793dbd30df08015:94530818|main.2010.com.axlebolt.standoff2.obb:933bf54569583031ecfe5ff367c76958:1401339473"); } } Все готово. Мы ретурнули оригинальные кэши игры. Дальше нужно ретурнуть сигнатуру,сигнатура всегда одна и она не меняется. И мы тоже получаем ее в логах, вот она: lcG7acvUIg0k4FQSQmAbyw1tN0o= Пишем поиск сигнатуры и ретурнаем её. monoString* (*old_safestring)(void* inst); monoString* safestring(*void inst){ std::string valtostd(old_safestring(inst)->toChars()); if (contains(valtostd, "base.apk:") && contains(valtostd, "|main.")){ return CreateMonoString("base.apk:495616b01919ae6fb793dbd30df08015:94530818|main.2010.com.axlebolt.standoff2.obb:933bf54569583031ecfe5ff367c76958:1401339473"); } else if (contains(valtostd, "=") && contains(valtostd, "data")){ return CreateMonoString("lcG7acvUIg0k4FQSQmAbyw1tN0o="); } } Готово, мы ретурнули сигнатуру. Теперь нужно ретурнуть проверку кэша,чтобы мы смогли в нашем апк заменить кэш без всяких проблем и играть с другим кэшем. monoString* (*old_safestring)(void* inst); monoString* safestring(*void inst){ std::string valtostd(old_safestring(inst)->toChars()); if (contains(valtostd, "base.apk:") && contains(valtostd, "|main.")){ return CreateMonoString("base.apk:495616b01919ae6fb793dbd30df08015:94530818|main.2010.com.axlebolt.standoff2.obb:933bf54569583031ecfe5ff367c76958:1401339473"); } else if (contains(valtostd, "=") && contains(valtostd, "data")){ return CreateMonoString("lcG7acvUIg0k4FQSQmAbyw1tN0o="); } else if (contains(valtostd, "base.apk") && contains(valtostd, "/data") && contains(valtostd, "|") && contains(valtostd, ".com.axlebolt.standoff2.obb:")){ return CreateMonoString("base.apk:495616b01919ae6fb793dbd30df08015:94530818"); } } А теперь объязательно нужно ретурнуть анти-бан девайс,чтобы бан по девайсу снимался автоматически. monoString* (*old_safestring)(void* inst); monoString* safestring(*void inst){ std::string valtostd(old_safestring(inst)->toChars()); if (contains(valtostd, "base.apk:") && contains(valtostd, "|main.")){ return CreateMonoString("base.apk:495616b01919ae6fb793dbd30df08015:94530818|main.2010.com.axlebolt.standoff2.obb:933bf54569583031ecfe5ff367c76958:1401339473"); } else if (contains(valtostd, "=") && contains(valtostd, "data")){ return CreateMonoString("lcG7acvUIg0k4FQSQmAbyw1tN0o="); } else if (contains(valtostd, "base.apk") && contains(valtostd, "/data") && contains(valtostd, "|") && contains(valtostd, ".com.axlebolt.standoff2.obb:")){ return CreateMonoString("base.apk:495616b01919ae6fb793dbd30df08015:94530818"); } else if (contains(valtostd, "3") && contains(valtostd, "|") && contains(valtostd, " ") && contains(valtostd.length() == 16){ return CreateMonoString(gen_random(16).c_str()); } } Готово. Теперь нужно сделать так чтобы ваша либка не детектилась, но этому вы научитесь в следующем этапе. А теперь нужно закончить наш код обхода! monoString* (*old_safestring)(void* inst); monoString* safestring(*void inst){ std::string valtostd(old_safestring(inst)->toChars()); if (contains(valtostd, "base.apk:") && contains(valtostd, "|main.")){ return CreateMonoString("base.apk:495616b01919ae6fb793dbd30df08015:94530818|main.2010.com.axlebolt.standoff2.obb:933bf54569583031ecfe5ff367c76958:1401339473"); } else if (contains(valtostd, "=") && contains(valtostd, "data")){ return CreateMonoString("lcG7acvUIg0k4FQSQmAbyw1tN0o="); } else if (contains(valtostd, "base.apk") && contains(valtostd, "/data") && contains(valtostd, "|") && contains(valtostd, ".com.axlebolt.standoff2.obb:")){ return CreateMonoString("base.apk:495616b01919ae6fb793dbd30df08015:94530818"); } else if (contains(valtostd, "3") && contains(valtostd, "|") && contains(valtostd, " ") && contains(valtostd.length() == 16){ return CreateMonoString(gen_random(16).c_str()); } else if (contains(valtostd, "/data/") && contains(valtostd, ".so") && contains(valtostd, "|")){ } return old_safestring(inst); } } -------------------------------------------- 2 ЭТАП Метод: "Как получить хэши". 1) Заходим в приложение "mt manager". У вас должен быть скачан оригинальный хэш и игра. 2) Переходим к директории кэша и зажимаем. Когда появляется окно, жмем "свойства". Позже, жмем "проверить". Копируем самое первое "MD5". И жмем "закрыть". 3) Снова зажимаем, выбираем "свойства" и ищем там "размер". Жмем на него 2-3 секунды, он копируется в буфер обмена. 4) Проделываем тоже самое только с игрой, а не кэшем. Получаем: base.apk:c233fb0fcab72e288092d64f631fd8f7:92552588 main.2020.com.axlebolt.standoff2.obb:e1b42257d641ddf5eae045dd9277547a:1399548100 5) Мы их совмещаем с помощью знака: "|". Итог: base.apk:c233fb0fcab72e288092d64f631fd8f7:92552588|main.2020.com.axlebolt.standoff2.obb:e1b42257d641ddf5eae045dd9277547a:1399548100 _______________________________________ Метод: "Возврат обратно в игру" 1) Для этого, нам понадобится оффсет. Их 2: "get_value" и ".ctor". Чем они отличаются? "get_value" - используется для обхода на "monoString*" ( private string ) ".ctor" - используется для обхода на "void" ( public void ) Чтобы их найти, нужно: ".ctor" = в поиск: = 10) он там один, выглядит так: // RVA: 0x9E9A0C Offset: 0x9E9A0C VA: 0x9E9A0C public void .ctor(string GLHMNACCDLO, uint HBAECMMLGPK = 10) { } get_value = в поиск: = 10) и ищем среди него, там их 3, они выглядят так: // RVA: 0x9E9824 Offset: 0x9E9824 VA: 0x9E9824 public string GPFKAGJCNCD() { } _______________________________________ Для начала, пишем обход на ".ctor": Обычное начало каждого хука: void (*название_хука)(...); void название_хука_другое(...){ } Я буду использовать такие названия: anti_ban_system_general anti_ban_system void (*anti_ban_system_general)(...); void anti_ban_system(...){ } Теперь нужно вместо (...) вставить наши переменные,они уже прописаны в оффсете, вот: public void .ctor(string GLHMNACCDLO, uint HBAECMMLGPK = 10) { } Так и делаем. void (*anti_ban_system_general)(void* inst, monoString* value, uint KeyLength); void anti_ban_system(void* inst, monoString* value, uint KeyLength){ } Спросите вы,почему я взял именно такие значения? Ответ простой - так было написано в дампе 0.17.1 ( без шифра ). Теперь нужно написать переменную, которая будет отвечать за возврат и поиск! Это делается так: void (*anti_ban_system_general)(void* inst, monoString* value, uint KeyLength); void anti_ban_system(void* inst, monoString* value, uint KeyLength){ if (inst != NULL) { std::string valtostd = value->get_sting(); // valtostd (поиск) | value (возврат) } } Мы задали переменной "valtostd" значение поиск, а "value" - возврат. Теперь нужно вернуть оригинальные хэши. Приступаем. Из прошлого урока мы нашли хэши: base.apk:c233fb0fcab72e288092d64f631fd8f7:92552588|main.2020.com.axlebolt.standoff2.obb:e1b42257d641ddf5eae045dd9277547a:1399548100 Теперь нужно их вернуть обратно в игру. void (*anti_ban_system_general)(void* inst, monoString* value, uint KeyLength); void anti_ban_system(void* inst, monoString* value, uint KeyLength){ if (inst != NULL) { std::string valtostd = value->get_sting(); // valtostd (поиск) | value (возврат) if (valtostd.find("base.apk:") && (valtostd.find("|main.")) && (valtostd.find("2020.com.axlebolt.standoff2.obb:")) != std::string::npos){ value = CreateMonoString("base.apk:c233fb0fcab72e288092d64f631fd8f7:92552588|main.2020.com.axlebolt.standoff2.obb:e1b42257d641ddf5eae045dd9277547a:1399548100"); } } } Итак, мы вернули оригинальшые хэши обратно в игру. Обошли проверку хэшей игры и кэша. Теперь нужно обойти проверку сигнатуры. _____________________________________________________________________________________________ Метод: "Как получить сигнатуру" Давайте начнем. Во первых я научу вас логать античит. Для начало вам нужно: - Оффсет - Код Для того,что-бы найти оффсет для лога,вам нужен дамп. Заходим в "dump.cs" и пишем в поиск: "= 10)" и вам выдается один оффсет! Дальше вам нужен код. Это обычный код войда который просто хукнут на LOGI. Вот код: void* (*old_Log)(void* inst, monoString* sub_704, uint sub_347); void* Log(void* inst, monoString* sub_704, uint sub_347) { if (inst != NULL) { LOGI("%s", sub_704->toChars()); } return old_Log(inst, sub_704, sub_347) } Этот код нужно поместить в место где у вас находятся хуки. Если вы это не понимаете,то в вашем сурсе должна быть внизу надпись "---- Hooking ----" или что-то похожее. void* (*old_Log)(void* inst, monoString* sub_704, uint sub_347); void* Log(void* inst, monoString* sub_704, uint sub_347) { if (inst != NULL) { LOGI("%s", sub_704->toChars()); } return old_Log(inst, sub_704, sub_347) } Должно быть понятно. Если у вас ошибки,то нужно найти файл logger.h, он может быть в любом сурсе в папке includes, по путю : /app/src/main/jni/Includes и потом нужно файл logger.h перенести в ваш сурс,по такому же путю и указать в файле main.cpp на первой строке: #include <Includes/Logger.h> Все, мы вставили код, что теперь? Теперь нужно прявязать наш код к оффсету. MSHookFunction((void *) getAbsoluteAddress("libil2cpp.so", 0x123456), (void *) Log, (void **)&old_Log); Вместо 0x123456 мы должны вставить оффсет который мы получили из "dump.cs". Готово, компилим наш сурс. Кстати, чуть не забыл, вам обязательно нужны рут права чтобы получить ****. Вот мы скомпилили наш сурс и теперь переходим в "play market". Вводим в поиск "logcat reader". Скачиваем это приложение,даем ему все разрешения и выбираем корневой метод,разрешаем рут и все. Теперь то меню которые мы скомпилили нужно вшить в игру, и добавить туда .smali обход, к примеру mUnityPlayer.smali, его можно найти везде в группах телеграмма. Просто переносим этот обход по путю smali/com/unity3d/player и потом возвращаемся обратно и заходим в файл: "Androidmanifest.xml" и переходим к : < aplication android:label="string_inactive408037/app_name" android:icon="Mipmap/app_icon" android:allowBackup="false" android:supportsRtl="true" android:banner="@drawable/app_banner" android:isGame="true" android:roundIcon="Mipmap/app_icon_round" android:appComponentFactory="androidx.core.app.CoreComponentFactory" android:requestLegacyExternalStorage="true" и после строки android:icon="Mipmap/app_icon" мы пишем: - android:name=".mUnityPlayer" Потом нам нужно будет перенести оригинальный апк стандоффа в папку assets и указать название: - base.apk Потом нам нужно будет перейти в приложение "Logcat Reader" и потом зайти в нашу игру, и зайти через фейсбук аккаунт, и подождать пока пройдет проверка данных пользователя до конца. И заходить в приложение "Logcat reader" и в приложение в поиск ввести "Mod_Menu". Все,я вас поздравляю,вы логнули античит! _______________________________________ Итак, мы логнули античит и получили много новых значений,они понадобятся нам все. Мы получили сигнатуру! Она выглядит так: lcG7acvUIg0k4FQSQmAbyw1tN0o= Добавим ее так-же в обход как и хэши: void (*anti_ban_system_general)(void* inst, monoString* value, uint KeyLength); void anti_ban_system(void* inst, monoString* value, uint KeyLength){ if (inst != NULL) { std::string valtostd = value->get_sting(); // valtostd (поиск) | value (возврат) if (valtostd.find("base.apk:") && (valtostd.find("|main.")) && (valtostd.find("2020.com.axlebolt.standoff2.obb:")) && (valtostd.find("|")) != std::string::npos){ value = CreateMonoString("base.apk:c233fb0fcab72e288092d64f631fd8f7:92552588|main.2020.com.axlebolt.standoff2.obb:e1b42257d641ddf5eae045dd9277547a:1399548100"); } else if (valtostd.find("=") && (valtostd.find("|")) != std::string::npos){ value = CreateMonostring("lcG7acvUIg0k4FQSQmAbyw1tN0o="); } } } Готово, мы добавили сигнатуру и хэши в наш обход. Но случилась проблема, axlebolt детектит ваш девайс айди и банит его. Нужно это исправить, в логах мы нашли наш девайс айди: 12h456asd123fd67 (пример) Что же нам делать, чтобы софт автоматом снимал бан девайс? Точно! Нужно сгенерировать новый девайс айди. Пишем код который генерирует 16 рандомных значений: std::string gen_random(const int len) { static const char alphanum[] = "0123456789" "abcdefghijklmnopqrstuvwxyz"; std::string tmp_s; tmp_s.reserve(len); for (int i = 0; i < len; ++i) { tmp_s += alphanum[rand() % (sizeof(alphanum) - 1)]; } return tmp_s; } И теперь нужно вернуть наше значение в обход,чтобы вернуть ровно 16 символов зададим этому значение 16 Сделаем это так: void (*anti_ban_system_general)(void* inst, monoString* value, uint KeyLength); void anti_ban_system(void* inst, monoString* value, uint KeyLength){ if (inst != NULL) { std::string valtostd = value->get_sting(); // valtostd (поиск) | value (возврат) if (valtostd.find("base.apk:") && (valtostd.find("|main.")) && (valtostd.find("2020.com.axlebolt.standoff2.obb:")) && (valtostd.find("|")) != std::string::npos){ // поиск хэшей base.apk | .main | 2020.com.axlebolt.standoff2.obb: | value = CreateMonoString("base.apk:c233fb0fcab72e288092d64f631fd8f7:92552588|main.2020.com.axlebolt.standoff2.obb:e1b42257d641ddf5eae045dd9277547a:1399548100"); // возврат хэшей base.apk | .main | 2020.com.axlebolt.standoff2.obb: | } else if (valtostd.find("=") && (valtostd.find("|")) != std::string::npos){ // поиск сигнатуры value = CreateMonostring("lcG7acvUIg0k4FQSQmAbyw1tN0o="); // возврат сигнатуры } else if (valtostd.find("3") && (valtostd.find("|")) && (valtostd.find(" ")) && (valtostd.length() == 16) != std::string::npos){ // поиск вашего девайс айди и задача чтобы символов было == 16 value = CreateMonoString(gen_random(16).c_str()); // генерация 16 символов } } } Так, мы написали анти-бан девайс и столкнулись с проблемой,наша либ детектится. Нужно подумать, что можно с этим сделать? Путь детекта: /data/data/com.axlebolt.standoff2/cache/libgvraudio.so Это я нашел в логах! Так, а что если загружать нашу либ бесконечно, и детекта - не будет! Для этого нам понадобится код replaceAll: void replaceAll(std::string& str, const std::string& from, const std::string& to) { if(from.empty()) return; size_t start_pos = 0; while((start_pos = str.find(from, start_pos)) != std::string::npos) { str.replace(start_pos, from.length(), to); start_pos += to.length(); } } немного об нем: replaceAll - поможет загрузить твою либ в игру бесконечно и античит не будет замечать ее. так,сделаем это так. наш путь детекта: std::string path_to_detect = "/data/data/com.axlebolt.standoff2/cache/libgraudio.so"; void (*anti_ban_system_general)(void* inst, monoString* value, uint KeyLength); void anti_ban_system(void* inst, monoString* value, uint KeyLength){ if (inst != NULL) { std::string valtostd = value->get_sting(); // valtostd (поиск) | value (возврат) if (valtostd.find("base.apk:") && (valtostd.find("|main.")) && (valtostd.find("2020.com.axlebolt.standoff2.obb:")) && (valtostd.find("|")) != std::string::npos){ // поиск хэшей base.apk | .main | 2020.com.axlebolt.standoff2.obb: | value = CreateMonoString("base.apk:c233fb0fcab72e288092d64f631fd8f7:92552588|main.2020.com.axlebolt.standoff2.obb:e1b42257d641ddf5eae045dd9277547a:1399548100"); // возврат хэшей base.apk | .main | 2020.com.axlebolt.standoff2.obb: | } else if (valtostd.find("=") && (valtostd.find("|")) != std::string::npos){ // поиск сигнатуры value = CreateMonostring("lcG7acvUIg0k4FQSQmAbyw1tN0o="); // возврат сигнатуры } else if (valtostd.find("3") && (valtostd.find("|")) && (valtostd.find(" ")) && (valtostd.length() == 16) != std::string::npos){ // поиск вашего девайс айди и задача чтобы символов было == 16 value = CreateMonoString(gen_random(16).c_str()); // генерация 16 символов } else if (valtostd.find("/data/") && (valtostd.find("data/")) && (valtostd.find("com.axlebolt.standoff2/")) && (valtostd.find("cache/")) && (valtostd.find(".so")) != std::string::npos){ std::string path_to_detect = "/data/data/com.axlebolt.standoff2/cache/libgraudio.so"; if (valtostd.find(path_to_detect)){ std::string basicString; basicString += replaceAll(valtostd, (path_to_detect + "|")); value = CreateMonoString(basicString.c_str()); } } } } Осталось закончить код! void (*anti_ban_system_general)(void* inst, monoString* value, uint KeyLength); void anti_ban_system(void* inst, monoString* value, uint KeyLength){ if (inst != NULL) { std::string valtostd = value->get_sting(); // valtostd (поиск) | value (возврат) if (valtostd.find("base.apk:") && (valtostd.find("|main.")) && (valtostd.find("2020.com.axlebolt.standoff2.obb:")) && (valtostd.find("|")) != std::string::npos){ // поиск хэшей base.apk | .main | 2020.com.axlebolt.standoff2.obb: | value = CreateMonoString("base.apk:c233fb0fcab72e288092d64f631fd8f7:92552588|main.2020.com.axlebolt.standoff2.obb:e1b42257d641ddf5eae045dd9277547a:1399548100"); // возврат хэшей base.apk | .main | 2020.com.axlebolt.standoff2.obb: | } else if (valtostd.find("=") && (valtostd.find("|")) != std::string::npos){ // поиск сигнатуры value = CreateMonostring("lcG7acvUIg0k4FQSQmAbyw1tN0o="); // возврат сигнатуры } else if (valtostd.find("3") && (valtostd.find("|")) && (valtostd.find(" ")) && (valtostd.length() == 16) != std::string::npos){ // поиск вашего девайс айди и задача чтобы символов было == 16 value = CreateMonoString(gen_random(16).c_str()); // генерация 16 символов } else if (valtostd.find("/data/") && (valtostd.find("data/")) && (valtostd.find("com.axlebolt.standoff2/")) && (valtostd.find("cache/")) && (valtostd.find(".so")) != std::string::npos){ std::string path_to_detect = "/data/data/com.axlebolt.standoff2/cache/libgraudio.so"; if (valtostd.find(path_to_detect)){ std::string basicString; basicString += replaceAll(valtostd, (path_to_detect + "|")); value = CreateMonoString(basicString.c_str()); } } return anti_ban_system_general(inst, value, KeyLength); } } Итак, осталось добавить все **** что есть и бана не будет, если он есть - ищи детекты и думай и фикси. В этой статье рассказно все! Как работает анти-бан девайс? Как работает анти-бан девайс? gen_random - это код который генерирует 16 рандомных букв/цифр. Почему 16? Потому-что axlebolt банит ваш device id, он состоит из 16 рандомных значений (букв/цифр). По этому,мы создаем код который генерирует 16 рандомных значений и он будет менять ваш device id и не будет бана по девайсу.
С античитом посложнее чем с функциями, хотя по разному бывает, я так и не понял как искать ключи для дампа, если знаешь пж напиши не эту тему
Было бы ахуенно еще бы такое на айос.. но у меня вопрос как выглядит сам «обход» типа именно что там состоит это типа маскируется под чтото или чё..мне просто интересно изучать это я
Trfrx, ты добавляешь обход в сурс, в обходе уже есть маскировка от игры (если правильно написал). Обход этот спиздить не реально, так как твой сурс будет скомпилирован в приложение.
id672210830, тебе на английском написали. Ндк не знает что за имя "Моностринг". Чел что то не так сделал, либо не то добавил
AsErnislkswJ, он даун а не прокод(1. Это не обход а хуки на 0.15.0 (2.обход ты так не напишеш)3. Обход будет с баном есле напишеш)
Ничего не понял бл. КАКОЙ logger.h НАДО ПЕРЕМЕСТИТЬ В ПАПКУ СУРС ИЛИ КУДА НИЧЕГО НЕ ПОНЯЛ ЧТО ТЫ ТАМ НАПИСАЛ