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

Жажда Знаний

Пользователи
  • Постов

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

  • Посещение

Сообщения, опубликованные Жажда Знаний

  1. У меня есть Вопрос. Можно ли стековое значение применять как фильтр свой/чужой ? Как стековое значение Правильно записывать в скрипт и как записать стековое значение если значение находится в многоуровневом указателе, Записывать его в оригинале или как то реструктуризововать ? Можно ли Сделать свой  фильтр   свой/чужой не меняя все поле структуры написанием 2мя разветленными фильтрами, сначала отталкиваясь от оригинального значения затем вписывая свое значение, Возможно ли такое ? 

  2. Или через FPU-инструкции, или же тупо через mov, но переведи руками float в decimal.

    Написал через Mov

    mov [esp+14],#20 // урон mov [esp+24],#6  // уронmov esi,[esp+14]mov esi,[esp+24]mov [ebp-34],esifild dword ptr [ebp-34]jmp return
    Но Можно написать это как то покрасивей ? Например с динамической сменой урона,Удар- увеличилось , Удар- поменьше урон
     
    ARM4ND0: С тегом кода стало покрасивее. :)
  3. PS2-темы лучше перенести в раздел взлома эмуляторных игр. Я сам не знаю, насколько сильно отличаются консоли от PC, предположу, что не очень. По поводу смены уровня - или находится нечто, что меняется только с уровнем, или же обычное "изменилось\не изменилось" при смене уровня. Можно взять два сохранения, например, и загружаться\отсеивать.

    Keng,если я нашел В стеке Адрес урона (  0165F27C [esp+14]  ), то как мне тогда записать (esp+14)  в эту инструкцию ( fild dword ptr [ebp-34]  )  ??

  4. Это не Он Лайн игра, Это От PS2- "Alien Hominid". Просто беру их из за того что с ними проще и быстрее работать чем с PC играми. Адреса со смещениями меняются Постоянно от уровня к уровню, не меняются только инструкции. Трассировка адресов не помогла. Действующая инструкция это которая работает с гранатами по записи ((с оружием только инструкция на доступе и остальных загружаемых в нее Групп адресов)), от Адр.Гранат с  реструктуризации  вышел на  кол-Во жизней,, эти два смещения не меняются. Если взять какое нибудь для Сравнения(фильтра), поле структуры и написать фильтр на Id оружие,  так что бы Менялось само оружие а не все поле структуры по смещению, как это написать ? ( mov eax,[ecx] ) Оружие находится на 0м смещении.  Keng, Как найти Инструкцию меняющую уровни ? По какому методу. И можно ли в трассировке стека найти параметры игрока и оружия ?

  5. Скажите Пожалуйста, у меня такой Вопрос. В игре После каждого уровня меняется Смещение на Id оружия и патронов. Возможно ли сделать так, что бы найти постоянное смещение оружия   и оно не менялось от смены уровня ? Вышел на статическую структуру по стеку (esp) которая постоянно загружает параметры игрового мира и оружия. Можно ли В ней как то определиться и выйти на постоянное статическое смещение Оружия. Если Возможно то Как ?

  6. Я к тому что если адреса похожи то это не значит что это одна структура(исключая конечно если адреса совпадают по всем байтам кроме последних). То есть в случае 31DB1737 и 3BCD21A4. Никакой зависимости одного адреса от другого нет.

    И начало структуры значения по адресу 31DB1737 может находится где угодно, надо анализировать стек а не только регистры.

    Да, как раз я и анализировал подструктуры и находил нужный адрес, но как использовать смещение если оно в каждой подструктуре..? Если правильно понял то надо использовать смещение указателя подструктуры ? Работу со стеком не совсем понимаю, анализировать его надо саму трассировку или весь стек ?
  7. Хорошо.

    Кстати понял, почему мы друг друга не понимали по смещениям. Думаю всё дело не в потому что с разных регистров, а в том, что ты использовал в двух случаях разную инструкцию, т.е. в первом случае -

    DragonAge2.AK::MemoryMgr::GetPoolName+81EA6:fld dword ptr [esi+04]mov ecx,[esi+14]
    а во втором (она находится очень близко к первой в коде игры)
    DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:fld dword ptr [esi+04]
    хотя они и похожи, но это разные инструкции и поэтому смещения отличаются (так как структуры разные). Таких похожих инструкций в коде игры бывает очень много.(поэтому кстати в Аобскане сигнатура может быть очень длинной - чтобы инструкция была уникальной).

    По второму вопросу

     А вот как быть если очень большая структура ?
    Вопроса я не очень понял, структуры - все большие. Главное, чтобы ты в ней находил, то что тебе нужно (например MAX значение здоровья, выносливости ну и т.д., т.е. характеристики на которые мы впрямую не можем повлиять; нахождение например ID (фильтров )). Если ты находишь в структуре, то что тебе нужно - размер роли не играет.

    Да. Я про это в самом начале писал, что структуру брал с верхних регистров. Про большие структуры я имел в виду напримере игра "OMERTA" :адрес 31DB1737

    А при бряке регистров можно выделить наиболее приближенный к нему 3BCD21A4

    Как проблематично вычеслить смещение

  8. Жажда Знаний, случайно натолкнулся на статью уважаемого kenga, она тоже касается как раз смещений, фильтров и структур - прочти её.

    Очень здорово написано. Статья здесь. 

    Спасибо, но когда то я уже ее читал. Немного довел скрипт до работы, нашел подходящее поле сравнения, [ecx+1c],(float)50 и [ecx+34],00000001. Почему разные смещения , потому что с разных регистров, все рабочие. А вот как быть если очень большая структура ? 

  9. Попробуйте именно тот скрипт, который я выложил, уверен - будет работать.

     

    А по поводу оружия, у меня игры перед глазами нет. Но начинать нужно с того что можно посчитать - патроны, урон, а уже дальше скорострельность и т.д., а способы разные - всё зависит от конкретной   задачи.

    Сделал Скрипт По твоему Примеру. Получилось в двух вариантах : Скрипт работает на главного героя и второй на всю команду.  Искал не совсем ID игрока а просто какое нить поле структуры, Получилось так 

    newMem:
    mov esi,ecx
    fld dword ptr [esi+04]
    cmp [esi+928],(float)350
    jne Test
    jmp returnHere
     
    Test:
    mov [esi+194],(float)80  // Cheaters
    mov [esi+144],(float)80 // Kriticall Kill
    mov [esi+924],(float)60 // SpeedPunch
    jmp returnHere
     
     
     
     
     
    DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:
    jmp newMem
    returnHere:
     
    [DISABLE]
     
    2й Вариант На всю команду
     
    newMem:
    mov esi,ecx
    fld dword ptr [esi+04]
    cmp dword ptr [esi+10],00000001
    je Test
    jmp returnHere
     
    Test:
    pushad                  <<<<<  // вот без сохранения регистров игра вылетает, На скрипте Coldown тоже
    mov [esi+314],(float)50  // Cheaters
    mov [esi+2c4],(float)50 // Kriticall Kill
    mov [esi+aa4],(float)30 // SpeedPunch
    fmul [esi+924]          //Test XP
                                       //mana push  [esi+13c] как бы сделать так что бы мана начислялась по единицы постоянно и не превышала рамки установленного лимита не более 99?
     
    mov  [esi+188],0       // Резервация маны         
    popad
    jmp returnHere
     
     
     
     
     
    DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:
    jmp newMem
    returnHere:
     
    [DISABLE]
  10. Понял, почему работает Ваш скрипт,

    Вот в этом месте (будут меняться только при соблюдении всех этих 3 условий.) я ошибся, у Вас работает именно одно условие - последнее:

    cmp [ecx+928],(float)350 // SpeedPunch А другие два условия можете безболезненно выкинуть из скрипта.

    И соответственно у Вас сейчас в игре Ваше значение SpeedPunch, которое находится по смещению 928 равно (Float)350.

    Если Вы уверены, что это значение в процессе игры не изменится, тогда ладно. Я просто не знаю, что это за значение, но всё-же скрипт советую чуть-чуть исправить (не нужно использовать ecx, если в игровой инструкции используется esi).

    Примерно так:

    Можете проверить, этот скрипт тоже будет работать пока SpeedPunch будет равно 350.Так я уже тестил. Ошибка. Да можно и так, просто в еsi эти смещения уже находятся в др.месте. На счет одного сравнения (350) я уже думал, возможно что и так, завтра проверю. Еще появилась мысль о характеристике оружия. Какие способы поиска есть ?

    ENABLE]alloc(newMem, 64)label(Test)label(returnHere) newMem:mov esi,ecxfld dword ptr [esi+04]//cmp [ecx+198],(float)1000 // Cheaters                 // Эти две строчки - лишние, их можно//cmp [ecx+148],(float)1000 // Kriticall Kill           // убрать.cmp [esi+928],(float)350 // SpeedPunch                  // Правильнее использовать esi, а не ecx.                                                        // потому-что это в Вашем случае совпало, je Test                                                 // что начало структуры лежит и в ecx и в                                                         // esi. В другой раз такого может и не бытьjmp returnHere Test:mov [esi+194],(float)60  // Хитрость, %крит,уронаmov [esi+144],(float)80 // %критического нанесения mov [esi+924],(float)80 // скорость Атакиjmp returnHere DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:jmp newMemreturnHere: [DISABLE]DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:mov esi,ecxfld dword ptr [esi+04]dealloc(newMem)
  11. Как раз учли (прочитайте внимательно п. 16). Ошибаетесь - смещения не поменяются, поменяются адреса (поэтому они и называются динамические) и их, если фильтр подобран не верно, нужно будет опять обновлять в Окне "Анализа структур", т.е. повторить все шаги с п.1 по 15.

    Продолжу: всё-таки судя по Вашему коду, Вы не до конца всё поняли.

    Не пожалейте времени (конечно видео занимает 40 минут), пересмотрите видео урок Coderа (и может несколько раз).

    Кидаю ещё раз ссылку на него (см.здесь).

    Теперь вернёмся к Вашему скрипту, я уверен практически на 100 %, что он работать не будет.

    Во- первых, так как у Вас одна игровая инструкция, то и для всех нужных Вам значений будет нужно только один фильтр, который подходит для всех нужных Вам адресов, а Вы накидали какие 3 условия:

    cmp [ecx+198],(float)1000 // Cheaterscmp [ecx+148],(float)1000 // Kriticall Killcmp [ecx+928],(float)350 // SpeedPunch
    Причём вместе и соответственно нужные Вам значения будут меняться только при соблюдении всех этих 3 условий.

    Об этом Вам писал NullAlex и делил их в предложенном варианте кода:

    cmp [esi+314],(float)-100  // Cheatersjne criticalmov [esi+314],(float)200  // Cheaterscritical:cmp [esi+2c4],(float)-100 // Kriticall Killjne speed_punchmov [esi+2c4],(float)200 // Kriticall Killspeed_punch:cmp [esi+aa4],(float)-100 // SpeedPunchjne originalcodemov [esi+aa4],(float)200 // SpeedPunch
    Так что пересмотрите видео, почитайте эту тему и поймёте.
    Незнаю возможно вы и правы но скрипт полностью рабочий, проверял не один раз с переходом на локации, перезагрузкой уровня и игры.

    Еще хотел спросить, можно ли по этим сравнениям этого скрипта сделать бессмертие, значение этих адресов не меняется.

  12. спасибо. Немного доделал скрипт да рабочего состояния. Дело еще в том что никто не учел то что нельзя ставить число для сравнения а затем менять его. Скрипт сработает только раз затем смещения просто поменяются, Вот что получилось: 

     

    [ENABLE]
    alloc(newMem, 2048)
    label(Test)
    label(returnHere)
     
    newMem:
    mov esi,ecx
    fld dword ptr [esi+04]
    cmp [ecx+198],(float)1000 // Cheaters
    cmp [ecx+148],(float)1000 // Kriticall Kill
    cmp [ecx+928],(float)350 // SpeedPunch
    je Test
    jmp returnHere
     
    Test:
    mov [esi+194],(float)60  // Хитрость, %крит,урона
    mov [esi+144],(float)80 // %критического нанесения 
    mov [esi+924],(float)80 // скорость Атаки
    jmp returnHere
     
     
     
     
     
    DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:
    jmp newMem
    returnHere:
     
    [DISABLE]
    DragonAge2.AK::MemoryMgr::GetPoolName+81EA4:
    mov esi,ecx
    fld dword ptr [esi+04]
    dealloc(newMem)
  13. Спасибо вам ребята за помощь, Действительно вы правы. Я просто сомневался в том что для  сравнения, значение можно ставить как  (float)-100. Как оказалось что попросту я тупил.  Вот рабочий скрипт 

     

     

    newMem:
    fld dword ptr [esi+04]
    mov ecx,[esi+14]
    cmp [esi+314],(float)-100  // Cheaters
    cmp [esi+2c4],(float)-100 // Kriticall Kill
    cmp [esi+aa4],(float)-100 // SpeedPunch
    je Test
    jmp returnHere
     
     
    Test:
    pushad
    mov [esi+314],(float)200  // Cheaters
    mov [esi+2c4],(float)200 // Kriticall Kill
    mov [esi+aa4],(float)200 // SpeedPunch
    popad
    jmp returnHere
     
     
    DragonAge2.AK::MemoryMgr::GetPoolName+81EA6:
    jmp newMem
    nop
    returnHere:
     
    [DISABLE]
     
    DragonAge2.AK::MemoryMgr::GetPoolName+81EA6:
    fld dword ptr [esi+04]
    mov ecx,[esi+14]
     
    dealloc(newMem)
     
    Конечно он еще на стадии доработки
     
    Но вот еще что после проверок и перезагруза игры стало меняться смещение на Хитрость, но не всегда. С чем это связано?
  14. В этом коде я вооще ничего не понимаю, зачем eax. Если по смещениям 314, 2c4 и aa4 лежат нужные Вам характеристики, то и перепишите код правильно, никакого cmp в Вашем случае не нужно.

    newMem:fld dword ptr [esi+04]mov ecx,[esi+14]mov [esi+314],(float)200 // Currentmov [esi+2c4],(float)200 // Kriticall Killmov [esi+aa4],(float)200 // SpeedPunchjmp returnHere
    Попробуйте так
    Я знаю, об этом и писал, что работает и без прыжков и на вашем примере. Опять же вы не понимаете то ли читаете не внимательно. Скрипт Значения меняет нужные но игра крашится когда переходишь на экран глав.героя. Возможно что присутствуют левые адреса и надо писать фильтр через указатель. Так думаю

    А ты уверен, что правильно пишешь фильтр?

    Посмотри на код:

    newMem:fld dword ptr [esi+04]mov ecx,[esi+14]cmp [ecx],aa4 // обрати внимание, что здесь ты сравниваешь значение по нулевому смещению с "AA4" (в десятичной: 2724)jne Testjmp returnHereTest:push eax // <-- для чего?mov [ecx+314],(float)200 // Currentmov [ecx+2c4],(float)200 // Kriticall Killmov [ecx+aa4],(float)200 // SpeedPunch <------- а тут ты пишешь в [ecx+AA4] свое значениеpop eax // <-- для чего?jmp returnHere
    Тебе надо либо сравнивать изначально по смещению AA4: cmp [ecx+AA4],$$ (где $$ - то, с чем ты будешь сравнивать, иначе фильтра не будет)

    Либо детальнее опиши сам взлом, потому как из этого кода мало что понятно.

    Также, непонятно, зачем ты размещаешь eax в стеке, а потом его выталкиваешь, если все-равно его не используешь?

    Тогда число сравнения будет (float)-100, только в каком виде его записывать, в hex ?
  15. Автор уже пытался написать скрипт. Но я отталкиваюсь от того, что автор не раз говорил, что умеет писать фильтры.

    Если попытаться разобрать его сообщение, то можно предположить, что

    Эти регистры вообще ему не нужны, т.к. если оригинальная инструкция fld dword ptr [esi+04], то значение регистра esi - и есть начало структуры.

    Далее.

    И смотрим сам скрипт.

    Предполагая, что автор все-же не умеет писать фильтры, и отдаленно знаком с АА, то вот скрипт, который ему был нужен:

    newmem:cmp [ebx+D84],$$ // <-- D84 - нужное смещение, а "$$" - цифра (ID), с которой будет производиться сравнениеjne @F // <-- выполнится оригинальный код, если сравнение не верноmov [esi+04],(float)100 // <-- выполнится, если сравнение верно@@:fld dword ptr [esi+04]mov ecx,[esi+14]jmp returnHere DragonAge2.AK::MemoryMgr::GetPoolName+81EA6:jmp newMemnopreturnHere: [DISABLE]DragonAge2.AK::MemoryMgr::GetPoolName+81EA6:fld dword ptr [esi+04]mov ecx,[esi+14] dealloc(newMem)
    Но если я не прав в своих предположениях, тогда у автора серьезные проблемы с описанием своего вопроса.

    Вопрос только в том, откуда появился регистр ebx? Если "с потолка", то тогда вместо него стоит использовать esi.

    newMem:

    fld dword ptr [esi+04]

    mov ecx,[esi+14]

    cmp [ecx],aa4 // (float)-100

    jne Test

    jmp returnHere

    Test:

    push eax

    mov [ecx+314],(float)200 // Current

    mov [ecx+2c4],(float)200 // Kriticall Kill

    mov [ecx+aa4],(float)200 // SpeedPunch

    pop eax

    jmp returnHere

    Работает и с ecx и esi одинаково

    Что я делаю не так ?

  16. Я думаю, просто человек немного запутался:

    в его конкретном примере, начало структуры лежит и в ecx, и в esi - это 203E7F90.

    соответственно, нужный ему код можно записать, в случае если инструкция работает только с его адресом (т.е. без использования фильтра):

    newMem:mov [esi+04],(float)100fld dword ptr [esi+04]mov ecx,[esi+14]jmp returnHere
    Нет, ты не прав. [Esi+04]если делать аналис по ней то каждый адресс с нее будет оканчиватся на +04, а это ошибка. Ecx находится выше [esi+04]

    mov [ecx+aa4],(float)100

    fld dword ptr [esi+04]

    mov ecx,[esi+14]

    jmp returnHere

    Работает и без условных прыжков. Но игра вылетает когда переходишь в экран характеристик героя, значит присутствуют левые адресса, думаю решение это: 1е- писать фильтр чере3 указатель и 2е-писать в него нужные смещения

  17. То как Вы описали, действительно не понятно. Прочитав, всю тему, из нее ничего не понял.

    Так что обижаться тут не на кого, если не поняло не сколько человек, значит объяснено не правильно.

    Ну например: на Ваш вопрос

    Вам ответили:

    И это правильно.

    Дальше я не понимаю что. Но вот дошли до чего-то более конкретного:

    Причём здесь "ebx 203D47E4 (Анализ структур провожу по регистру ebx) , бряк на адресе 203E7F94"? А этот фильтр "cmp [ebx],d84", в Вашем конкретном случае - полная лажа.

    Я бы понял например, если был фильтр типа: cmp ebx, 203D47E4 (и то его можно использовать, если ebx всегда равно 203D47E4).

    Ну короче, из всей темы, лично я ничего не понял.

    Обьясняю почему, потому что идет выгрузка регистров в память процесса с самого нижнего регистра (eip). Эти регистры содержат одинаковую структуру отличающиеся друг от друга смещениями. Почему ebx потому что он похож на найденый адресс т.е на начало стр-ры, начало структуры оказалось в есх, который загружается в инструкцию (esi+04)находящиеся до самой инструкции(выше). Вот и всё. Над остальным я еще работаю, как будет готово напишу.
  18. Какой вопрос - такой ответ. Хочешь получить ответ, который бы тебя устроил? - Опиши проблему детально.

    Помоги сам - опиши свою проблему, и ее решение, - многие тебе спасибо за это скажут.

    Я уже устал описывать это куда уж более детально, неужели вам это не понятно, или может не совсем 3накомо. К тому же от вас больше встречаешь банальной лени тем что просто отписывая "поищи, посмотри и т.д . Повторенье мать учения
  19. Че, блин?

    Ну ты хоть теорию почитай. Или уроки посмотри у кодера или Михаила Ремизова (keng) - они понятно объясняют.

    В моем понимании - смещение это отклонение регистра от нуля на указанное количество байт. Смещение и адреса всегда в hex (16-ричная система исчистления).

    К примеру, из записи mov [eax+18],xmm0 мы можем видеть, что eax - регистр, а 18 - смещение.

    Однако, лайф хак: чтобы в анализе структур увидеть значение регистра уже со смещением - просто возьми начальный адрес регистра и прибавь смещение.

    К примеру, если адрес регистра eax - 485E24A5 то в анализе структур запиши 485E24A5+18, где 18 - наше смещение. Тогда нулевой адрес будет наш адрес, уже со смещением.

    Так же, из записи mov [eax+18],xmm0 мы можем видеть, что регистр xmm0 копируется в смещение [eax+18].

    Т.е:

    • На первом месте идет глагол. То, что мы делаем с инструкцией. К примеру: mov - записать (сдвинуть) смещение, dec - вычесть 1, inc - прибавить 1, cmp - сравнение (используется в бессмертии и OHK)
    • На втором месте идет "подопытный". То, с чем мы проводим операцию. В нашем случае - это смещение. Однако "подопытным" может быть и адрес и многое другое.
    • На третьем месте идет "виновник торжества". Объект нашего действия. Он будет выполнять действие, указанное на первом месте, с тем, что указано на втором месте. Формулировка мутная, но думаю ты поймешь
    P.s. Я вижу тут тебе уже помогли, но малоли... Может все же будет полезно.

    Благодарю за разьяснение, но это я все уже знал давно и нового не извлёк. Такое впечатление что ни кто не понимает о чем тут речь. Ни кто не помогал, разобрался сам.

×
×
  • Создать...

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

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