Jump to content

V3ct0r

Administrators
  • Content count

    1,437
  • Joined

  • Last visited

  • Days Won

    181

V3ct0r last won the day on September 17

V3ct0r had the most liked content!

Community Reputation

967 Excellent

About V3ct0r

  • Rank
    Sea Captain

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. V3ct0r

    клиент анти-бот

    Про какую критику ты говоришь? Ты наехал на меня, мол я кому-то порчу игру и вообще, я вредитель, а ты этакий благородный Д'Артаньян, который в отличие от меня, прилагает все силы, чтобы улучшить эту игру. Более того, оказывается я должен (!) выложить исходный код защиты и программы автообновлений, а я вместо этого их продаю, такой мерзкий барыга, который удавится ради денег. Чувак, я тебе ничего не должен и ничем не обязан. Я потратил свое собственное время, изучая механизмы взлома сервера, принципы внедрения своего кода в .exe файлы, мне пришлось изучить Ассемблер, после чего нужно было придумать механизм защиты и реализовать его, и в конце концов протестировать результат. И на все это ушло около 6 месяцев. И тут ты такой приходишь и говоришь мне что я должен. Я, значит, выкладываю свои труды в шару, а ты их скачиваешь и ставишь на свой сервер. Мои защита и программа автообновлений обеспечивают тебе стабильный игровой процесс, который, в свою очередь, приносит тебе доходы. В итоге @Stinger у нас богатеет, а @V3ct0r'у большое спасибо. Так что ли должно быть? Есть люди, которые мне помогали при создании защиты, и они получили её бесплатно. Например, Пастух, которого все так хейтят. Я думаю мало кто знает, что именно он придумал механизм защиты от подмены и редактирования пакетов. Так же я могу дать защиту просто так, если вижу что на сервере нет ИМа и админ внес вклад в развитие нашего сообщества. @e1mer не даст соврать, я подарил защиту для его сервера ZEST Online. С чего ты взял, что от моих рук? Информация по рисованию скиллов уже во всю гуляла внутри сообщества игроков пиратии. Я всего лишь её нашел (мне кто-то рассказал в скайпе) и в учебных целях решил написать DLL'ку, которая выводила удобную формочку для взлома. В качестве бонуса, я решил на этом заработать. Опять-таки, я не собираюсь перед тобой отчитываться. В общем, скиллы рисовали еще до меня. Смотри выше. Тем, кто интересовался у меня как она работает, я рассказывал. Не всем конечно, людям которых более-менее знал. Но что-то никто не реализовал бесплатный аналог. Ну вот когда увижу, тогда и поговорим. А то пиздеть - не мешки ворочать. Слился. В следующий раз приходи с более основательной и убедительной аргументацией.
  2. V3ct0r

    клиент анти-бот

    @Stinger, чувак, я не собираюсь перед тобой оправдываться. Просто потому что я могу, вот и все. Я думаю, многим ребятам будет интересно посмотреть как работают такие штуки и они возьмут эту информацию для своего развития. Скажи, на скольких серверах работает капча? На 1.5 из 20? Более того, я слышал, что этот антибот раздражает игроков и у меня просили наоборот вырезать его из игры. Далее, я выложил только исходный код. Как ты думаешь, сколько человек захочет заморачиваться, скачивать и устанавливать требуемые библиотеки, компилировать DLL и цеплять её к клиенту? И в конце концов, я написал: "Стоит отметить, что DLL распознает капчу с не 100% вероятностью", а ты уже обосрался. Представь себе, здесь есть такие люди, у которых знаний больше, чем у меня. Это ты что ли работаешь над улучшением игры? Ну-ка, покажи нам свои удивительные разработки? А где ты был в далеком 2009 году, когда это все только начиналось? Когда мы не то чтобы о дырах и багах думали, мы не знали как запустить сервер и подключить к нему клиент. Не сомневайся, друг. Если бы ты был внимателен, то давно знал бы что: 1) Первичная защита от WPE/RPE для клиента была выложена на MD, сейчас её можно найти в архиве: 2) Защиту от рисования скиллов (в т.ч. 20 уровня) и исправление бага поиска отряда в море, а так же подробное описание как они работают, я выложил в соседнем разделе: раз и два; 3) Защиты от SQL инъекций и WPE/RPE на сервере были написаны на Ассемблере. Это значит, что никаких исходных кодов нет и что вот прям сейчас ты можешь открыть свои AccountServer.exe, GroupServer.exe и GateServer.exe и посмотреть как там все работает. Все общее, что моя программа автообновлений имеет с официальной ("из исходников, которые я просто исправил") - это внешний вид (т.н. GUI, форма) и алгоритм обновления. А если учесть факт, что моя программа написана в C++ Builder с использованием библиотеки VCL и работает по протоколу HTTP, а автоапдейтер, про который ты говоришь, написан в Visual Studio с применением библиотеки MFC и работает по протоколу FTP, то ты не прав. Не поверишь, а я очень рассчитывал именно на тебя! Да-да! Каждый день думаю, когда же там Stinger выложит полностью исправленные исходники, чтобы я их скомпилировал, поставил сервер и поднял кучу бабла. И подумаешь, что нужно 100500 человекочасов, я до сих пор верю в тебя! А теперь вопрос другим пользователям: во сколько пиздаболов из десяти вы оцениваете пост Stinger'а? Пишите ответы в комментариях!
  3. V3ct0r

    клиент анти-бот

    Выкладываю исходный код DLL (C++), которая автоматически распознает капчу и отправляет ответ на сервер. Зависимости: Detours tesseract EasyBMP DLL написана и протестирована в Microsoft Visual Studio Community 2017. В исходник забиты адреса объектов, методов и функций для Game.exe из 1.38 ру. оф. клиента. #define _CRT_SECURE_NO_WARNINGS #include <Windows.h> #include <detours.h> #include <iostream> #include <string> #include <baseapi.h> #include <allheaders.h> #include <EasyBMP.h> // ------------------------------------------- // Адреса // ------------------------------------------- const unsigned int oGameAppAddr = 0x00660540; const unsigned int oNumAnswerMgr = 0x00668AD8; const unsigned int fSetBmpAddr = 0x004781F0; const unsigned int fSysInfoAddr = 0x0040E300; const unsigned int fSendCheck = 0x0050AA90; const unsigned int fShowForm = 0x00477CF0; // ------------------------------------------- // Пути // ------------------------------------------- const std::string tempImagePath = ".\\user\\"; const std::string tessDataPath = ".\\tessdata"; // ------------------------------------------- typedef void(__cdecl *SysInfoPtr)(void *, const char *, ...); typedef void(__thiscall *SetBmpPtr)(void *, int, char *, int); typedef void(__cdecl *SendCheckPtr)(const char *); typedef void(__thiscall *ShowFormPtr)(void *, bool); SetBmpPtr SetBmp_Original = (SetBmpPtr)(void *)fSetBmpAddr; SysInfoPtr SysInfo = (SysInfoPtr)(void *)fSysInfoAddr; SendCheckPtr SendCheck = (SendCheckPtr)(void *)fSendCheck; ShowFormPtr ShowForm_Original = (ShowFormPtr)(void *)fShowForm; tesseract::TessBaseAPI *OCR = nullptr; std::string Answer = ""; bool proccess = false; // Заполнен пиксель или нет bool IsPixelFilled(const RGBApixel& px) { unsigned int r = static_cast<unsigned int>(px.Red); unsigned int g = static_cast<unsigned int>(px.Green); unsigned int b = static_cast<unsigned int>(px.Blue); if (r == g && g == b && b == 255) { return false; } return true; } // Функция фильтрации void FilterFunc(BMP& Bmp) { // Пустой (белый пиксель) RGBApixel emptyPixel; emptyPixel.Alpha = 0; emptyPixel.Red = 255; emptyPixel.Blue = 255; emptyPixel.Green = 255; // Размеры изображения unsigned int width = Bmp.TellWidth(); unsigned int height = Bmp.TellHeight(); // Обрабатываем изображение for (unsigned int x = 0; x < width; x++) { for (unsigned int y = 0; y < height; y++) { if (x == 0 || y == 0 || x == (width - 1) || y == (height - 1)) { Bmp.SetPixel(x, y, emptyPixel); } else { if (IsPixelFilled(Bmp(x - 1, y)) == false && IsPixelFilled(Bmp(x + 1, y)) == false && IsPixelFilled(Bmp(x, y - 1)) == false || IsPixelFilled(Bmp(x, y + 1)) == false && IsPixelFilled(Bmp(x, y)) == true) { Bmp.SetPixel(x, y, emptyPixel); } } } } } // Убрать шумы с изображения и сохранить его в файл void FilterAndSave(const std::string& Path, char *data, int size) { // Объект для работы с BMP BMP Bmp; // Загружаем изображение из памяти Bmp.ReadFromBuffer(reinterpret_cast<unsigned char *>(data), size); // Фильтруем... FilterFunc(Bmp); FilterFunc(Bmp); FilterFunc(Bmp); // Сохраняем изображение во временный файл Bmp.WriteToFile(Path); } // Убрать лишние символы из строки std::string& trim(std::string& str) { std::string chars = "\t\n\v\f\r "; str.erase(0, str.find_first_not_of(chars)); str.erase(str.find_last_not_of(chars) + 1); return str; } // Функция, которая получает BMP-изображение // с символом от сервера void __fastcall SetBmp_Hooked(void *This, void *notUse, int n, char *data, int size) { // Вызываем оригинальную функцию SetBmp_Original(This, n, data, size); // Начинаем распознавать символы капчи ... if (n == 0) { // Отображаем сообщение пользователю // что сервер запрашивает код SysInfo(reinterpret_cast<void *>(oGameAppAddr), "<Анти-антибот>: Сервер запрашивает ответ на 4 буквенный код!"); // Инициализиурем код и флаг отсутствия ошибок Answer = ""; proccess = true; } // Если нет ошибок, то распознаем текущее изображение if (proccess) { // Путь до временного файла с изображением std::string path = tempImagePath + std::to_string(n) + ".bmp"; // Убираем шумы с изображения // и сохраняем его в файл FilterAndSave(path, data, size); // Загружаем изображение в память // для последующей обработки библиотекой tesseract Pix *pix = pixRead(path.c_str()); if (pix != nullptr) { // Распознаем символ char outText[8]; OCR->SetImage(pix); lstrcpyA(outText, OCR->GetUTF8Text()); // Преобразовываем символ в std::string std::string Letter(outText); // Убираем из строки с символом лишние символы Letter = trim(Letter); // Проверяем, что символ удалось распознать if (Letter == "") { proccess = false; std::string Msg = "<Анти-антибот>: Не удалсь распознать " + std::to_string(n + 1) + "-й символ!"; SysInfo(reinterpret_cast<void *>(oGameAppAddr), Msg.c_str()); } else { // Запоминаем символ Answer += Letter; } // Освобождаем память pixDestroy(&pix); } // Отправляем ответ на сервер if (n == 3) { // Код был успешно распознан if (proccess == true) { std::string Msg = "<Анти-антибот>: Распознанный код: " + Answer + "."; SysInfo(reinterpret_cast<void *>(oGameAppAddr), Msg.c_str()); SysInfo(reinterpret_cast<void *>(oGameAppAddr), "<Анти-антибот>: Отправляем ответ на сервер..."); SendCheck(Answer.c_str()); } else { // Говорим пользователю, что не удалось распознать капчу SysInfo(reinterpret_cast<void *>(oGameAppAddr), "<Анти-антибот>: Не удалсь распознать 4-буквенный код! Введите код вручную."); // Отображаем форму для ввода капчи ShowForm_Original(reinterpret_cast<void *>(oNumAnswerMgr), true); } } } } // Хук на метод отображения формы ввода кода void __fastcall ShowForm_Hooked(void *This, void *notUse, bool show) { // Ничего не делаем... } // Точка входа BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: // Загружаем библиотку tesseract OCR = new tesseract::TessBaseAPI(); if (OCR->Init(tessDataPath.c_str(), "eng") != 0) { return FALSE; } // Устанавливаем хуки DetourRestoreAfterWith(); DetourTransactionBegin(); DetourAttach(&(PVOID&)SetBmp_Original, SetBmp_Hooked); DetourAttach(&(PVOID&)ShowForm_Original, ShowForm_Hooked); DetourUpdateThread(GetCurrentThread()); DetourTransactionCommit(); break; case DLL_PROCESS_DETACH: // Снимаем хуки DetourTransactionBegin(); DetourUpdateThread(GetCurrentThread()); DetourDetach(&(PVOID&)SetBmp_Original, SetBmp_Hooked); DetourDetach(&(PVOID&)ShowForm_Original, ShowForm_Hooked); DetourTransactionCommit(); // Выгружаем библиотеку tesseract OCR->Clear(); OCR->End(); break; } return TRUE; } При запросе ответа на капчу, сервер отправляет клиенту 4 случайных BMP-изображения из папки GameServer\resource\Pic. Эти изображения являются монохраматическими, т.е. имеют цветность 1 бит (палитра состоит из 2 цветов - белого и черного), размеры 26 на 29 пикселей и весят 178 байт. Сначала у меня была идея скопировать эти изображения с символами в клиент и просто побайтово сравнивать их с изображениями, полученными от сервера, таким образом определять текстовые символы. Но оказалось, что сервер перед отправкой изображения случайным образом добавляет в него шумы, т.е. каждый раз клиент получает разные изображения и их нельзя сравнивать. Изображения, которые лежат в папке Pic сервера: Примеры изображений, которые получает клиент: Тогда я решил воспользоваться библиотекой для распознавания текста: даем ей на вход изображение символа, получаем на выходе текстовый символ. Чтобы повысить вероятность корректного распознавания символов, я написал простую функцию, которая убирает шумы: => => "M" Стоит отметить, что DLL распознает капчу с не 100% вероятностью: могут возникать ошибки распознавания текста. Если DLL вообще не может распознать какой-либо символ из 4-буквенного кода, то появляется окошко для ввода капчи и управление процессом передается пользователю (на скриншоте в шапке поста окошко ввода капчи отображается принудительно). Также DLL может перепутать символы, например, символ "6" на изображении определить как букву "C", в этом случае на сервер будет отправлен неверный код, и сервер может кикнуть игрока после 3-ех неверных попыток. В общем, думаю идея всем понятна.
  4. V3ct0r

    Voyager skills without consuming coral energy

    How to use Voyager skills without corals. SkillInfo.txt. Replace the old lines with new ones: 213 Tornado 1 4,10;16,10 1,-1 1,-1 1,-1 -1 2 1 0 -1 211,2 1 1 1 800 4 1 0 0 0 0 0 SkillSp_Jf 0 0 0 Skill_Coral_Wind_Jf Skill_Jf_End 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SkillCooldown_Jf 1 1 12 -1 100 -1 272 0 0 0,0 0,0 0 -1 -1 0 0 101 -1 273 0 0 0 s0213.tga 0 0 Equip Wind Coral to twirl target up into the air Duration of 3.5s at Level 1. Requires Wind Coral to be equipped. Increases duration by 0.5s per skill level Consumes 27 SP at Level 1. Increases by 2 SP per skill level 0 214 Lightning Bolt 1 4,10;16,10 1,-1 1,-1 1,-1 -1 2 1 0 -1 210,1 1 1 1 800 4 1 0 0 0 0 0 SkillSp_Lj 0 0 0 Skill_Coral_Thunder_Lj Skill_Lj_End 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SkillCooldown_Lj 1 1 12 -1 102 2 269 0 0 0,0 0,0 0 -1 -1 0 0 103 -1 270 0 0 0 s0214.tga 0 0 Equip Thunder Coral to strike target with lightning Damage is determined by skill level and Spirit. Requires Thunder Coral to be equiped Consumes 27 SP at Level 1. Increases by 2 SP per skill level 0 216 Conch Ray 1 16,10 1,-1 1,-1 1,-1 -1 2 1 0 -1 212,5 1 1 1 600 4 2 0 0 1 0 0 SkillSp_Bkcj 0 0 SkillArea_Line_Bkcj Skill_Coral_Strike_Bkcj Skill_Bkcj_End 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SkillCooldown_Bkcj 1 1 13 0 106 6,-1 265,266 0,0 0 0,0 0,0 0 -1 -1 0 0 107 2 267 0 0 0 s0216.tga 0 0 Uses Strike Coral to damage targets in a straight line Damage is determined by skill level and Spirit. Requires Strike Coral to be equipped Consumes 23 SP at Level 1. Increases by 3 SP per skill level 0 217 Tail Wind 1 16,10 1,-1 1,-1 1,-1 -1 2 1 1 -1 213,4 1 2 2 0 2 2 0 0 3 0 0 SkillSp_Sf 0 0 SkillArea_Circle_Sf Skill_Coral_Wind_Sf Skill_Sf_End 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SkillCooldown_Sf 1 1 12 0 108 -1 285 0 0 247,0 0,0 -1 -1 -1 0 0 -1 -1 286 0 0 0 s0217.tga 0 0 Uses Wind Coral to summon wind to boost sailing speed of ships in an area Requires Wind Coral to be equipped Consumes 23 SP at Level 1. Increases by 3 SP per skill level 0 219 Fog 1 16,10 1,-1 1,-1 1,-1 -1 2 1 0 -1 217,2 1 2 2 800 4 2 0 0 3 0 SkillArea_State_Mw SkillSp_Mw 0 0 SkillArea_Circle_Mw Skill_Coral_Fog_Mw Skill_Mw_End 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SkillCooldown_Mw 1 1 12 0 112 -1 281 0 0 247,0 0,0 -1 -1 -1 0 0 -1 -1 282 0 0 0 s0219.tga 0 0 Uses Fog Coral to decrease attack of enemies within range Requires Fog Coral to be equipped Consumes 21 SP at Level 1. Increases by 1 SP per skill level 0 220 Lightning Curtain 1 16,10 1,-1 1,-1 1,-1 -1 2 1 0 -1 214,8 1 2 3 600 4 2 0 0 3 0 SkillArea_State_Lm SkillSp_Lm 0 0 SkillArea_Circle_Lm Skill_Coral_Thunder_Lm Skill_Lm_End 0 0 0 0 0 0 0 0 0 0 0 0 0 0 SkillCooldown_Lm 1 1 12 0 114 -1 288 0 0 247,0 0,0 -1 -1 -1 0 0 115 -1 289 0 290 0 s0220.tga 0 0 Uses Thunder Coral to create a thunderstorm that damages targets in range Effect increases with each level. Requires Thunder Coral to be equipped Consumes 21 SP at Level 1. Increases by 1 SP per skill level 0
  5. V3ct0r

    Clean Server Files

    Hello @Solid Strife! PKO 1.38 + Tools
  6. V3ct0r

    ItemAttr

    Вытащи ID предмета из слота экипировки. По другому вроде никак
  7. V3ct0r

    ItemAttr

    local con = GetItemAttrRange(<ID предмета из ItemInfo.txt>, ITEMATTR_VAL_CON, 0)
  8. Попробуй сделать как в этом гайде. Только вместо времени проверяй какой-то признак персонажа, в зависимости от которого выбирается язык.
  9. puzzleworld\entry.lua В функции after_create_entry( ) вызывается функция GetMapEntryCopyObj( )? function after_create_entry(entry) local copy_mgr = GetMapEntryCopyObj(entry, 0) // !!! именно 0 . . . end
  10. А смысл? Ты её отключишь, а сервер отправит 3 запроса на капчу и не получит ответа. В результате тебя кикнет. Я бы попробовал написать DLL'ку, которая перехватывает нажатия клавиш и отправляет соответствующие пакеты на сервер.
  11. V3ct0r

    клиент анти-бот

    Очень жду, интересно почитать. Или ты ждешь, пока тебе здесь ответят как обойти данный антибот?
  12. Ничего подобного. В данном случае, помогать просто так не хочешь именно ты, и при этом проецируешь свое странное поведение на весь форум. Напиши пару статей, выложи разработанные тобой программы или скрипты, внеси вклад в наш форум, и все будут тебе рады. Понятное дело, это гораздо сложнее, чем писать глупые комментарии.
  13. А как её надо написать, чтобы работало как надо? Все что эта штука учитывает задано в исходнике и про пати, как было отмечено выше, здесь речи нет: if ( pMainCha != nullptr && pCha != nullptr ) { if ( pMainCha->get_id() != pCha->get_id() ) { // Проверим, что персонажи не находятся в СВ if ( OurMap != "guildwar" && OurMap != "guildwar2") { if (pMainCha->get_guild_id() == pCha->get_guild_id()) { // Если персонажи в одной гильдии // то устанавливаем зеленый круг side_id = 1; } else { // Если персонажи не в одной гильдии // то устанавливаем красный круг side_id = 2; } } } }
  14. @mkhzaleh, this version of DLL works only with Russian client. You need to find the following addresses in Game.exe from your client and correct the source code: // Main Character address const DWORD MainChaStaticAddr = 0x0067061C; // Address of the function NetSwitchMap( ) const DWORD NetSwitchMapAddr = 0x005071A0; // Address of the method CCharacter::setSideID( ) const DWORD SetSideIdAddr = 0x004A2950; // Given addresses are for Russian client
  15. price Server protection against SQL-injections ?

×