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

krocki

Разработчики
  • Постов

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

  • Посещение

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

    110

Сообщения, опубликованные krocki

  1. Может как то так!  :mellow:

    DIV

        Без знаковое деление

        •    если делитель размером в байт, то делимое должно быть расположено в регистре ax. После операции частное помещается в al, а остаток — в ah;

        •    если делитель размером в слово, то делимое должно быть расположено в паре регистров dx:ax, причем младшая часть делимого находится в ax. После операции частное помещается в ax, а остаток — в dx;

        •    если делитель размером в двойное слово, то делимое должно быть расположено в паре регистров edx:eax, причем младшая часть делимого находится в eax. После операции частное помещается в eax, а остаток — в edx.

        mov ax,10234

        mov bl,154

        div bl ;ah=остаток, al=частное

  2. В общем я решил по настроению сделать пошаговую инструкцию для новичков по взлому игр Dendy, NES и Nintendo. И так приступим...  :sleep:

     

    1: Скачиваем с интернета эмулятор FCEUX v2.2.2
    2: Запускаем эмулятор и открываем с помощью него игру, например - Contra (U) [!].nes.
    3: Начинаем играть в игру и видим две жизни у нашего героя.
    4: В меню эмуляторе нажимаем на Tools > Cheats, появится окно поиска адресов.
    5: В этом окне жмём на кнопку Reset, справа появится адреса и их значения.
    6: Далее вводим значение 02 где 0x 00 и жмём на кнопку Known Value.
    7: Переходим обратно в игру и теряем одну жизнь и опять переходим в окно Cheats Search.
    8: Вводим значение 01, где 0x 02 и жмём опять на кнопку Known Value.
    8: Так проделываем пока не будет один адрес: 0032 это и есть адрес наших жизней.
    9: Далее в меню эмулятора нажмите на DebugDegugger появится большое окно отладчика.
    10: Справа с верху есть три кнопки две из-них не активны и одна кнопка с названием Add нажмите на неё.
    11: Появится окно Add BreakPoint, вводим в поле где адрес, наш адрес жизней 0032 - 0032 и ставим галочку где Write и жмём ОК.
    12: Переходим обратно в игру и теряем ещё одну жизнь, сразу должен сработать бряк в отладчике и он покажет в самом верху слева нашу инструкцию уменьшения жизней 07:DA03:D6 32    DEC $32,X @ $0032 = #$02
    13: Подводим к этой инструкции курсор мышки, в самом низу отладчика будет отображаться информация.
    Информация: CPU Address 07:DA03, Offset 0x01DA13 in file "Contra (U) [!].nes" (NL file: 7)
    14: Далее в меню эмулятора нажмите на Debug > Game Genie Decoder/Encoder появится окно создания кодов.
    15: Вводим в поле Address - DA03, в поле Compare вводим значение в НЕХ'е D6, а где Value вводим значение НЕХ'е 60, справа верху появится наш Game Genie код ATEIUZVI.
     
    Вот мы и сделали свой Game Genie код на вечные жизни.
     
    Пояснение:
    DA03 - Это адрес где сработал наш бряк на уменьшение жизней.
    D6 - Это первый байт нашей инструкции (07:DA03:D6 32    DEC $32,X @ $0032 = #$02).
    60 - Это байт инструкции RTS, которая затирает наш оригинальный байт D6, что бы жизни в игре не уменьшались.
     
     
    Как вшить этот чит-код в игру на вечные жизни, что бы больше не париться для его ввода?  ;)
     
    1: Скачиваем с интернета программу WinHEX желательно русскую, не забудьте ввести ключ продукта для активации, а лучше скачивайте крякнутую или портейбл версию, ну или любой другой НЕХ-Редактор.
    2: Запускаем программу WinHEX и перетаскиваем в неё туда файл игры Contra (U) [!].nes.
    3: Появится много чисел и букв, это называется НЕХ-Кодами.
    4: Далее в меню программы жмём Навигация > Перейти к смещению, появится окно.
    5: Вводим в поле наше смещение 01DA13 и жмём ОК (Это смещение выдал наш отладчик в информации или где мы создавали Game Genie код, там он тоже отображался пока игра была запущена).
    6: И мы сразу перейдём на наше смещение и увидим знакомый нам код инструкции D6 32.
    7: Заменяем D6 на 60 и жмём в программе WinHEX сохранить, то есть жмём на дискетку с изображением верхнем в левом углу программы.
    Вот и всё, закрываем программу WinHEX, запускаем эмулятор с игрой и наслаждаемся.  8-)

     

    • Плюс 5
  3. Здравствуйте я решил сделать бессмертие при помощи указателя. Как сделать отличное бессмертие чтобы не умереть.

     

    А на эту игру чит-коды на бессмертие есть?

    А то можно было найти инструкцию активации чит-кода и больше не мучиться.

  4. Да! Точно! Ведь правда! Я когда находил отмычки - там же они отличались на 10 единиц! На самом деле - 175, а в значении 165!

    Skyrim, не знаю кто тебя писал - но у меня есть веские основания для отправки твоих разработчиков в нарко-диспансер!

     

    Может такое случилось после установки патчей в игру.  o_0

    А также желаю удачного взлома этой игры.  :)

  5. Привет всем. У меня возник вопрос по взлому данной игры (указана в названии темы). У меня не получается присоединить отладчик к адресу времени хода. Игра моментально вылетает, как только ты пытаешься подсоединить отладчик для получения инструкций пишущих или читающих в адрес. А с адресом времени хода ничего не выходит, ни в какую не хочет он принимать отладчик. Что мне делать?

     

    С таким я один раз сталкивался, всё дело в приоритетах.  :sleep:

    Дело в том что при подключении отладчика к адресу неважно

    на чтение или запись, очень много инструкций работают с

    твоим адресом и приоритет нагрузки идёт на отладчик и по

    этому игрушка CRASH'ся.  O_O У вы что-то сделать с этим не

    получится. В общем ищи альтернативную инструкцию

    которая может работать, путём анализа.

  6. Я знаю только 3 способа сделать фильтр.  :closeyes:

    1-й это найти указатель (Но в стратежках не актуален он или они, поскольку там много юнитов, только если ты хорошо знаешь ASM).

    2-й это дата структуры. (Очень хорошо подходит для стратег, поскольку там работают с многими данными).

    3-й это сравнение регистров. (Желательно использовать в стрелялках и гонках где только одна единица юнита). Это крайняя мера, если 1 и 2 вариант не помогает. Все игры разные, пробуй все способы.

    Поскольку у тебя стратежка где много чего, поэтому способ №2 будет более актуален.

    Просто делай побольше фильтров, если с одним фильтром перестаёт работать.

    Бывает так что приходиться проходить игру и ломать походу прохождения, поскольку не знаешь будет ли скрипт -

    работать после перехода на следующий уровень.

    В общем удачного тебе хака этой игрушки.  :-D

  7. Baracuda

    Походу жизни в игре хранятся в как ком то модуле, а не в exe'ке, причём модуль этот запакован в каком то файле архива игры.

    По этому Cheat Engine не может определить модуль, и автоматом выдаёт виртуальный адрес тебе.

    Такое я в первые встретил в игре Quake 3 Arena, там такая же фигня, модуль жизней в архиве запакован.

    Единственное что ты можешь сделать: Это распаковать полностью архив где находиться модуль, какой ни будь спец. прогой.

    Ну и попробовать запустить игру извлечёнными файлами, а сам архив игры удалить или переместить в другую любую папку.

    P.S - Обычно так делают моды для игр, извлекают файлы из архивов игры и редактируют, потом обратно запаковывают.

  8. Да вроде как то так:  :closeyes:

    mov(cmp) регистр,[Rangers+12345678]
    mov(cmp), регистр,[регистр+38]
    mov(cmp), регистр,[регистр+4]
    mov(cmp), регистр,[регистр+0]
    mov(cmp) [регистр+F0],значение
     

    MOV - Вшить.

    CMP- Сравнить.

     

    Как говорится смотря что хочешь сделать.

    Варианты разные есть.

  9. Помню на одну игрушку 5 фильтров (Указателей) вешал на одну инструкцию.

    Так что можно.  :closeyes:

    И не только можно использовать структуру для фильтра.............Можно использовать регистры + части адресов как фильтры. Где то здесь на форуме я уже писал об этом одному чуваку, поищи найдёшь.

  10. LIRW

    Ну если есть такая инструкция которая работает только стобой, конечно лучше её использовать и ненужны не какие фильтры.

    Тупо записываешь значение в инструкцию и всё.  :-D

    Интересно! А на броню и патроны тоже такое есть.  O-=

    Ramil

    А твой скрипт работает как хорошая заморозка для указателя, а сама инструкция ни-чё не даёт.

    Так что используй скрипт как у LIRW

  11. Ramil

    Ты просто используешь указатели или используешь их в скрипте как фильтр?

    Если используешь просто указатели, то нужно выставлять максимальное значение и заморозку в 1-секунду.

    А можно использовать указатели в скрипте типо так:

    Образец:

     

    [ENABLE]
    Alloc(newmem,32)
    Label(returnhere)
     
    newmem:
    mov edx,[edi+6C]
    mov [esi],edx
    [[[[[BF2.EXE+623DC0]+DC]+4]+3C]+10],3B9AC9FF
    jmp returnhere
     
    BF2.EXE+D58E28:
    jmp newmem
    returnhere:
     
    [DISABLE]
    Dealloc(newmem)
    BF2.EXE+D58E28:
    mov edx,[edi+6C]
    mov [esi],edx
     
    Поставь на адрес жизней бряк на запись, потрать немного жизней, получишь инструкцию вычитания жизней, переходишь в отладчик, делаешь авто-скрипт на эту инструкцию, вставь по образцу свой указатель со значением в скрипт, вроде всё.
  12. Значит такой тут расклад

    e577552f15e4.png

     

    Как видим инструкции наносящие урон разные. Тут фильтр не используем(т.к. инструкции разные) конечно можно но инструкции пишут постоянно поэтому фигня получится)

     

    У меня вопрос, что за фигня может быть?

  13. krocki, в первый раз сталкиваюсь со структурами, в смысле не пользовался этими инструментами раньше. немного не разобрался...

    Да я вроде сверху понятно объяснил как да-чё.

    Это типо как найти правильный адрес, а там тебе надо найти место адреса, правильное смещение + значение, вот и всё, ничего сложного.

    Ну а насчёт образца от lamalamaz, как я понял это не стратежка же, походу дела там одна персона,

    поэтому придётся скрипт + фильтр писать по другому, хотя может и сработает, в жизни всякое бывает.

    Так же можешь использовать фильтр, как кусок адрес - регистра какого ни будь, если часть куска статична и работает только с тобой и на всех твоих юнитов.

     

    Образец:

    -------------------------------------------

    Дополнительная информация

     

    12345678 - test eax,eax

    12345678 - mov [ebx,edx]

    12345678 - mov [esi+16A8],eax

    12345678 - mov [esi+16AC],eax

    12345678 - push ebx

     

    copy memory

    Вероятное значение указателя: 00351028

     

     

    EAX=000000FF      EDX=00000012     EBP=FFFFFFFA

    EBX=45856F10      ESI=00351028       ESP=0088914A

    ECX=FF88AA21     EDI=006DD720      EIP=12345678

     

    Выше приведены знач. регистров после выполнения инструкции

    --------------------------------------------------------------------------------------

    Берём только SI, и часть адреса 1028, ну с остальными так же можно.

    Только не используй IP (EBP), это смещение к нашему (общему) коду.

     

    И прописываем в скрипте.

     

     

    Типо так:

     

    [ENABLE]

    Alloc(newmem,128)
    Label(returnhere)
    Label(originalcode)
    Label(сode)
     
    newmem:

    cmp si,1028                              // 1028 - Кусок адреса.

    je code

    jmp originalcode:

     

    code:

    mov word ptr [esi+B8],270F     // Добавляем всём своим 9999-жизней.

    jmp returnhere                        // Можно попробовать и без неё, если не сработает скрипт. В большинстве случаев она ненужна.

     

    originalcode:
    comiss xmm0,[esi+B8]
    jmp returnhere
     
    GAME.EXE+12345678:
    jmp newmem
    nop                        // ХЗ не знаю сколько байт занимает эта инструкция comiss xmm0,[esi+B8], тебе видней.
    nop
    returnhere:
     
    [DISABLE]
    Dealloc(newmem)
    GAME.EXE+12345678:
    comiss xmm0,[esi+B8]
     
    А с указателями запаришься делать фильтр сразу тебе скажу, по этому либо регистры, либо анализ данных.
    В общем учись и читай здесь на форуме статейки их здесь полно.
     
    Кстати гляжу у меня после этого репутация ЛАМЕР появилась...........АААААА!!!!!! ну афигеть блин.
    Ненавижу ламеров, хоть убейся. Хотя бы юзер.
    • Плюс 2
  14. В игре Craft The World одна инструкция проверяет жизнь у всех тварей(враги, свои, животные). Как из неё исключить своих? Это стратегия и своих может быть очень много.

    Ну что можно сказать!!!  :closeyes:
    1: Находишь адрес жизней своего юнита допустим, делаешь бряк на запись в этот адрес.
    2: Создаешь авто-скрипт на ту инструкция которая появиться. Типо такой mov [esi+24C],eax
    Вот пример, метку exit я убрал, она просто не нужна:
     
    [ENABLE]
    Alloc(newmem,128)
    Label(returnhere)
    Label(originalcode)
     
    newmem:
     
    originalcode:
    mov [esi+24C],eax
    jmp returnhere
     
    GAME.EXE+12345678:
    jmp newmem
    nop
    returnhere:
     
    [DISABLE]
    Dealloc(newmem)
    GAME.EXE+12345678:
    mov [esi+24C],eax
     
    3: Находишь адреса 2-3 юнитов врага.
    Как найти адреса жизней врагов?
    В отладчике жмёшь правой кнопкой мыши на брякнутую инструкцию и выбираешь:
    "Найти адреса, получающие доступ к этой инструкции". Появится окошко для адресов.
    После этого ударь по одному разу 2 врагов. И в этом окошке появиться адреса врагов.
    Добавьте их в список, двойным нажатием левой кнопки мышки.
    4: В отладчике жмёшь на "Инструменты > Анализ данных/Структур" появится окно, в этом окне
    далее жмёшь "Файл > Добавить новую группу" штуки 2 для врагов, поскольку одна будет уже для тебя. 
    5: В первую группу вбиваешь свой адрес жизней юнита, типо так 12345678-24C
    24С - Это смещение в брякнутой инструкции к динамическому адресу.
    Ну и врагов адреса также делаешь в 2 и 3 группу заносишь.
    Во второй группе где адрес врага, жмёшь правой кнопки мышки и выбираешь "Изменить группу"
    далее в новом окошке выбираешь группу номер 3 и подтвердить, то есть адреса 2 врагов будут в одной группе.
    Потом в окне "Анализ структуры" жмёшь на "Структуры > Определить новую структуру" и жмёшь: "Подтвердить > Да > Подтвердить" после этого появиться смещения, адреса и значения. Находишь одно уникальное смещение, то есть твоё значение например 1, а у врагов должно быть по 0-ям. Рекомендую перезапустить игру и проделать заново анализ данных/структур, чтобы точно найти правильное смещение и значение.
     
    Типо так:  :-P
    Анализ структур:
     
    Смещение-описание          Адрес: Значение         Адрес: Значение         Адрес: Значение
    безымянная структура
    0260 - 4 Bytes                        12345678 : 1                   12345678 : 0                  12345678 : 0
     
    6: Запоминаем смещение 0260 и значение 1 и дорабатываем наш скрипт.
     
    Примечание:
    Я добавил ещё одну инструкцию в скрипт и изменил на её смещение,
    которая находится чуть выше над этой mov [esi+24C],eax
     
    Типо так, этот образец основан на стратегии Red Alert 2:-P
     
    [ENABLE]                              // Включение скрипта.
    Alloc(newmem,128)              // Выделенная память пустоты на 128 байт.
    Label(returnhere)                 // Обратный прыжок.
    Label(originalcode)              // Метка для оригинального кода.
    Label(originalcode2)            // Добавил новую метку.
     
    newmem:                              // Выделенная память
    cmp byte ptr [esi+260],01     // Сравниваю общий регистр с нашим смещением и значение.
    je originalcode2                    // Если равно, то прыгаю на полу изменённый код.
    jmp originalcode                   // Делаю прыжок на оригинальный код.
     
    originalcode2:                      // Метка для нашего кода бессмертия.
    nop                                      // Здесь затёрли ненужную инструкцию test eax,eax
    nop
    mov [esi+24C],eax               // Оригинальная инструкция где сработал наш бряк.
    jmp returnhere                    // Делаем прыжок обратно.

     
    originalcode:                       // Метка для нашего оригинального кода.
    test eax,eax                        // Оригинальная инструкция которая находится над брякнутой.
    mov [esi+24C],eax             // Оригинальная инструкция где сработал наш бряк.
    jmp returnhere                   // Делаем прыжок обратно.
     
    GAME.EXE+87654321:      // Это модуль файла игры + смещение.
    jmp newmem                      // Делаем прыжок на выделенную память.
    nop                                    // Здесь затёрли остаток части оригинального кода.
    nop                                    // Чтобы не нарушать логику кода, а то будет вылет из игры.
    nop
    returnhere:
     
    [DISABLE]                        // Выключение скрипта.
    Dealloc(newmem)            // Высвобождение выделенной памяти (Дабы не засорять память).
    GAME.EXE+87654321:    // Это модуль файла игры + смещение.
    test eax,eax                      // Оригинальная инструкция которая находится над брякнутой.
    mov [esi+24C],eax            // Оригинальная инструкция где сработал наш бряк.

     

    В игре Red Alert 2 скрипт работал, все твои созданные войска и построенные здания были бессмертными.

    Хотя можно написать скрипт и по другому, вариантов много, кому как удобно.  :closeyes:

    • Плюс 4
  15. Надо ставить бряк на адрес, а на не указатель. exorcise

    По пробу заново найти указатель на адрес золото, потом перезапусти игру, и отсеивай указатели, пока не найдёшь один уникальный.

    Бывает так что найти статический указатель невозможно на некоторые игры или при переходе на другой уровень он меняет смещение.

    По этому надо использовать инструкции assembler'а, и искать анализ данных, чтобы построить фильтр в скрипте, если и это не помогает,

    используй регистры как фильтр в скрипте.

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

  16. Если не получается найти указатель на адрес, попробуй через анализ данных/структур, ну или с регистрами поработай. ^_^

    Кстати я так и не вкурил чем же отличается

    db 90 90

    от

    nop

    nop

    Не чем не отличается как сказал A1t0r.

    db 90 90 - байты в нех.

    nop nop - байты в Assembler.

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

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

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