Разбираемся с поддержкой x64 в WPE Pro
Думаю, что большинство из местных обитателей знакомы с понятием сниффера. Несмотря на то, что конечная цель у них одна и та же (перехват пакетов, соответствующих определённым критериям), достигают они её совершенно разным образом. Какой-то софт слушает указанный сетевой интерфейс (например, Wireshark, где это реализовано при помощи библиотеки Pcap), а какой-то — перехватывает вызовы ответственных за взаимодействие с сетью WinAPI-функций. И у того, и у другого метода есть свои плюсы и минусы, однако если по задаче необходим перехват пакетов от конкретного заранее известного приложения, то второй вариант, как правило, банально удобнее. В этом случае нет нужды узнавать IP-адреса и порты, которые использует данная программа (особенно учитывая тот факт, что их может быть довольно много), и можно просто сказать «я хочу перехватывать все пакеты вот этого приложения». Удобно, не правда ли?
Пожалуй, самым популярным на сегодняшний день сниффером, работающим по принципу перехвата вызовов определённых WinAPI-функций, является WPE Pro. Возможно, многие из вас слышали о нём на различных форумах, посвящённых онлайн-играм, ведь именно для получения преимуществ в различных играх этот сниффер в большинстве случаев и используется. Свою задачу он выполняет прекрасно, однако у него есть один неприятный недостаток — он не умеет работать с 64-битными приложениями. Так уж вышло, что по одной из возникших задач мне как раз понадобилось перехватывать пакеты от 64-битного приложения, и я посмотрел в сторону Wireshark. К сожалению, использовать его в данной ситуации было не очень удобно — исследуемое приложение отправляло данные на разные IP-адреса, каждый раз открывая новый порт. Погуглив немного, я обнаружил, что готовых аналогов WPE Pro с поддержкой x64 нет (если они всё же есть, буду признателен за ссылки в комментариях — обратите внимание, что речь идёт о Windows). Автор WPE Pro не оставил никаких контактных данных на официальном сайте и в самом сниффере, так что я принял решение разобраться в этом вопросе самостоятельно.
Как протекал процесс и что из этого вышло, читайте под катом.
Итак, что необходимо сделать в первую очередь? Верно, скачать сам WPE Pro. Сделать это можно на официальном сайте сниффера, где предлагаются для загрузки сразу две версии — 0.9a и 1.3. Мы будем рассматривать версию 0.9a, потому что именно она работает на последних версиях Windows.
Скачали? Теперь давайте проверим, не накрыт ли он каким-нибудь паковщиком или протектором:
Похоже, на этот раз снимать нам ничего не придётся. Тогда берём в руки OllyDbg и загружаем «WpePro.net.exe». Давайте для примера запустим 64-битную версию Dependency Walker’а и узнаем, почему WPE Pro не может отобразить его в списке доступных для перехвата процессов.
Получить список текущих процессов в WinAPI можно двумя основными путями:
- При помощи связки функций CreateToolhelp32Snapshot, Process32First и Process32Next (пример можно найти, например, тут)
- При помощи функции EnumProcesses (пример можно найти, например, тут)
Смотрим на intermodular calls модуля «WpePro.net.exe» и видим, что ни CreateToolhelp32Snapshot, ни EnumProcesses тут нет. Возможно, приложение получает их адрес в run-time при помощи WinAPI-функции GetProcAddress, так что давайте посмотрим на referenced text strings. На этот раз всё с точностью наоборот — нашлась как строка «CreateToolhelp32Snapshot», так и «EnumProcesses». Ставим бряки на места, где происходит обращение к данным строкам, нажимаем на кнопку «Target program» в WPE Pro и смотрим на место, на котором мы остановились:
Если понажимать F9, то мы увидим, что этот же бряк срабатывает ещё несколько раз, прежде чем наконец появится окно со списком текущих процессов. Давайте посмотрим, почему в нём не оказалось Dependency Walker’а. Закрываем окно, снова нажимаем на кнопку «Target program» и выполняем пошаговую отладку, начиная с того же самого бряка. Вскоре после вызовов GetProcAddress мы попадаем в цикл, в котором последовательно вызываются следующие функции — OpenProcess, EnumProcessModules, скрывающаяся за инструкцией CALL DWORD PTR DS:[EDI+10], GetModuleFileNameEx (инструкция CALL DWORD PTR DS:[ECX+14]) и CloseHandle:
Давайте поставим бряк по адресу 0x0042A910, где происходит занесение на стек последнего аргумента функции OpenProcess — PID, и попробуем дождаться момента, когда регистр EAX примет значение, равное идентификатору процесса Dependency Walker’а. На моей машине в этот момент он был равен 6600, т.е. 0x19C8.
Если пробежаться по коду, то мы увидим, что в случае Dependency Walker’а инструкция TEST EAX,EAX, находящаяся по адресу 0x0042A942 и следующая за вызовом WinAPI-функции EnumProcessModules, заставляет следующий за ней оператор условного перехода прыгнуть по адресу 0x0042A9E7, где находится вызов CloseHandle, что, разумеется, не является нормальным ходом работы приложения, ведь мы ещё даже не дошли до вызова функции GetModuleFileNameEx:
Обратите внимание на код ошибки — 0x12B (ERROR_PARTIAL_COPY). Давайте посмотрим, почему такое может происходить. Открываем документацию к функции EnumProcessModules и видим следующее:
If this function is called from a 32-bit application running on WOW64, it can only enumerate the modules of a 32-bit process. If the process is a 64-bit process, this function fails and the last error code is ERROR_PARTIAL_COPY (299)
Да, это как раз наш случай.
Несмотря на то, что в документации к функции GetModuleFileNameEx не сказано ничего похожего, ведёт она себя аналогичным образом, что описано, например, тут. Одним из вариантов решения этой проблемы является использование функции QueryFullProcessImageName, которая будет отрабатывать нормально даже в случае вызова из 32-битного приложения, запущенного в WOW64, в случае применения её к 64-битному процессу.
Теперь мы можем занопить вызов функции EnumProcessModules
0042A93F . FF57 10 CALL DWORD PTR DS:[EDI+10] ; EnumProcessModules 0042A942 . 85C0 TEST EAX,EAX 0042A944 90 NOP 0042A945 90 NOP 0042A946 90 NOP 0042A947 90 NOP 0042A948 90 NOP 0042A949 90 NOP 0042A94A . 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14] 0042A94E . BE 00000000 MOV ESI,0
и написать code cave для замены GetModuleFileNameEx функцией QueryFullProcessImageName:
0042A971 /E9 DA3F0600 JMP WpePro_n.0048E950 0042A976 |90 NOP 0042A977 |90 NOP 0042A978 |90 NOP 0042A979 |90 NOP ; GetModuleFileNameEx 0042A97A |90 NOP 0042A97B |90 NOP 0042A97C |90 NOP 0042A97D |90 NOP 0042A97E |90 NOP 0042A97F |90 NOP 0042A980 |90 NOP 0042A981 |90 NOP 0042A982 |90 NOP 0042A983 |90 NOP 0042A984 |90 NOP 0042A985 |90 NOP 0042A986 |90 NOP 0042A987 |90 NOP 0042A988 |90 NOP 0042A989 |90 NOP 0042A98A |90 NOP 0042A98B |90 NOP 0042A98C |90 NOP 0042A98D |90 NOP 0042A98E > |6A 14 PUSH 14 0042A990 . |E8 7FCF0300 CALL WpePro_n.00467914
0048E950 60 PUSHAD 0048E951 9C PUSHFD 0048E952 8D5C24 AC LEA EBX,DWORD PTR SS:[ESP-54] 0048E956 C74424 AC 040>MOV DWORD PTR SS:[ESP-54],104 0048E95E 53 PUSH EBX 0048E95F 50 PUSH EAX 0048E960 6A 00 PUSH 0 0048E962 55 PUSH EBP 0048E963 E8 777CB675 CALL KERNEL32.QueryFullProcessImageNameA 0048E968 9D POPFD 0048E969 61 POPAD 0048E96A ^ E9 1FC0F9FF JMP WpePro_n.0042A98E
Теперь WPE Pro отображает множество новых процессов, в том числе и наш Dependency Walker:
Однако при попытке приаттачиться к данному процессу WPE Pro выдаёт неприятное для нас сообщение:
Тут мы уже, к сожалению, ничего не можем поделать. DLL-инъекция осуществляется путём внедрения своей DLL в адресное пространство target-процесса, а на MSDN сказано следующее:
On 64-bit Windows, a 64-bit process cannot load a 32-bit dynamic-link library (DLL). Additionally, a 32-bit process cannot load a 64-bit DLL
Несложно догадаться, что WPE Pro поставляется только с 32-битной библиотекой.
Что же делать? Писать свой перехватчик WinSock? А почему бы и нет?
Но как мы это будем осуществлять? Первое, что приходит на ум — это воспользоваться Detours, однако на официальном сайте сразу же сообщается, что поддержка 64-битных приложений есть только в Professional Edition:
Detours Express is limited to 32-bit processes on x86 processors
Тогда давайте попробуем EasyHook. Среди всего прочего, эта библиотека как раз позволяет работать с 64-битными приложениями:
You will be able to write injection libraries and host processes compiled for AnyCPU, which will allow you to inject your code into 32- and 64-Bit processes from 64- and 32-Bit processes by using the very same assembly in all cases
С небольшими изменениями примера, продемонстрированного в официальном туториале, получаем код, перехватывающий вызовы функций recv и send из WinSock и выводящий перехваченные сообщения побайтово в шестнадцатеричном виде:
Код программы, совершающей DLL-инъекцию
using EasyHook; using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Runtime.Remoting; using System.Text; using System.Threading.Tasks; namespace Sniffer < public enum MsgType < Recv, Send >; [Serializable] public class Message < public byte[] Buf; public int Len; public MsgType Type; >public class InjectorInterface : MarshalByRefObject < public void OnMessages(Message[] messages) < foreach (Message message in messages) < switch (message.Type) < case MsgType.Recv: Console.WriteLine("Received bytes via recv function", message.Len); break; case MsgType.Send: Console.WriteLine("Sent bytes via send function", message.Len); break; default: Console.WriteLine("Unknown action"); continue; > foreach (byte curByte in message.Buf) < Console.Write("", curByte); > Console.WriteLine("====================="); > > public void Print(string message) < Console.WriteLine(message); >public void Ping() < >> class Program < static void Main(string[] args) < if (args.Length != 1) < Console.WriteLine("Usage: Sniffer.exe [pid]"); return; >int pid = Int32.Parse(args[0]); try < string channelName = null; RemoteHooking.IpcCreateServer(ref channelName, WellKnownObjectMode.SingleCall); RemoteHooking.Inject( pid, InjectionOptions.DoNotRequireStrongName, "WinSockSpy.dll", "WinSockSpy.dll", channelName); Console.ReadLine(); > catch (Exception ex) < Console.WriteLine("An error occured while connecting to target: ", ex.Message); > > > >
Код самой DLL, которая будет инжектиться в целевой процесс
using EasyHook; using Sniffer; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading; using System.Threading.Tasks; namespace WinSockSpy < public class Main : EasyHook.IEntryPoint < public Sniffer.InjectorInterface Interface; public LocalHook RecvHook; public LocalHook SendHook; public LocalHook WSASendHook; public StackQueue = new Stack(); public Main(RemoteHooking.IContext InContext, String InChannelName) < Interface = RemoteHooking.IpcConnectClient(InChannelName); > public void Run(RemoteHooking.IContext InContext, String InChannelName) < try < RecvHook = LocalHook.Create( LocalHook.GetProcAddress("Ws2_32.dll", "recv"), new DRecv(RecvH), this); SendHook = LocalHook.Create( LocalHook.GetProcAddress("Ws2_32.dll", "send"), new DSend(SendH), this); RecvHook.ThreadACL.SetExclusiveACL(new Int32[] < 0 >); SendHook.ThreadACL.SetExclusiveACL(new Int32[] < 0 >); > catch (Exception ex) < Interface.Print(ex.Message); return; >// Wait for host process termination. try < while (true) < Thread.Sleep(500); if (Queue.Count >0) < Message[] messages = null; lock (Queue) < messages = Queue.ToArray(); Queue.Clear(); >Interface.OnMessages(messages); > else < Interface.Ping(); >> > catch (Exception) < // NET Remoting will raise an exception if host is unreachable >> //int recv( // _In_ SOCKET s, // _Out_ char *buf, // _In_ int len, // _In_ int flags //); [DllImport("Ws2_32.dll")] public static extern int recv( IntPtr s, IntPtr buf, int len, int flags ); //int send( // _In_ SOCKET s, // _In_ const char *buf, // _In_ int len, // _In_ int flags //); [DllImport("Ws2_32.dll")] public static extern int send( IntPtr s, IntPtr buf, int len, int flags ); [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] delegate int DRecv( IntPtr s, IntPtr buf, int len, int flags ); [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Unicode, SetLastError = true)] delegate int DSend( IntPtr s, IntPtr buf, int len, int flags ); static int RecvH( IntPtr s, IntPtr buf, int len, int flags) < Main This = (Main)HookRuntimeInfo.Callback; lock (This.Queue) < byte[] message = new byte[len]; Marshal.Copy(buf, message, 0, len); This.Queue.Push(new Message < Buf = message, Len = len, Type = MsgType.Recv >); > return recv(s, buf, len, flags); > static int SendH( IntPtr s, IntPtr buf, int len, int flags) < Main This = (Main)HookRuntimeInfo.Callback; lock (This.Queue) < byte[] message = new byte[len]; Marshal.Copy(buf, message, 0, len); This.Queue.Push(new Message < Buf = message, Len = len, Type = MsgType.Send >); > return send(s, buf, len, flags); > > >
- Во-первых, отсутствует перехват WSARecv, WSASend и некоторых других функций, которые могут использоваться в целевых приложениях
- Во-вторых, отсутствие GUI и «строкового» представления перехваченных сообщений
- etc
Послесловие
Исследование и модификация бинарных файлов не всегда даёт моментальный результат, как это наблюдалось в предыдущих моих статьях (если интересно, читайте об этом тут и тут), так что иногда приходится вернуться в самое начало и изменить свой подход к решению проблемы. Но в этом нет абсолютно ничего ненормального — как известно, любой опыт полезен, а реверс-инжиниринг — не исключение.
Спасибо за внимание, и снова надеюсь, что статья оказалась кому-нибудь полезной.
- assembler
- ollydbg
- reverse engineering
- исследование программ
- отладка
WPE PRO — инструкция пользователя и FAQ — читы гайды Сверхъестественное / Supernatural
Часто особенно у новичков возникают вопросы по использованию программы WPE PRO, потому я все же решил выложить описание работы с программой и ответы на часто задаваемые вопросы по использованию WPE PRO. Так как программа на английском языке, а с инглишем у жителей стран бывшего СССР не сложилось, то кое-что пришлось перевести.
Общие понятия:
Пакет – кусочек информации, передаваемый за один раз между сервером и клиентом.
Фильтр – при перехвате пакетов, так сказать, встаёт между клиентом и сервером и когда клиент отправляет пакет, заменяет посылаемые значения на те, которые указали вы. Если Вам сложно понять что это такое, представьте себе пылесос. Он всасывает много мелких частиц: крошки, пиль и т.д. В нашем случае «пиль» это часть информации которую мы хотим заменить на другую. Информация как пыль остается на фильтре и вместо нее ставится другая.
Принцип работы или как оно работает?
Для обмена данными между сервером и компьютером пользователя(нами) используют такие пакеты:
— Send – исходящий пакет что отправляется на сервер от нас.
— Recv – входящий пакет что приходит от сервера к нашему компу.
Все дело состоит в подмене этих пакетов, а точней первого типа пакетов.
Второй тип пакетов мы не редактируем, а беремся за первый объясню почему: Recv-пакеты не дадут нам желаемого результата, потому что они не идут обратно на сервер, а только в одном направлении. А для того чтоб изменить какую-то инфу на сервере нужно ее менять на нашем компе до отправки.
Если Вы поставите фильтр между сервером и компом на Recv-пакеты(входящие), то:
— информация в проге/игре измениться только визуально;
— сервер кинет ошибку;
— ничего не изменится .
Функции программы:
1. Запись входящих и исходящих пакетов
Для того чтоб отправлять пакеты и создавать фильтры, нужно записать пакеты, без них работа невозможна.
ВНИМАНИЕ! Перед работой с программой выключите антивирус или добавьте папку с программой в исключения (антивирь ругается не только на exe-файл, а и на dll).
Итак, начнем:
— запустите программу/игру с которой происходить запись пакетов;
— запустите WPE(для удобства киньте ярлык на рабочий стол);
— выберете программу с какой будете записывать пакеты, нажав
выбираем программу и нажимаем Open.
— нажимаем на треугольник для записи ;
— заходим в игру/программу делаем действия, пакеты которых хотим записать(например, машем рукой). Возможно программа что-то делает без вашего вмешательства тогда только записуем;
— когда действие закончилось быстренько переходим в окно WPE и нажимаем .
2. Создание фильтров
Перед созданием фильтров ознакомимся с вспомогательными кнопками:
— запуск записи/отправки пакетов;
— пауза записи пакетов/остановка отправки пакетов;
— остановка записи пакетов;
— создание нового пакета;
— открыть/загрузить фильтр;
— сохранить фильтр;
— сохранить фильтр с паролем;
— отметить/снять галочку на всех фильтрах;
— создание/редактирование фильтров;
— включить/выключить фильтр;
— удалить фильтр;
— удалить все фильтры.
Пакет записали, но для создания фильтра необходимо 2 примерно одинаковых пакетов. Пока Вы пили чай я записал еще 1 пакет(например, с действием «хитаем головой»). Поехали:
— копируем строчку кода которая выполняет действие «машем рукой» — выделяем → ПКМ(61 63 74 3D 66 6B 69 6E 67 63 68 61 74 26 6C 61);
— ставим галочку на фильтре;
— нажимаем кнопку создать/редактировать фильтр;
— появится окошко создания фильтра;
— в поле SEARCH вставляем код первого пакета(действие «машем рукой») с помощью сочетания клавиш Ctrl + V(или ПКМ → Вставить);
— в поле Filter name можно задать имя фильтра;
— в поле Search in: убираем галочки с Recv и Recv From;
— нажимаем кнопку Appy;
— также копируем похожий пакет с второй группы(вторая сессия записи) с действием «хитаем головой»(48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D) и вставляем в поле MODIFY окна Filter edit;
— опять Appy и все. Фильтр готов к работе;
— остается только включить его нажав .
Теперь когда мы будем нажимать на кнопку «машем рукой» персонаж будет выполнять действие «хитаем головой».
3.Отправка записанных пакетов на сервер
С помощью WPE можно как составлять список отправляемых пакетов так и отправлять их по одному. Сначала разберем отправку 1 пакета:
— нажимаем ПКМ на пакете → Отправка. И вот что мы видим:
Большое текстовое поле дает возможность редактировать пакет перед отправкой(не забывайте что 16-я система исчисления состоит из цифр и букв от A до F). С левой стороны текстового поля находится hex(16-я система исчисления), а справа ASCII кодировки.
Регулировать объем пакета можно в поле Packet size.
В поле Sent видим количество отосланных пакетов ( в этом случае 1) и количество ошибок при отсылке.
В поле Send можно задавать задержку между отправками(Timer), с ним будьте осторожней, если поставить очень мало сразу попадете в бан. Выбор Continuously и Time(s) думаю Вам понятен. При нажатии точки New Soket нужно задать порт и ip сервера на который пойдет пакет. После нажатия треугольника ваш пакет «полетит». Остановить догадаетесь.
Рассмотрим вкладку Send.
Она имеет такие же кнопки как вкладка Filters. Кроме них здесь есть кнопки создание нового пакета( ), отправки пакета/пакетов( ), остановка отправки( ). Изменять пакеты можно нажав на правка или двойной щелчок на нем. После нажатия пакеты Вы увидите окошко с подобными настройками как при отправлении 1 пакета.
И напоследок рассмотрим вкладки главного меню:
— File включает пункты новый, открыть что делают ту же функцию(возможно автор недосмотрел). Cloze закрывает записанную группу пакетов. Save as – сохраняет группы пакетов в формате pac(формат WPE) после чего их можно опять открыть в программе и продолжить работу; и формате txt(WPE не поддерживает).
— Edit – функции буфера обмена.
— View – настройка интерфейса панелей программы.
— Window – удобно размещает записанные пакеты по рабочей области программы.
— Help – справка.
Еще в программе есть Find (поиск).
При выборе Hex поиск будет произведен в левой части пакета, тоисть в 16-й системе исчисления, при ASCII кодировке в правой части пакета.
Читерим с помощью WPE PRO
Внимание внимание. из уст шамана донеслась до меняч страшная тайна.
кароч если у вас есть прист и впе то можно легко убить лубова боса в любом инчте даж кила за 5 минут вот ето я хотел бы узнать скок не искал ни чего не нашол но я с етим шамой и его другом в активном поиске как што то узнаю тут же выложу)))
в санвеле в начале данжа есть мобы-ханты их всего 3-4шт, суть бага в том что прист его контролит и натравливает на любова боса в санвеле моб-хант запускает стрелу и бос умирает в течении 5-6сек.
советую зачистеть весь треш а прист все время его конртолит и потом вести моба до боса и там делать святое дело багерить
фильтр для wpe на убийство иллидана http://depositfiles.com/ru/files/z1l0k5hn1
У вас должен быть установлен патч DamagMeter или похожий (подсчитывающий ваш урон по босу)
1* Запускаем ВОВ;
2* Заходим на чара;
3* Запускаем WPE PRO;
4* Запускаем PermEdit,
в списке находим и выделяем процесс WPE PRO,
жмём «Grant Permission»,
закрываем PermEdit.
5* В программе WPE жмём «Target Program»,
в списке выделяем задачу WOW.exe и жмём «ОК».
6* Загружаем фильтр «Hunter»,
ставим галочку на данном фильтре.
7* Жмём «ON»;
8* Делаем релог в ВОВ;
9* приходим к Иллидану(желательно сделать тп у нему с помощью телепортхака)
НИ В КОЕМ СЛУЧАЕ НЕ АКТИВИРУЕМ АКАМУ
10* Наводим цель на Иллидана
11* Жмём скил (http://ru.wowhead.com/?spell=27044#taught-by-npc) (Дух ястреба уровень
ВНИМАНИЕ: у Иллидана как будто не будут уменьшаться хп, но это не так!
т.к весь нанесённый вами урон вступит в силу только после активации акамы.
DamageMeter как раз и нужен, чтоб знать, когда перестать бить его.
12* Смотрим на DamagMeter
как нанесённый ваш урон достигнет практически до общего уровня здоровья Иллидана (примерно на количество от двух нанесённых вами ударов), перестаём бить
нанесённый вами урон не должен быть превышен общего количества здоровья Иллидана.
13* После этого активируем акаму
после активации будет видно, что у Иллидана меньше 1% от общего здоровья
теперь главное успеть стрельнуть в него пару раз (пока он вас не убил) и получить дроп
У вас должен быть установлен патч DamagMeter или похожий (подсчитывающий ваш урон по босу)
1* Запускаем ВОВ;
2* Заходим на чара;
3* Запускаем WPE PRO;
4* Запускаем PermEdit,
в списке находим и выделяем процесс WPE PRO,
жмём «Grant Permission»,
закрываем PermEdit.
5* В программе WPE жмём «Target Program»,
в списке выделяем задачу WOW.exe и жмём «ОК».
6* Загружаем фильтр «Hunter»,
ставим галочку на данном фильтре.
7* Жмём «ON»;
8* Делаем релог в ВОВ;
9* Наводим цель на дружественного НПС/игрока/гварда и тд
10* Жмём скил (http://ru.wowhead.com/?spell=27044#taught-by-npc) Дух ястреба уровень 8
Наш персонаж будет стрелять по дружественной цели. [url][/url]
Для подмены спеллов используються 7 и 8 столбцы, мжно подменять только спеллы из своей книжки.
1.Подмена спеллов(Лок, Дру, Пал, Хант).
http://filebeam.com/f032360c213b10c5133c00539ee54210
Quote
Starfire -> Hibernate *
Claw -> Moonfire ( moonfire in cat form )*
Demoralizing Roar -> Lifebloom (Lifebloom на себя в мишке)
Curse of Recklessness -> Banish
Hunter’s Mark -> Scare Beast (Фир у ханта)*
Hammer of Justice -> Turn Evil (Фир у пала на 20 сек)*
Hammer of Justice -> Exorcism (Бурст дамаг холи пала )
Запускаем ВПЕ, открываем фильтр ставим галочки где вам надо, жмём ON.
2. Фильтр на стелс в комбате(для роги):
Sinister Strike rank 10==>Stealth rank 4
Code
07 | 08
EE | 68
FB | 06
Запускаем этот фильтр.Делаем макрос:
Code
/cast Sinister Strike(Rank 10)
/cast Ambush(Rank 7)
Юзаем его при вкючённом фильтре(жмём мноо раз->постоянный амбуш)
3.для друидов-в кошке используя Claw(Rank 6) -> Prowl(rank 3)
Code
07|08
78|69
B9|26
4.Фильтр для дру. Циклон
Code
007 008
D3 01
FA 83
В игре юзаем Thorns (корни) ранк 1 на себя или дружественного перса и его кидает в циклон.Полезно для танкования, так как под циклоном танк иммунен к дамагу.
5.Фильтр для дру. Возможность заходить в стелс в форме мишки.Enrage(bear) ==> Prowl
Code
07|08
6D|14
B9|26
6.Фильтр для мага. Овцуем кого угодно. Фильтр старый, но полезный, в овце оч большой реген хп и маны.
Arcane Intellect (rank 3) ==> Polymorph
Code
07|08
B5|05
19|32
7.Для мага. Фильтр полезен, если на вашем серве какому-нибудь боссу изменили фракцию. С помощью этого фильтра можно кастовать в вендоров, гвардов и т.д.Arcane Intellect (rank 1) ==> Frostbolt (rank 14)
Code
07|08
B3|05
29|97
8. Фильтр для роги. Большой дамаг. Работает не на всех сервах. Sinister Strike (rank 10) ==>Ambush (rank В этом фильтре используються 8 и 9 столбцы*
Code
Offset : 08|09
Search: EE|68
Modify: 31|BE
этим когда то пользовался проверяйте!
WPE для самых маленьких. На примере.
День добрый.
Сегодня я расскажу вам о том как работает WPE PRO, что можно сделать с её помощью и как, на примере многим любой игры Blood And Soul. ( [ Ссылки могут видеть только зарегистрированные пользователи. ] )
И так. Начнем.
WPE PRO — Winsock Packet Editor PROfessional, другой версии, кроме как PRO я не встречал, посему и расскажу о ней.
Программа WPE PRO классифицируется как генератор пакетов. Генератор пакетов это тип программ, которые генерируют случайные пакеты или создаёт их самостоятельно. Генераторы пакетов используют сокеты. Чаще всего применяются для тестирования реализации стека IP протоколов для поиска багов и уязвимостей. (с) wiki
Скачать её мы можем здесь: [ Ссылки могут видеть только зарегистрированные пользователи. ] (оф. сайт)
*Антивирус жалуется на вирусы, но это потому, что сие программа внедряется в процессы для изменения\подмены пакетов, что, в принципе, недопустимо для Антивирусов, т.к подобные приемы могут использоватся вирусами.
Итак. Ближе к делу.
Шаг1. Начало:
Запускаем нашу WPE, видим перед собой окно, полное непонятных английских слов, но это не беда, у WPE есть русификатор, который, вобщем-то, нам и не нужен, достаточно небольших знаний английского языка.
Нажимаем Target Programm и выбираем там тот процесс, над которым собственно и будем глумится. В нашем случае это client.exe (клиент игры blood and soul).
Процесс выбрали. Теперь нам надо решить, что будем делать:
Спамить пакетами на сервер или же фильтровать их для подмены значений.
Шаг2.1. Спам пакетами:
Поспамить мы можем совершенно разными способами.
Например мы можем убивать монстра при его респе, или же собирать орду монстров, и убивать их, своебразный бот получается.
Или к примеру крафтить что либо.
Ну или же собирать, ящики какие нибудь.
Вобщем, наши возможности безграничны.
Выбираем пункт меню View -> Option
И устанавливаем:
Для Winsock 1.1 — Send, SendTo. Recv, RecvFrom включать не надо.
Для Winsock 2.0 — оставляем без изменений, если я не ошибаюсь, Winsock 2.0 используется браузерами, т.е можно даже взломать флеш-приложения ВК, но это уже другой разговор.
Затем жмем ОК.
Далее уходим в безлюдное место, чем меньше народу, тем лучше для нас, т.к меньше будем посылать пакеты серверу, и, соотвественно, проще будет найти необходимый нам пакет.
Нажимаем Плей и совершаем необходимое нам действие.
Затем нажимаем Стоп.
У нас вылезет окошко со всеми отправленными пакетами. (У отправленных есть пометка Send или SendTo).
Выглядит это всё примерно вот так: [ Ссылки могут видеть только зарегистрированные пользователи. ]
Если всё выглядит именно так, а это — непонятная Function у пакета, где написана полная ересь — нам будет посложнее, но не очень.
Если пакетов совсем мало — ставим на отправку (ПКМ по пакету — Add To Send List) все, и отправляем их по очереди:
Сначала галочку на 1 пакет, сенд его, смотрим что произошло в игре, затем на 2ой, и таким образом выискиваем нужный нам.
Если же пакетов великое множество: Ориентируемся по времени, когда мы сделали действие, и когда нажали стоп, и восстанавливая хронологию событий — ищем пакет.
Второй вариант поиска пакета:
Мы знаем что в нашем действии участвовала цифра, допустим, 255.
Включаем калькулятор, придаем ему инженерный вид, вводим 255, переключаемся на Нех (16-тиричная система счисления) и получаем FF, затем ищем пакет, в котором есть FF, но, к сожалению, многие приложения шифруют это дело, и, врятли будет там именно то число, которое мы искали.
Расскажу на примере спама в чат локации игры BS:
Пишем в чат что либо, например: «Игрок Tully с сервера пандора самый лучший. ))»
И, поскольку, в пакете английские символы замечательно видны, мы сможем отличить пакет по @$!@^T.u.l.l.y@$@^@!!))
Т.е мы видим что там есть английские буквы Tully, знаки восклицания, и скобочки. Ставим этот пакет на автоотправку с ТО в 10к мс.
ЗЫ: Чат локации в БС не поддерживает отправки одинаковых сообщений, т.е хоть на 1 символ, но нужно менять сообщение, с помощью пакетов мы обходим эту «защиту», но, к сожалению, таймер в 10 сек на отправку сообщений обойти не удалось, по крайней мере мне.
После того как нашли искомое — ставим на автоотправку и наслаждаемся процессом.
Шаг2.2. Фильтры:
Сейчас я научу вас запускать фильтры.
Фильтр он и в африке фильтр, заменит что либо на другое значение, при котором измененный пакет отправится на сервер, или же к нам на ПК(клиент).
Для начала выберем, что же будем фильтровать: Исходящие(Send, SendTo) или Входящие пакеты(Recv, RecvFrom).
Скажу сразу, фильтрация входящих пакетов врятли даст какие либо изменения, они будут лишь у вас, и при первом же контакте сервера с «багаемым» предметом — его кол-во станет о5 прежним.
Что то я уже на дюп перешел. Ну да ладно.
Исходя из выжеизложенного, полагаю, что фильтровать мы, всё таки, будем исходящие пакеты(Send, SendTo).
Залазим в настройки, включаем отображение только Send и SendTo пакетов.
Затем запускаем снифф пакетов(плей).
Далее совершаем необходимое нам действие в игре, к примеру, покупаем x зелий здоровья за n монет.
Допустим, х = 10, n = 255
Т.е мы купили 10 зелий за 255 монет. Именно ЗА, а не ПО, т.к в пакете, скорей всего, будет именно общая цена товара, а не цена за еденицу, при покупке количества Х.
Нажимаем стоп в нашем WPE, и ищем пакет, найти нам его помогут значения, 10 зелий, 255 монет. Переводим 10 и 255 в Нех кодировку. Получаем 10 = 0A, 255 = FF. Так же стоит отметить что на самом то деле в Нех кодировке число 255 будет выглядеть как 00 FF или 00 00 00 FF, аналогично и 00 0A или 00 00 00 0A. +Ко всему, в пакетах значения часто перевернуты, т.е мы видим не 00 0A, а 0А 00, и не 00 FF, а FF 00.
И вот мы нашли пакет, ежели не нашли — игра использует шифровку, неведанную нам, простым смертным.
Нашли, теперь высчитываем оффсет, в котором находятся наши FF и 0A.
На самом деле это проще простого.
См. [ Ссылки могут видеть только зарегистрированные пользователи. ]
Кружочками я обвел каждый оффсет, идут они по порядку, в одном ряду — 16 оффсетов, в 2ух — 16*2 = 32 оффсета, в 3 — 16*3 = 48 оффсетов и т.д
Пакет нашли, оффсеты посчитали.
К примеру, мы получили 8(для 0А) и 11(для FF) оффсеты.
Клацаем в окне WPE по слову Filters и выбираем там Filter 1
Жмем по нему 2 раза ЛКМ. И видим перед собой таблицу.
[ Ссылки могут видеть только зарегистрированные пользователи. ]
Разумеется указываем работу фильтра на Send и SendTo
Имя фильтра — ну укажите Zhyk.ru 4ever =)
в строку SEARCH пишем: в столбец под номером 008 — 0А, в 011 — FF
Затем в строку MODIFY в те же столбцы: в 008 пишем то, сколько зелий мы желаем(например FF — это 255), в 011 — цену, за которую мы их желаем(например 01 — это 1).
Всё указано на примере! НЕ ОБЯЗАТЕЛЬНО ЧТО В ВАШЕМ СЛУЧАЕ ВСЁ БУДЕТ ИМЕННО ТАК!
Затем жмем Apply и ставим галочку на фильтре Zhyk.ru 4ever
После чего нажимаем ON (это чуть выше того места, где показаны все фильтры)
И повторяем это действие, так же покупаем 10 зелий за 255 монет, и вуаля, мы получили 255 зелий за 1 монету.
Шаг3. Заключение:
Если вы всё таки и решили читерить в играх, по средствам WPE — не стоит сильно дюпать, или багать что либо, идей масса, возможности безграничны, я лишь направил вас на этот путь. И помните, это всё нарушение правил любой игры, что повлечет блокировку аккаунта, чего я вам не желаю.
Выложено с целью ознакомления, нивкоей мере не пропагандирую использование и не претендую на разрушение геймплея любых ММО, в частности — Blood And Soul. Со всем уважением к администрации всех ММО проектов заявляю: я использую WPE лишь для тестирования выявленных мною потенциальных багов, читов и прочего.
С любовью Tully, (Пандора).
*Если этот пост не наберет море плюсов в мою репутацию, и не менее большой океан «спасибок» я серьёзно на вас обижусь, и больше никакие свои старания не солью в паблик и прокляну всех, кто посмотрит мой топик и не оставит даже сообщения с благодарностью.
**С радостью приму плюшки в игре.
***Поддержите автора материально, он вам ещё и не такое забацает (С)
****Хочешь накормить человека один раз — дай ему рыбу, хочешь накормить на всю жизнь — научи рыбачить. (с)
Исходя из этой мудрости, я не стал писать дюпы, я решил научить вас делать это самим
Спасибо за внимание. Надеюсь, что я вам помог.