Dison Опубликовано 23 июля, 2015 Поделиться Опубликовано 23 июля, 2015 Сам вопрос на скрине... Возможно ли сделать так? Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 23 июля, 2015 Поделиться Опубликовано 23 июля, 2015 приблизительно так:push rbx // сохраняем регистр на всякий случайmov rbx,[rdx+18] // считываем из основной структуры указатель на внутреннююmov rbx,[rbx+28] // считываем из внутренней стркутуры максимальное количество патроновmov [rdx+8],rbx // присваиваем текущему значению максимальноеpop rbx // восстанавливаем регистр Ссылка на комментарий Поделиться на другие сайты Поделиться
Dison Опубликовано 23 июля, 2015 Автор Поделиться Опубликовано 23 июля, 2015 Для большей наглядности Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 23 июля, 2015 Поделиться Опубликовано 23 июля, 2015 Привет! Вполне возможно. Берешь свободный регистр и идешь читать справку об инструкции lea. Алгоритм будет примерно такой (допустим, мы инжектимся в инструкцию, отнимающую патроны): 0. Сохраняем регистр на стеке1. Загружаем в него нашу структуру+0х18 - указатель на "подструктуру"2. Загружаем в него же его значение + 0х28 - максимальное значение патронов3. Сравниваем его с текущим значением4. Если равно, то5. Возвращаем регистр из стека на место6. Выходим7. Иначе делаем с патронами то, что нам нужно (например, увеличиваем)8. Возвращаем регистр из стека на место9. Выходим. pushleamovcmpjepopretaddpopret Примерно так. UPD: А, я плохо прочитал. Да, лучше использовать тупо mov, но про lea тоже советую почитать. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 23 июля, 2015 Поделиться Опубликовано 23 июля, 2015 Поправил скрипт в своем предыдущем посте. Хотя в данном конкретном случае можно сделать еще прощеmov rax,[rdx+18]mov rax,[rax+28]mov [rdx+8],raxПоскольку ты используешь инструкцию, которая записывает подготовленное число патронов в текущее значение (в памяти), то можно сразу в регистр считать нужное значение из внутренней стркутуры. Опять же, именно такой подход актуален только для пишушей инстркуции. Для читающей инструкции правильнее будет использовать скрипт подобный тому, что я выше привел. Ссылка на комментарий Поделиться на другие сайты Поделиться
Garik66 Опубликовано 23 июля, 2015 Поделиться Опубликовано 23 июля, 2015 Xipho, у тебя в посте № 2 опечатка, поправь, а то новички запутаются:нужно не mov rbx,[rdx+28] // считываем из внутренней структуры максимальное количество патроноваmov rbx,[rbx+28] // считываем из внутренней структуры максимальное количество патронов 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 23 июля, 2015 Поделиться Опубликовано 23 июля, 2015 А я в последнее время предпочитаю не искать фильтры в структурах, стеках, регистрах. Вместо этого ищу часто обращаемые инструкции, которые работают только с данными одной структуры, а с другими не работают. Возьмем к примеру зацепку за GUI интефрейс показывающего количество здоровья. Код читает здоровье нашего персонажа и не читает другие, и происходит это очень часто. Вот и фильтр искать не надо в структурах, когда делаешь чит на здоровье. А если надо делать one hit kill, то вытащить поинтер на структуру из инструкции работающей с гуи и сравнивать по нему. Не придется искать фильтров в структурах. Хотя, конечно, это интересно, но не факт, что отличия между структурами могут быть фильтрами всегда и везде. Вариант с гуи имеет большую вероятность на работоспособность. Еще один момент. В разных версия игр смещения от начала структуры могут меняться и их использовать в качестве фильтра из другой игры нельзя будет. На моей памяти несколько было таких игр. Но опять же все зависит от игры, как в ней и что будет предсказать сложно. 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Dison Опубликовано 23 июля, 2015 Автор Поделиться Опубликовано 23 июля, 2015 (изменено) Дело в том, что инструкция с адреса при установке бряка показывает до 1000 адресов. А если отталкиваться от поинтера та-же беда.С фильтрами там если только от поинтера отталкиваться Сейчас попробую выше перечисленные варианты...Не кодированное выяснилНо в написании скрипта всеравно проблема пока Изменено 23 июля, 2015 пользователем Dison Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 23 июля, 2015 Поделиться Опубликовано 23 июля, 2015 у тебя в посте № 2 опечатка,Поправил, спасибо )Возьмем к примеру зацепку за GUI интефрейс показывающего количество здоровья. Код читает здоровье нашего персонажа и не читает другие, и происходит это очень часто. Вот и фильтр искать не надо в структурах, когда делаешь чит на здоровье.Это называется Staple Intersection, и у меня будет урок о ней обязательно ) Да, это самый действенный способ, но код анализировать приходится больше и дольше. Ссылка на комментарий Поделиться на другие сайты Поделиться
Korol2010 Опубликовано 26 июля, 2015 Поделиться Опубликовано 26 июля, 2015 (изменено) Зато когда нет фильтра в обычном виде, будет лучше использовать Staple Intersection, и хрен с ним что придётся много кода анализировать)) Я к стате очень жду по этой теме урок, а то мне это было очень нужно несколько раз, а как это делается я не знаю. Да, и ещё на мой взгляд нужно будет делать урок по поиску экранных значений для способа Staple Intersection, т.к. на сколько я понял из скудной информации про этот способ на русском языке, там нужно будет обращаться к инструкции которая работает с каким либо экранным значением. Изменено 26 июля, 2015 пользователем Korol2010 Ссылка на комментарий Поделиться на другие сайты Поделиться
keng Опубликовано 27 июля, 2015 Поделиться Опубликовано 27 июля, 2015 Staple intersection нужно делать очень аккуратно и правильно, иначе работать оно будет крайне нестабильно. Самый надежный вариант - это отреверсить код и делать статические инъекции (без сигнатур и без динамического выделения памяти под инъекцию) для каждой версии игры. Лучше всего, конечно, для официальной. Большинство людей ныне на это забивают, вот и выпускают некачественные релизы. Ссылка на комментарий Поделиться на другие сайты Поделиться
Xipho Опубликовано 27 июля, 2015 Поделиться Опубликовано 27 июля, 2015 У меня как-то в игре PsiOps возникла проблема со статической инъекцией. На каком-то из уровней игра вдруг стала использовать место, куда я делал инжект, и игра вылетала с трейнером, разумеется. С тех пор предпочитаю выделять память для инъекции динамически. По крайней мере, гарантированно игра это место вдруг использовать не захочет ) Ссылка на комментарий Поделиться на другие сайты Поделиться
MasterGH Опубликовано 27 июля, 2015 Поделиться Опубликовано 27 июля, 2015 Зато когда нет фильтра в обычном виде, будет лучше использовать Staple Intersection, и хрен с ним что придётся много кода анализировать)) Я к стате очень жду по этой теме урок, а то мне это было очень нужно несколько раз, а как это делается я не знаю. Да, и ещё на мой взгляд нужно будет делать урок по поиску экранных значений для способа Staple Intersection, т.к. на сколько я понял из скудной информации про этот способ на русском языке, там нужно будет обращаться к инструкции которая работает с каким либо экранным значением. Ну, вот пример взятия поинтера ecx из инструкции, которая работает с нашим персом// Здесь сохраняем ecx из инструкции чтения, который работает со скоростью постройки нашего персонажа, предположительно из гуи (когда в игру заходим, но ни че не делаем там. Инструкция часто обращаемая)00400314 8B4124 mov eax,[ecx+0x24] jump from staple intersection, original code00400317 890D70034000 mov [0x400370],ecx move staple intersection pointer to 400370 to be compare later. our code0040031d C3 retn get back to call opcodeВот сравнение по поинтеру// Здесь код работает с нашими строениями и с чужими. Сравнием по 0x400370, где 400370 некоторый свободный адрес (но лучше из выделенной памяти брать)0040031e 393570034000 cmp [0x400370],esi compare write pointer with our staple intersection pointer00400324 740D je short 0x00400333 if equal go to 40033300400326 8B5624 mov edx,[esi+0x24] if not equal, recreate original code00400329 03D0 add edx,eax recreate original code0040032b 895624 mov [esi+0x24],edx recreate original code0040032e E9578B0B00 jmp 0x004B8E8A jump back to normal next write opcode00400333 BA36000000 mov edx,0x36 move 36 (hex) = 54 (dec) into edx00400338 EBF1 jmp short 0x0040032Bgo to 40032BЭто и есть staple intersection Мы некоторый регистр1 (ecx) из 00400314 8B4124 mov eax,[ecx+0x24], с которым работает только наш персонаж, сравниваемс некоторым регистром2 (esi) из 00400326 8B5624 mov edx,[esi+0x24], с которым работают как боты так и наш персонаж. Т.е. вытащили поинтер на структуру из инструкции ГУИ и сравниваем по нему...Логичный вопрос, почему бы в инструкцию 00400314 8B4124 mov eax,[ecx+0x24] сразу не делать чит, не вытаскивая никаких поинтеров. Но автор, наверно, школьник и сконцентрировался на создании бесконечного строения через сравнение поинтера в инструкции, которая используется как ботами, так и своим игроком. Источник : статья из темы на форуме CE Ссылка на комментарий Поделиться на другие сайты Поделиться
Korol2010 Опубликовано 28 июля, 2015 Поделиться Опубликовано 28 июля, 2015 Возможно он школьник, но он по крайней мере знает про этот способ хоть что-то, а я ничего)) К стате то что ты расписал из этого я уже кое что понял, но всё же увидеть урок профи на эту тему будет не лишним. Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения