EvilByte
-
Постов
16 -
Зарегистрирован
-
Посещение
Тип контента
Профили
Форумы
Загрузки
Блоги
Сообщения, опубликованные EvilByte
-
-
В 02.03.2016в17:45, partoftheworlD сказал:
Слишком вы все усложняете, может легче и быстрее сделать пиксельный аимбот по цвету определенной области. У противников по любому должен совпадать раскраск. Для 2D игр проще способа я не знаю)
Нет желания создавать пиксельный аибот, да и противники, могут менять скин и он не будет работать
-
23 часа назад, Garik66 сказал:
Думаю, это только экранные значения.
А реальные, которые будут влиять и на перемещение прицела и на то куда полетит пуля - во float всё-таки.
Реальные значения, которые влияют на перемещение прицела (это и есть курсор, у него тип 4 байта), они не зависят от самого прицела (прицел просто визуальный).
-
13 часа назад, Garik66 сказал:
Я сам ни разу не писал aimbot, а написал своё сообщение исходя из этого:
подумал, что ты сам всё знаешь и испытываешь трудности именно с переводом float в integer.
А по-твоему вопросу:
Видел у нас на форуме тему (название не помню) - в ней keng объяснял человеку как перевести игровые координаты на координаты мини-карты (человек хотел сделать мини-карту для игры со всеми ботами) - думаю тебе эта тема подойдёт. Попробуй поискать её по нику kengа. Может по слову мини-карта можно найти.
ЗЫ: Вроде нашёл -
Как мне кажется, нужно идти вот в этом направлении
-
2 часа назад, Garik66 сказал:
PS: EvilByte, я тут подумал и мне кажется, что тебе нужно вернуться к поиску координат - координат не мышки, а прицела - координаты прицела будут уже пересчитаны к, как ты их называешь, мировым (игровым, а не экранным) координатам и они скорее всего все будут во float и координаты прицела и координаты NPC и никаких double и int не будет. Перепроверь координаты.
Спасибо за ответы, этот способ я тоже проверял, координаты прицела оказались целые числа, и если в них записывать какие-либо значения, то прицел только визуально меняет положение, а стреляет туда, где стоит курсор.
А если записывать значения, в координаты мышки которые были найдены мною ранее, то все работает (стрелять будет туда, куда запишешь значение, а прицел визуальный не будет менять положение).
То есть, координаты мышки найдены уже правильно.
-
В 27.02.2016в20:53, Garik66 сказал:
Второй пост смотрел? Не подошло?
Спасибо за ответ, но не подошло.
Как вы не можете понять, что координаты мышки и координаты игроков не зависят напрямую.
Просто перевод игровых координат в целое число ничего не даст.
Тут именно нужно конвертированние координат игровых, в координаты экранные (координаты мышки).
Есть ли, на этом форуме специалисты по этому делу (Aimbot)?
Возможно, тут нужно делать какие-нибудь геометрические действия?
-
22 часа назад, afro228offical сказал:
Видимо , надо было подробней объяснить , что хочешь сделать . Ща , возможно я тебя понял , Типа в игре координаты x=123.321 , а y=321,123 и тебе надо их перевести в экранные (в целые числа ) И , возможно , проблема в том , что может игровая координата уйти в минус ?
Так? Скажи , что за игра ?Нет немного не правильно меня понял.
Координаты мышки целые числа (Пример x=340, y=600) - это положение курсора на экране.
Координаты игрока дробные числа (Пример x=3.2235234, y=11.34253452).
Перевод координат игрока в целое число - это не проблема. Тут дело немного в другом:
Допустим мышка (курсор) у меня находится в центре окна игры (Пример разрешение окна 600 на 800), тем самым координаты мышки x=300, y=400.
Игрок, которого мы хотим убить находится в центре экрана, то есть мы вручную навели на него прицел. А координата игрока, допустим x=3.55234663 и y=11.53652346 (При этом, координаты мышки никак не могут быть равны с координатами игрока).
Если этот игрок сместится куда - нибудь, то прицел уже будет не на нем.
То есть задача такова:
Нужно перевести координаты игроков мировые (или игровые, не знаю как они еще называются), в координаты мышки (Экранные координаты).
-
21 минуты назад, afro228offical сказал:
Игра 2д , ты собираешься ,по твоим словам, конвертировать их в экранные . А ничего , что экранные координаты это и есть 2д ?!
Сразу видно, что ты не разбираешься. Почитай про понятие объект (мировые координаты и экранные).
-
13 минуты назад, Garik66 сказал:
Второй пост смотрел? Не подошло?
Сейчас попробую. В Cheat Engine ассемблере команды в таком же виде (fld и fistp)?
-
5 часов назад, Garik66 сказал:
Каким образом у тебя получились разные типы для координат не очень понял (лично я ни разу с таким не сталкивался).
Используя инструкции математического сопроцессора.
Например на ассемблер:
fld [координата противника X] // записываем в st(0) координату X во FLOAT fistp [адрес координаты мышки X] // перезаписываем из st(0) координату в [адрес координаты мышки X], одновременно переводя значение в INTEGER fld [координата противника Y] // Для Y тоже самое. fistp [адрес координаты мышки Y]
Разные типы координат получились такими, так как во всех flash играх существует область окна (swf игры), в которой есть высота и ширина окна (пример 900x600).
Курсор мышки, который попадает в видимость окна флеш игры, записываются координаты положения высоты и ширины окна (это и есть координаты мышки).
В пример, если курсор мышки стоит в центре окна игры (900x600), то координаты будут следующие:
Xmouse = 450 (int)
Ymouse = 300 (int)
А мировые координаты игроков, имеют тип float - это X координата игрока, а тип double - это Y координата игрока.
Перевести мировые координаты в тип int, это не проблема, но они будут отличаться от экранных координат мышки (курсора).
То есть математический сопроцессор может перевести мировые координаты игроков в координаты мышки каким-то способом?
Или вы просто имели ввиду, конвентирование float в int?
Может нужно работать с матрицами, или с геометрией какой-либо (ну нужно учитывать, что это 2D игра)?
-
2 часа назад, afro228offical сказал:
1-е читаем память игры 2 перебираем в цикле координаты игроков и одновременно высчитываем длину вектора , от курсора до других игроков
, находим наименьший вектор . И двигаем мышку туда , откуда проведён наименьший вектор . Двигать её можно с помощью функции mouse_event . Советую сделать DLL библиотеку и инжектить её в
процесс игры.Ничего нового я не услышал (способов реализаций существует множество), вопрос остается открытый - конвертированние мировых координат, в координаты экранные.
-
Пришла на ум мысль сделать aimbot для 2D flash игры. Сама реализация аимбота мне понятна, но есть некоторая проблема, о которой я скажу позже.
Как я представляю реализацию аимбота (Прошу поправить, если что-то не так):
1)Читаем адрес со значением о кол-ве игроков n раз в t время.
2) Запускаем цикл, с перебором всех игроков(базовый адрес + смещение каждого игрока + смещение до координат) и читаем их координаты
3)Далее вычисляем дистанцию от своей координаты до координаты противника и добавляем в массив в отсортированном порядке.
4)Находим адрес координат нашей мышки X и Y.
5)Потом делаем инъекцию кода в уже найденную инструкцию стрельбы, с записью координат ближайшего врага.
После инструкции стрельбы пишем команду
mov [адрес координаты мышки X], координата противника X
mov [адрес координаты мышки Y], координата противника Y
Вот тут, то и есть некоторая проблема.
Координаты противника X - это float значение
Координаты противника Y - это double значение.
Координаты мышки X, Y - это int значение(4 байта).
Как я понимаю, нужно каким-то образом перевести координаты противника, в экранные координаты (координаты мышки).
Каким образом это сделать, мне не известно.
Буду очень признателен, если кто-нибудь поможет мне, с этой проблемой.
-
Согласен что 0xFFы может быт меняется, но и другие тоже может меняться. Не зря же придумали маску.
Может ты немного не правильно меня понял?
Допустим есть сигнатура с байтами 8B 3C 00 24 10. К примеру, я точно знаю, что байт 24 "неопределенный".
Я заменяю его на FF. То есть сигнатура теперь выглядит так: 8B 3C 00 FF 10.
И поэтому я переделал код на вот этот:
Я изменил на вот это: for (int i = End; sIn[Pool + i] == sFor | sFor == 0xFF; i--) Но такой способ не работает.
То есть, если есть байты в сигнатуре со значением 0xFF(-1), то цикл вычитается (не важно, совпал ли байт из буффера с байтом из сигнатуры).
Я просто заменил вопросик на 0xFF
Кстати насчет маски есть один вопрос.
Я правильно переделал код? Чтобы в маске было не два символа "xx", а один "x".
(исходный код) Для двух символов "xx":
bool[] maskBool = new bool[mask.Length / 2]; for (int i = 0; i <= mask.Length - 2; i += 2) { maskBool[i / 2] = mask.Substring(i, 2) == "xx" ? true : false; }
(переделанный код) Для одного символа "x":
bool[] maskBool = new bool[mask.Length]; for (int i = 0; i <= mask.Length - 1; i++) { maskBool[i] = mask.Substring(i, 1) == "x" ? true : false; }
- 1
-
Где тут по меняющем сигнатурам (по маскам) поиск так и не понял, или идея в другом?... не понятно
Тут идея не в поиске по маске, а в том, что если байт в сигнатуре равен -1(0xFF), то это и есть "неопределенный" байт, который может меняться.
Пример:
Address = (int)aobscan.AobScan(new byte[] { 0xFF, 0x8B, 0x4A, 0x24, 0xFF, 0xC0, 0x0F, 0xFF });// {??, 8B, 4A, 24, ??, C0, 0F, ??}
Изначально код был такой:
for (int i = End; sIn[Pool + i] == sFor[i]; i--)
Я изменил на вот это:
for (int i = End; sIn[Pool + i] == sFor[i] | sFor[i] == 0xFF; i--)
Но такой способ не работает.
З.Ы. Мне кажется не фига не быстрый это... Хотя особо не проверял
Насчет скорости, я проверил около 4 алгоритмов сравнения буффера с сигнатурой. И этот оказался самый быстрый (возможно, есть способ шустрее, но я такой не наблюдал).
Например, если подставить алгоритм, который написал Keng, в этот сканер, то поиск сигнатуры может занять очень долгое время (у меня поиск занимал около 20 секунд, и то адрес находился в начале памяти. А если адрес лежал бы в памяти 0x7FFF1000 ?, то вобще бы минут 5 сканировал).
А в алгоритме Boyer–Moore–Horspool, сканирование этой же сигнатуры, происходило меньше одной секунды.
Так что, все кто говорит, что c# медленный и из-за этого сканирует долго, то они не правы.
Конечно же c# уступает по скорости c++, но все же главную роль играет быстрый (правильный) алгоритм сравнения.
Алгоритм Кенга:
Алгоритм Boyer–Moore–Horspool:
Если интересна производительность, можешь подставить алгоритм keng'a или другой в этот сканер и увидишь результат.
Если что вот оно
Огромное спасибо вам за помощь (принцип понял), код проверил, все отлично работает. Переделаю под себя.
using System;using System.Collections.Generic;using System.Linq;using System.Runtime.InteropServices;using System.Text;namespace temp1{ class AOBScan { [DllImport("kernel32.dll")] public static extern IntPtr OpenProcess(ProcessAccessFlags processAccess, bool bInheritHandle, int processId); [Flags] public enum ProcessAccessFlags : uint { All = 0x001F0FFF, Terminate = 0x00000001, CreateThread = 0x00000002, VirtualMemoryOperation = 0x00000008, VirtualMemoryRead = 0x00000010, VirtualMemoryWrite = 0x00000020, DuplicateHandle = 0x00000040, CreateProcess = 0x000000080, SetQuota = 0x00000100, SetInformation = 0x00000200, QueryInformation = 0x00000400, QueryLimitedInformation = 0x00001000, Synchronize = 0x00100000 } //ReadProcessMemory [DllImport("kernel32.dll")] protected static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] buffer, uint size, int lpNumberOfBytesRead); //VirtualQueryEx [DllImport("kernel32.dll")] protected static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, int dwLength); [StructLayout(LayoutKind.Sequential)] protected struct MEMORY_BASIC_INFORMATION { public IntPtr BaseAddress; public IntPtr AllocationBase; public uint AllocationProtect; public uint RegionSize; public uint State; public uint Protect; public uint Type; } protected List<MEMORY_BASIC_INFORMATION> MemoryRegion { get; set; } protected void MemInfo(IntPtr pHandle) { IntPtr Addy = new IntPtr(); while (true) { MEMORY_BASIC_INFORMATION MemInfo = new MEMORY_BASIC_INFORMATION(); int MemDump = VirtualQueryEx(pHandle, Addy, out MemInfo, Marshal.SizeOf(MemInfo)); if (MemDump == 0) break; if ((MemInfo.State & 0x1000) != 0 && (MemInfo.Protect & 0x100) == 0) MemoryRegion.Add(MemInfo); Addy = new IntPtr(MemInfo.BaseAddress.ToInt32() + (int)MemInfo.RegionSize); } } protected IntPtr Scan_withOutMask(byte[] sIn, byte[] sFor) { int[] sBytes = new int[256]; int Pool = 0; int End = sFor.Length - 1; for (int i = 0; i < 256; i++) sBytes[i] = sFor.Length; for (int i = 0; i < End; i++) sBytes[sFor[i]] = End - i; while (Pool <= sIn.Length - sFor.Length) { for (int i = End; sIn[Pool + i] == sFor[i]; i--) if (i == 0) return new IntPtr(Pool); Pool += sBytes[sIn[Pool + End]]; } return IntPtr.Zero; } protected IntPtr Scan_withMask(byte[] sIn, byte[] sFor, bool[] mask) { int[] sBytes = new int[256]; int Pool = 0; int End = sFor.Length - 1; for (int i = 0; i < 256; i++) sBytes[i] = sFor.Length; for (int i = 0; i < End; i++) sBytes[sFor[i]] = End - i; while (Pool <= sIn.Length - sFor.Length) { for (int i = End; equal(sIn[Pool + i], sFor[i], mask, i); i--) if (i == 0) return new IntPtr(Pool); Pool += sBytes[sIn[Pool + End]]; } return IntPtr.Zero; } bool equal(byte sIn, byte sFor, bool[] mask, int maskNumber) { if (mask[maskNumber]) { return true; } else if(sIn == sFor) { return true; } return false; } /// <summary> /// Поиск по байтам. Если маски нету то, там где "mask" пишем null /// </summary> /// <param name="Pattern"></param> /// <param name="mask">Маска или null</param> /// <param name="handle"></param> /// <returns></returns> public IntPtr AobScan(byte[] Pattern, string mask, IntPtr handle) { MemoryRegion = new List<MEMORY_BASIC_INFORMATION>(); MemInfo(handle);//сюда записываем handle процесса if (string.IsNullOrEmpty(mask)) // если маски нету { for (int i = 0; i < MemoryRegion.Count; i++) { byte[] buff = new byte[MemoryRegion[i].RegionSize]; ReadProcessMemory(handle, MemoryRegion[i].BaseAddress, buff, MemoryRegion[i].RegionSize, 0); IntPtr Result = Scan_withOutMask(buff, Pattern); if (Result != IntPtr.Zero) return new IntPtr(MemoryRegion[i].BaseAddress.ToInt32() + Result.ToInt32()); } } else { bool[] maskBool = new bool[mask.Length/2]; for (int i = 0; i <= mask.Length - 2; i += 2) { maskBool[i/2] = mask.Substring(i, 2) == "xx" ? true : false; } for (int i = 0; i < MemoryRegion.Count; i++) { byte[] buff = new byte[MemoryRegion[i].RegionSize]; ReadProcessMemory(handle, MemoryRegion[i].BaseAddress, buff, MemoryRegion[i].RegionSize, 0); IntPtr Result = Scan_withMask(buff, Pattern, maskBool); if (Result != IntPtr.Zero) return new IntPtr(MemoryRegion[i].BaseAddress.ToInt32() + Result.ToInt32()); } } return IntPtr.Zero; } }}
AOBScan aobscan = new AOBScan(); int address; int pID = 4180; IntPtr handle = AOBScan.OpenProcess(AOBScan.ProcessAccessFlags.All, false, pID); address = (int)aobscan.AobScan(new byte[] { 0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x8B, 0x45, 0x08, 0x85, 0xC0, 0x74, 0x0F, 0x50, 0x6A, 0x00, 0xFF, 0x35, 0x08, 0x30, 0x88, 0x76, 0xFF, 0x15, 0x2C, 0x40, 0x88, 0x76, 0x8B, 0x45, 0x0C, 0x85, 0xC0 }, "8Bxxxx8Bxx8Bxxxx85xx74xxxx6AxxFFxxxxxxxxxxFFxxxxxxxxxx8Bxxxx85xx", handle); или address = (int)aobscan.AobScan(new byte[] { 0x8B, 0xFF, 0x55, 0x8B, 0xEC, 0x8B, 0x45, 0x08, 0x85, 0xC0, 0x74, 0x0F, 0x50, 0x6A, 0x00, 0xFF, 0x35, 0x08, 0x30, 0x88, 0x76, 0xFF, 0x15, 0x2C, 0x40, 0x88, 0x76, 0x8B, 0x45, 0x0C, 0x85, 0xC0 }, null, handle); если нету маски
З.Ы. Мне кажется не фига не быстрый это... Хотя особо не проверял
protected int FindPatternKeng(byte[] buffer, byte[] pattern) { if (ProcessСonnection.handle != IntPtr.Zero) { var counter = 0; if (pattern.Length <= buffer.Length) { for (var i = 0; i < (buffer.Length); i++) { if (buffer[i] == pattern[0] | pattern[0] == 0xFF) { for (var j = 0; j < pattern.Length && i + j < buffer.Length; j++) { if (buffer[(i + j)] == pattern[j] | pattern[j] == 0xFF) { counter++; if (counter == pattern.Length) { var result = i; return result; } } else { counter = 0; } } } } } } return 0; }
protected IntPtr Scan(byte[] sIn, byte[] sFor) { int[] sBytes = new int[256]; int Pool = 0; int End = sFor.Length - 1; for (int i = 0; i < 256; i++) sBytes[i] = sFor.Length; for (int i = 0; i < End; i++) sBytes[sFor[i]] = End - i; while (Pool <= sIn.Length - sFor.Length) { for (int i = End; sIn[Pool + i] == sFor[i]; i--)// if (i == 0) return new IntPtr(Pool); Pool += sBytes[sIn[Pool + End]]; } return IntPtr.Zero; }
-
http://pastebin.com/wmBT5QWTХорошо было бы ещё исходник дать ...
Привет. Спасибо за ответ. Но к сожалению, я так и не понял вашу идею полностью.Привет
Думаю все просто
Address = (int)aobscan.AobScan(new byte[] { 0x00, 0x8B, 0x4A, 0x24, 0x85, 0xC0, 0x0F, 0x84 }, "xx?x?xxx", handle); // "xx?x?xxx" это маскаpublic IntPtr AobScan(byte[] Pattern, string mask, IntPtr handle){ ... IntPtr Result = Scan(buff, Patternб mask); //Передаем маску ...}protected IntPtr Scan(byte[] sIn, byte[] sFor, string mask){ //for (int i = End; sIn[Pool + i] == sFor[i]; i--) тут булеан выводим в отдельный метод. for (int i = End; equal(sIn[Pool + i], sFor[i], mask, i); i--) // как то так.}bool equal(byte sIn, byte sFor, string mask, int maskNumber){ Дальше я думаю сообразишь, если нет то попробую помочь дальше, просто времени мало}
Я пытался модернизировать код таким способом:
protected IntPtr Scan(byte[] sIn, byte[] sFor){int[] sBytes = new int[256]; int Pool = 0;int End = sFor.Length - 1;for (int i = 0; i < 256; i++)sBytes[i] = sFor.Length;for (int i = 0; i < End; i++)sBytes[sFor[i]] = End - i;while (Pool <= sIn.Length - sFor.Length){for (int i = End; sIn[Pool + i] == sFor[i] | sFor[i] == 0xFF; i--)// Если (смещение + длина сигнатуры равна i-евому байту сигнатуры) или (i-евый байт сигнатуры равен -1),то цикл вычитаетсяif (i == 0) return new IntPtr(Pool);Pool += sBytes[sIn[Pool + End]];}return IntPtr.Zero;}
Но сигнатуру таким способом не находит. Я пробовал и копаться в откладчике c#, но так и не понял в чем проблема.
NullAlex: Любой код должен быть обрамлен тегом кода. Это неизменное правило не только нашего форума, но и всех остальных. Подробнее - в FAQ
-
Всем привет. Возможно кто-нибудь уже видел этот сканер сигнатур, реализованный на си шарпе.
В нем используется алгоритм Boyer–Moore–Horspool и он сканирует весь процесс.
Ссылка на википедию: https://en.wikipedia.org/wiki/Boyer–Moore–Horspool_algorithm
За счет этого алгоритма, этот сканер сигнатур работает довольно шустро.
Я очень много времени уделил на гугл (поиск сканера сигнатур на c#), пересмотрел большое количество видеоуроков и разобрал множество реализаций (поиск по модулям, поиск всего процесса и т. д.). И этот сканер сигнатур оказался самый быстрый и мощный.
В чем проблема: Хотелось бы добавить к этому сканеру функцию FindPattern (поиск сигнатуры с "неопределенными" байтами(опкодами). Пример: 8B 0C ?? ?? 3A 00 21 ??).
Вот сама функция сравнения сигнатуры с буффером (вот тут нужно, что-то изменить, чтобы сделать FindPattern).
byte[] sIn - это буффер для поиска.
byte[] sFor - это сигнатура.
Сколько бы я не пробовал, дополнить сканер этой функцией у меня не получается. Я очень был бы признателен, если кто-нибудь поможет мне разобраться с этим.
Вызывать функцию поиска сигнатуры вот так:
Вывести найденный адрес, можно в label:label1.Text = string.Format("0x{0:X6}", Address);
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Windows.Forms;using System.Diagnostics;using System.Runtime.InteropServices;namespace HackMemory //Название вашего проекта!!!{public class AOBScan{//ReadProcessMemory[DllImport("kernel32.dll")]protected static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] buffer, uint size, int lpNumberOfBytesRead);//VirtualQueryEx[DllImport("kernel32.dll")]protected static extern int VirtualQueryEx(IntPtr hProcess, IntPtr lpAddress, out MEMORY_BASIC_INFORMATION lpBuffer, int dwLength);[StructLayout(LayoutKind.Sequential)]protected struct MEMORY_BASIC_INFORMATION{public IntPtr BaseAddress;public IntPtr AllocationBase;public uint AllocationProtect;public uint RegionSize;public uint State;public uint Protect;public uint Type;}protected List MemoryRegion { get; set; } protected void MemInfo(IntPtr pHandle){IntPtr Addy = new IntPtr();while (true){MEMORY_BASIC_INFORMATION MemInfo = new MEMORY_BASIC_INFORMATION();int MemDump = VirtualQueryEx(pHandle, Addy, out MemInfo, Marshal.SizeOf(MemInfo));if (MemDump == 0) break;if ((MemInfo.State & 0x1000) != 0 && (MemInfo.Protect & 0x100) == 0)MemoryRegion.Add(MemInfo);Addy = new IntPtr(MemInfo.BaseAddress.ToInt32() + (int)MemInfo.RegionSize);}} protected IntPtr Scan(byte[] sIn, byte[] sFor){int[] sBytes = new int[256]; int Pool = 0;int End = sFor.Length - 1;for (int i = 0; i < 256; i++)sBytes[i] = sFor.Length;for (int i = 0; i < End; i++)sBytes[sFor[i]] = End - i;while (Pool <= sIn.Length - sFor.Length){for (int i = End; sIn[Pool + i] == sFor[i]; i--)if (i == 0) return new IntPtr(Pool);Pool += sBytes[sIn[Pool + End]];}return IntPtr.Zero;} public IntPtr AobScan(byte[] Pattern, IntPtr handle){MemoryRegion = new List();MemInfo(handle);//сюда записываем handle процессаfor (int i = 0; i < MemoryRegion.Count; i++){byte[] buff = new byte[MemoryRegion[i].RegionSize];ReadProcessMemory(handle, MemoryRegion[i].BaseAddress, buff, MemoryRegion[i].RegionSize, 0);IntPtr Result = Scan(buff, Pattern);if (Result != IntPtr.Zero)return new IntPtr(MemoryRegion[i].BaseAddress.ToInt32() + Result.ToInt32());}return IntPtr.Zero;}}}
protected IntPtr Scan(byte[] sIn, byte[] sFor){int[] sBytes = new int[256]; int Pool = 0;int End = sFor.Length - 1;for (int i = 0; i < 256; i++)sBytes[i] = sFor.Length;for (int i = 0; i < End; i++)sBytes[sFor[i]] = End - i;while (Pool <= sIn.Length - sFor.Length){for (int i = End; sIn[Pool + i] == sFor[i]; i--)if (i == 0) return new IntPtr(Pool);Pool += sBytes[sIn[Pool + End]];}return IntPtr.Zero;}
AOBScan aobscan = new AOBScan(); [color=#008000]//ссылка на класс[/color]int Address; [color=#008000]//найденный адрес[/color]int pID = 666; [color=#008000]//индификатор процесса[/color] IntPtr handle = OpenProcess(0x001F0FFF, false, pID);Address = (int)aobscan.AobScan(new byte[] { 0x00, 0x8B, 0x4A, 0x24, 0x85, 0xC0, 0x0F, 0x84 }, handle);
- 1
Aimbot для 2D игры [help]
in Вопросы по взлому браузерных игр
Опубликовано
А вобще нашел метод, относительно языка flash (ActionScript), который переводит координаты, с помощью функции
globalToLocal
Но эта функция, работает в среде flash.
Встал в тупик(