Перейти к содержанию

MasterGH

Ветераны
  • Постов

    2 999
  • Зарегистрирован

  • Победитель дней

    129

Весь контент MasterGH

  1. Речь об адресе модуля "t3d.pyd". Нет смысла брать адрес этого модуля из CE чтобы использовать в трейнере на Дельфи, потому что он (адрес модуля "t3d.pyd") меняется. Поэтому я автору и дал варианты запроса ImageBase модуля в поисковике. Да и на форуме тоже где-то есть, если не удалили с чисткой тем.
  2. Адрес можно получить из CE. Но его использовать в Дельфи трейнерах нельзя, т.к. он будет меняться.
  3. function Cheat0() autoAssemble([[ написать автоассемблерный код ]]) end loc frmTrainer = createForm() loc btn0 = createButton(frmTrainer) btn0.OnClick = Cheat0
  4. Ищите в поисковике по одному из вариантов "Delphi Image base", "Delphi dll Image base", "Delphi dll get Image base"
  5. Если запала клавиша, то надо разбирать и чинить. При этом возможно ничего не получиться или сделаешь хуже.
  6. Для тех кому интересны подробности. Сначала я еле разобрал этот планшет.Т.к. у меня нет и не было привычки стукать такие дорогие вещи об пол. Шлейфы проверил. Надавливал на контакты. Без толку. Искал решение в Интернете. Спешил. Ничего не нашел. Уже час или больше прошло. Ничего не получалось. Инстинктивно, на эмоциях захотелось просто его стукнуть об пол слегка ребром ближе к артефактной полоске. Я не знаю почему, но именно ребром захотелось. Может быть потому, что упал в прошлый раз четко ребром. Включил дисплей нет результата. Тут я понял, что все. Планшет накрылся. Показывает плохо (большая полоска артефактная, рябь при увеличении яркости, цвет как 8-ми битный). Ничего не помогает. Выключил дисплей. Нервы сдавали и другим ребром стукнул уже значительно сильнее об пол. Я еще при этом кое-что сказал, но писать не буду об этом. Заработал )) Так все и было. Прямо как в кино. Ощущение необычное. Будто тебе подарили старый работающий планшет. Уже с ним распрощался десять раз. Работает в данный момент. Все нормально.
  7. Способ как убрать с планшета после падения вертикальную полосу, рябь и изменение цвета. Вертикальная полоса была ближе к левому ребру. Если не жалко планшет, истек срок гарантии и не знаете что делать, то можно попробовать мой способ. Возможно сработает. Берем вертикально двумя руками планшет во включенном состоянии, но с выключенным дисплеем и аккуратно примерно с той же силой падения стукаем также об пол ребром, которое находится дальше от вертикальной полосы. После чего словно по волшебству полоса исчезла. Рябь пропала. Цвет восстановился. Т.е. все стало как раньше работать. Сколько времени будет работать планшет не знаю, посмотрим. Сегодня такой способ испробовал случайно. Повторю. Делать это только если планшет не жалко раздолбать. У меня три планшета, поэтому было все равно.
  8. По третьей ссылке из поста2 (внутри темы). Там же есть кусок примера как рисуются разным цветом объекты на разной дистанции (близкие, далекие, очень далекие враги). Если тебе цвет разный не устраивает по дистанции, то можешь копать инфу по шейдерам. Именно в них задается опция общего освещения у данной фигуры(модели) и какого цвета она будет, и многое другое. Еще есть много форумов по игрострою на русском языке. Вот пример можешь там спросить.
  9. void SetModelColor(LPDIRECT3DDEVICE9 pDevice, float r, float g, float b, float a, float glowr, float glowg, float glowb, float glowa) { float lightValues[4] = {r, g, b, a}; float glowValues[4] = {glowr, glowg, glowb, glowa}; pDevice->SetPixelShaderConstantF(1, lightValues, 1); pDevice->SetPixelShaderConstantF(3, glowValues, 1); } Links: 1, 2, 3
  10. Покупаешь любые три гранаты одного типа и ищешь как сигну байт 01 01 01. Найдешь много адресов. Кидаешь например вторую и ищешь "01 00 01". Потом покупаешь вторую и ищешь опять " 01 01 01". Находишь адрес. Лезешь в память. Ищешь там рядом еще три байта. Вот и получишь 6 гранат - 6 адресов по 1 байту. Добавляешь в CE и морозишь на 01. Это будет работать на одном уровне. Каждый раз конечно запарит искать. Еще есть скрипт, который я дал для CE на не уменьшающиеся гранаты. Я не тестил на разных версиях игры. Так что можешь потестить еще раз и отпишись какая версия игры и работает или не работает. Вроде должна работать на всех.
  11. Тебе будет значительно легче, если ты будешь знать Unity3D и на нём сначала отработаешь бота. А затем инжектируюя .net модуль уже в саму игру. Объекты GameObject(контейнеры) искать по tag, имени, положению в иерархии объектов. Компоненты контейнера искать по типу. Поля и функции искать по C#-функциями. Читать поля, вызывать функции по C#-функциям. Но, даже если ты найдешь все объекты (своего персонажа, чужих), все компоненты объектов, поля, функции и прочее. То как уже писал автор, все расчеты на серваке. Если автору игры верить, то рейкаст из точки выстрела в точку попадания в персонажа рассчитается на сервере. Тогда ты сможешь только искать GOs своего и чужих персонажей, искать компонент Transform, из него координаты, а отправлять только оси мышки, клавиши мышки, клавиши клавиатуры. Может быть непросто рассчитать оси мышки, чтобы подменить их (добавить дельту) так, чтоб прицел попал в голову, учитывая динамичность игры. Хотя возможно. Также забыл, написать. Чтобы найти чтение осей мышки и класс Input, тебе надо декомпилировать одну из .net .dll в папке с игрой. Через поиск найти. Когда напишешь свой скрипт, тебе придется либо добавлять дельту, либо подменять чужой компонент контроллера своим. Контроллер - компонент управления каким-то объектом. Еще обращу внимание. Я считаю, что если игровой движок хорошо знаешь и он у тебя есть, то это дает очень большие шансы, чтобы сделать в игре сделанной на этом движке, любую модификацию.
  12. Зачем тебе надо две гранаты? О поиске адресов гранат было подробно разобрано в моем посте. У тебя получилось исследовать вопрос со скриптом и фильтрами, чтобы в игре были все гранты при активации? У меня не получилось. Инструкции гранат работают с большим количеством адресов, фильтры у меня найти не получилось.
  13. Указатели я бы искал через два трейслога. 1. Ищешь адрес ХП 2. Ищешь инструкцию1 на зпись ХП, которые срабатывают один раз при уроне 3. Трейслог1 из глубины вверх от инструкции1 например на 5К инструкций до верхнего выхода из call 4. Дальше по трейс логу в глубину смотришь дизассемблер и ставишь на узлы F5, и смотришь чтобы не прерывалась игра. Как начала прерываться, то делаешь трейслог 2 уже с вхождением в глубину, сбора стека на 10К инструкции(или более) с условием прерывания на EIP==0xинструкции1 Ну дальше по трейслогу 2 составляешь указатель до статического адреса, правда не факт, что он будет. Может быть и так, что есть динамический список с указателями на структуры. Структуры могут иметь отличия между собой в данных. Может быть функция, которая по этому списку будет перебирать по отличиям определенные объекты. Например, функция может искать указатель на структуру по типу класса GameObjectsFindWithType<Type>(), а может проверить твой игрок это или чужой по строке GameObjectsFindWithTag(string tag) или числу... Все, что может быть у тебя это статический указатель на динамический список, а структуры в нем могут тасоваться как угодно. [[[статический адрес дин. списка]+N*0x4]+0x6c] = XP где N случайное Во всяком случае, предсказать что-то сложно. Надо садиться, да и искать
  14. Anomaly - Warzone Earth тема. Разбирали недавно. Мастер скрипт + другие.
  15. Там где видишь cmp там и есть так называемый "фильтр". Мне не известно как автор скрипта сделал этот фильтр. По скрипту не поймешь, надо сравнивать структуры. Сравнение структур в этой теме Как найти идентификатор игрока ( ID players ) [ENABLE]alloc(newmem,512)label(returnhere)label(exit) aobscan(aob_BaseCode, 89 11 8B 50 04 89 ?? ?? B9 ?? ?? ?? ?? 39 ?? ?? 7C 6A)// только автору известно, почему сигнатура такая длинная. Возможно автор экспериментировал или решил подстраховаться и вручную добавил сигнатуру. Знаки вопроса означают, что байт могут быть любыми.label(BaseCode)registersymbol(BaseCode)//регистрировать метку BaseCode нужно чтобы запомнить адрес сигнатуры. Для этого надо распожоложить BaseCode под меткой aob_BaseCode и при деактивации скрипта использовать BaseCode (смотри метку aob_BaseCode и под ней BaseCode). Этот способ придумал DarkByte автор Cheat Engine. Ну или кто-то из его окружения. Почему именно так? Я не знаю. Просто так и все. globalalloc(t_GodMode,4)// Я тоже не знаю, зачем выделять лишнюю память. Вместо globalalloc можно было написать две строки label(t_GodMode) и registersymbol(t_GodMode). Был бы тот же самый эффект. Наверно, автор решил, что ему так удобнее. Т.к. метки сами регистрируются и возможно эти метки никогда не удалятся.globalalloc(t_InfAbility,4)//аналогичноglobalalloc(t_InfMoney,4)//аналогичноlabel(GodMode1)label(GodMode2)label(InfAbility)label(InfMoney) t_GodMode:dd 0// это начало нового куска памятиt_InfAbility:dd 0// это начало еще одного нового куска памятиt_InfMoney:dd 0// это начало и еще одного нового куска памяти (похоже памяти так много, что совсем пофиг на неё) newmem:mov [ecx],edx // под newmem начался код инъекции для этого скрипта, другие скрипты не видят newmem. Данная инструкция необходима как часть оригинального кода, который затерли чтобы игра не вылетела. AOB сигна тут совсем не причем. GodMode1:cmp [t_GodMode],1//тут на сколько я понял сравнивается значение в зарегистрированной метке с единицей (изначально у нас 0, после включения под скрипта №3-один)jne InfAbility//не прыгаем если равно единицеcmp edi,00000001//сравниваем регистр инструкции mov [ecx],edx с единицейjne InfAbility//не прыгаем если равно единицеcmp [ecx+04],00000003//сравниваем значение лежащее по смещению с тройкойjne InfAbility//не прыгаем если равно трёмpush esi//загружаем регистрmov esi,[ecx+08]//кладём в загруженный регистр указатель по смещению [ecx+8]cmp [esi+10],00005048 //"HP"// в моём понимании это что-то вроде фильтра первичного для жизней юнитов отряда игрокаpop esi//восстанавливаем регистрjne InfAbility//не прыгаем если равно 5048push esi//загружаем регистрmov esi,[ecx-0C]//не совсем, но я понимаю что это делается и всё же думаю что лучше бы это дело мне объяснить=)cmp [esi+10],65726966 //"fire"Active (You)//сравниваем с неким числом лежащим в указателе по смещению [ecx-C], но вот от куда это число берётся я так и не понялpop esi//восстанавливаем регистрjne GodMode2//не прыгаем если равно 65726966mov [ecx],(float)999//устанавливаем нужное кол-во жизней GodMode2:push esi//ну это понятно, дальше я буду пропускать эти строкиmov esi,[ecx-0C]//опять же то что я не совсем понимаю, но по сути мы кладём опять же указатель лежащий по смещению [ecx-C] в регистрcmp [esi+10],72677075 //"upgr"adeLevel (Squad)//сравниваем значение лежащее в указателе [ecx-C] по смещению [esi+10]pop esijne InfAbility//далее писать про эти строки я не будуmov [ecx],(float)999//опять же записываем нужное значение здоровья, но для меня не понятно зачем было это делать 2 раза и в таком виде, да и ещё используя аж 3 фильтра InfAbility:cmp [t_InfAbility],1//про это я тоже писать больше не буду и так всё ясноjne InfMoneycmp edi,00000009//сравниваем регистр со значением 9jne InfMoneycmp [ecx+04],00000003//сравниваем значение лежащее по смещению с тройкойjne InfMoneypush esimov esi,[ecx+08]//кладём указатель лежащий по смещению [ecx+8] в регистрcmp [esi+10],72616863 //"char"ges//ещё 1 фильтрpop esijne InfMoneymov [ecx],(float)99//записываем нужное кол-во расходников InfMoney:cmp [t_InfMoney],1jne exitcmp edi,00000001//опять же сравниваем регистр с единицейjne exitcmp [ecx+04],00000003//значение лежащее по смещению [ecx+4] сравниваем с тройкойjne exitpush esimov esi,[ecx+08]//аналогично как было и вышеcmp [esi+10],6F736572 //"reso"urces//ещё фильтpop esijne exitmov [ecx],(float)9999//устанавливаем нужное кол-во денег exit:mov edx,[eax+04]//вторая оригинальная инструкция идущая по кодуjmp returnhere aob_BaseCode:BaseCode:jmp newmem// Как я уже писал aob_BaseCode - это метка сигны. Если поставить под метку другую метку, то нижняя метка копирует адрес под верхней. aob_BaseCode нельзя зарегистрировать чтобы она была доступна под [DISABLE] секцией. Но можно зарегистрировать BaseCode и тогда BaseCode будет доступна под [DISABLE]returnhere:[DISABLE]BaseCode:mov [ecx],edxmov edx,[eax+04]//выполняем оригинальный кодdealloc(newmem)//удаляем выделенную памятьunregistersymbol(BaseCode)//снимаем регистрацию с метки
  16. globalalloc можно выделить один раз. Если она будет повторно срабатывать, то память не будет выделяться по новым адресам. dealloc уже не поможет очистить память по этой метке. Вроде так. globalalloc на моей памяти практически не используется на форуме CE. Если метку надо зарегистировать без выделения памяти, то на это есть registersymbol. Я не очень люблю "мастер-скрипты". У них одна и та же проблема. Заставлять пользователя активировать скрипт один раз, а потом уже работать с другими скриптами. Я за вариант таких инъекций, которые меняют одну сигнатуру кода на другую без выделения памяти. Т.е. без так называемых "мастер-скриптов". Или же с выделением памяти, но опять же без мастер-скриптов. Просто так быстрее и удобнее.
  17. Кстати, да можно в пошаговой отладке пройтись по скрипту. Когда смотришь на регистры и как они меняются, то легче разобрать инструкции. Даже можешь по справочникам не лазить.
  18. Код довольно большой чтобы построчно его комментировать. 1) aobscan - находит адрес инструкции кода по сигнатуре "89 11 8B 50 04 89 ?? ?? B9 ?? ?? ?? ?? 39 ?? ?? 7C 6A" 2) alloc(newmem,512) - выделяет участок памяти в 512 байт под меткой newmem. Будет на самом деле больше 512 байт, т.к. кратно размеру страницы памяти. 3) BaseCode - метка для для активации и деактиваци, запоминает адрес найденной сигнатуры 4) globalalloc это выделение памяти так же как и alloc, но с регистрацией метки. Можно использовать в других скриптах эту метку. Но я бы не стал писать globalalloc, т.к. много места остается пустым. У каждого автора скрипта могут быть свои причины почему они так написали. 5) [ENABLE] и [DISABLE] Для активации и деактивации. В случае скрипта записываются ноль или единица по меткам из globalalloc 6) ассемблерные инструкции есть в справочниках Могу посоветовать почитать: Ассемблерные инструкции: ссылка на тему CE Autoassembler Engine: ссылка на тему Курс для новичков: ссылка на тему Справка Cheat Engine Autoassembler: ссылка Лучше все воспринимается, когда начинаешь писать скрипты меньших размеров. Большие готовые скрипты, тяжело подходят для того, чтобы сразу в них разобраться.
  19. Кенг, ты молодец. Огромная благодарность за твой труд. Я не имел ввиду "что стоит тебе лично второй и более раз ответить на одно и тоже". Я даже сам бы не решился тратить на это свое время. Ну раз, два... по настроению. Я имел ввиду другое "Можно ли дать возможность писать повторные вопросы и можно ли дать возможность просить готовые ответы?" Мы же разрешили ломать онлайн игры, переступили через это. Мы же разрешили разделы Заказы на взлом (на готовое) Может быть, можно и это позволить - вопросы с получением готовых ответов и повторные вопросы. Это не обязывает помогать. Только по желанию. Не хочешь, ну и не надо. А вот у меня например, будет обалденное настроение и я захочу помочь. Зачем пользователя человека носом в поиск, давай я сделаю или кто-то другой. Вот я про что.
  20. Можете позволить задавать вопросы на одни и те же темы? Можете позволить пользователям просить готовый ответ на вопрос, который обсуждался ? Что вам стоит? Не хотите готовый ответ давать, подскажите чем можете. Зачем заставлять пользователя самому учиться, самому искать... ну не хочет он никак, ну никак. Найдутся, те кто пожелает помочь от интереса. Ну оставьте вы в покое их. Вот о чем я говорю. А админ ему стрелу "забивает", потому что спровоцированный на минусах ДП обзывается и наезжает Ну? Реально ))) Я могу быть и не прав. Я изложил свою точку зрения. Прошу не считать меня неадекватном, что-то не хочется -1К в репу и на премодерацию ))
  21. На русскоязычном форуме Юнити разработчик этой игры написал, что там авторитарный протокол и все расчеты на сервере. Он не уточнял какие расчеты на клиенте и какие на сервере. Но мне кажется на сервер отправляются данные ввода от клавы и мышки. Положения и попадания по коллизиям вычисляются на сервере. Наверно, все что можно это отправлять оси "X,Y мышки" и нажатие на кнопки. float h = horizontalSpeed * Input.GetAxis("Mouse X"); float v = verticalSpeed * Input.GetAxis("Mouse Y"); Но их надо рассчитывать лучше чем это делает мозг глядя на экран монитора и двигая рукой мышку... А поскольку игра написана на Unity3d и все API доступны, то собрать .net модуль с отправкой осей мышки и её кнопок. Тот же рейкаст гораздо удобнее делать C# и функциям движка, там несколько строчек кода. Дистанция: Vector3.Distance Направление вектора: отнять дальний вектор позиции от текущего вектора позиции var heading = target.position - player.position;О том как внедрять код .net сборки я писал здесь (Внедряем свою dll-ку в игру на Unity3D с помощью CE AA). Ты уж извиняй, что готового кода нет и ломать нет желания Помог чем смог, да и то, моя инфа настолько простая, в качестве мелкого демо по работе игр на движке Unity3d.
  22. Педро подкидывает вопросы о взломе игр и хоть как-то тормшит форум, чтобы отвечали на вопросы. Потом Бромвол, который показал классный способ выкидывать оружие по id. Я так не умею. Ладно, раз так решили, то администрации виднее. Не могу же я кого-то заставить не обзывать, других не провоцировать, третьих извиниться. В общем мне жаль, что нельзя как-то найти общий язык.
  23. Я думаю, что причина в следующем: 1. Частые, короткие вопросы со стороны пользователя 2. Упреки за частые вопросы со стороны отвечающих 3. Неполные решения и неготовые ответы со стороны отвечающих Предложения с моей стороны: 1. Разрешить задавать частые и короткие вопросы пользователям 2. Оставить и запретить упреки, что пользователь не включает мозг, сам ничего не делает и прочее 3. Неготовые ответы - это форма добровольная. Кто как хочет, тот так и отвечает. Тоже самое и про формулировку вопросов. Как хочет, так и задает вопрос. Но в рамках правил форума. Поскольку все друг друга провоцировали на агрессивное поведение, то виноваты в провокациях. Ну и дисциплины бы всем, да побольше
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.