Разработка и ромхакинг > Ромхакинг

[Дэнди/NES/SMD] ROM glitcher - сделай себе хак не зная ромхакинг

<< < (5/7) > >>

Беларус учит русский:
Новая версия Инвертера: исправлены баги интэрфэйса, уменьшено время поиска, добавлены дополнительные проверки при поиске кандидатов в инструкции ("инструкция не может указывать внутрь себя"), из-за чего отброшены сотни ложных инструкций:
версии первая и последняя (-"инструкции")
SoR1       3838    3804   (-34)
SoR2       13680  13274 (-406)
Contra     9271    9195   (-76)
MK3        18103  17637 (-466)
UMK3      14919  14627 (-292)
Robocop  9674    9268   (-406)

Попробовал Глитчер от pav13, встроенный в эмулятор, и это очень круто, когда эмулятор делает половину работы, а тебе надо лишь выбирать пункт :thumbup:
Поиск происходит ещё быстрее. Надеюсь, форк примут в основной код и такой поиск встанет рядом со стандартным поиском значений в памяти.

AnyZero:
Быстро вброшу и убегу :lol:. Вообще другое  искал, но это выглядит здорово, стрельба по-македонски.

Беларус учит русский:
AnyZero, для тех, кто не играл в игру - пушек стало две, да? А урон тоже удвоился?

AnyZero:
Пушек стало 2, только визуал. Урон не меняется.

Беларус учит русский:
Как тебе такое, Илон Ма SeregaZ? :)
Твой бедный SSD не насилуется, всё делается в памяти, как ты и хотел.
+всё автоматизировано до предела, буквально надо выбирать из трёх кнопок аки подопытная обезьяна :biggrin:


--- Цитата: SeregaZ от 20 Февраль 2024, 05:12:49 ---нужен эмулятор в виде дллки, чтобы подключать его к своим проектам и чтобы он работал с образом памяти, дабы не гадить на жестком диске
--- Конец цитаты ---

SeregaZ:
ну хорошо если так  :shifty:

pav13:

--- Цитата: perfect_genius от 06 Сентябрь 2025, 23:52:44 ---всё делается в памяти, как ты и хотел.
--- Конец цитаты ---

то что всё делается в памяти - это конечно хорошо. но я думаю, что SeregaZ имел ввиду немного другое под


--- Цитата: SeregaZ от 20 Февраль 2024, 05:12:49 ---... в виде дллки, чтобы подключать его к своим проектам ...
--- Конец цитаты ---


то что сейчас сделано это не динамическая библиотека именно Глитчера, это один конкретный эмулятор с Глитчером внутри.

SeregaZ:
pav13, сам ром переглючивает в памяти и запускает каждый шаг в этом эмуляторе из памяти? то есть без создания рома как файла на жестком диске?

pav13:

--- Цитата: SeregaZ от 07 Сентябрь 2025, 19:25:59 ---сам ром переглючивает в памяти и запускает каждый шаг в этом эмуляторе из памяти?
--- Конец цитаты ---
да


--- Цитата ---то есть без создания рома как файла на жестком диске?
--- Конец цитаты ---
да

SeregaZ:
руль руль  :thumbup:

AnyZero:
Встречайте, версия для nes, делает ровно тоже самое, реверс BEQ/BNE 0xF0/0xD0
Результаты классные, инструмент вышел прикольный, Contra огненная неуязвимость  - 20 шагов. В Mario Bros 2 все враги тебя лечат, звёзды грибы убивают - 143 шага, всегда попадать по врагам, давить их  - 40 шагов. Jackal - неуязвимость и суперракеты - 80 шагов. GunSmoke - любой урон возвращается врагу в виде BOOM - 49 шагов. Rush'n attack - всех врагов превратить в оружие - 44 шага, играть за врагов с 48 примерно. Monster in my pocket - 62 шага неуязвимость, Robocop 3 - 68 шагов, неуязвимость. Бонусом кучу интересных багов можно увидеть в процессе поиска. Исходник в комплекте. Все права и благодарность perfect_genius, моя там только идея.
---
NesGlitcher v2.0
Русский язык.
Описание того что примерно вы сможете нахакать, счётчики шагов/количества инструкций работают.
Больше инструкций для инвертирования (экспериментов).
 1. ADC/SBC
 2. BCC/BCS
 3. BNE/BEQ
 4. BPL/BMI
 5. BVC/BVS
 6. INC/DEC
---
NesGlitcher v2.01
Фикс счётчика шагов при выходе из приложения.
---
NesGlitcher v2.02
Теперь при выборе инструкции ром меняется сразу, нет нулевого шага.
---
NesGlitcher v2.1
Поддержка символов Unicode в названиях ромов.
Возможность поиска в CHR ROM.
Поддержка размера PRG ROM 2-го типа из NES 2.0
---
NesGlitcher v2.1.1
Фикс счётчиков.
---
NesGlitcher v2.1.2
Фикс счётчиков.
---
NesGlitcher v2.2.0
Программа обзавелась иконкой.
Запуск 2 способами, как обычно и перекидыванием рома на иконку программы.
Выбор файла стандарным файлпикером винды.
Автобэкап рома перед использованием программы.
Автоматизация для Fceux (читайте инструкцию, там всё просто).
После успешной модификации результаты сохранятся и в txt файле.

euror:
я конечно извиняюсь, но есть ли подробная инструкция для работы с глитчером?
после перекидывания в него РОМ файла глитчер закрывается

Беларус учит русский:
euror, у тебя ром не в архиве ли? Какое у него окончание названия?
AnyZero использовал нейросеть для добавления фич, поэтому там могут быть баги. Один там точно есть, но некритичный :)

AnyZero:

--- Цитата: perfect_genius от 19 Сентябрь 2025, 13:10:27 ---euror, у тебя ром не в архиве ли? Какое у него окончание названия?
AnyZero использовал нейросеть для добавления фич, поэтому там могут быть баги. Один там точно есть, но некритичный :)

--- Конец цитаты ---
У меня этого бага нет  -_-. Если ты  о том котором писал.

Беларус учит русский:
Оказывается, он только в старой консоли, а не в новой Windows Terminal, т.е. отпадают владельцы Виндов ниже Десятки. Оригинальный Глитчер совместим со всеми Виндами, в Переставлятеле ради этого пришлось немного заморочиться.
Ты не обижайся, просто я снял с себя ответственность за возможные сюрпризы от ЫЫ.
Посмотрев твой код на меня снизошло озарение, что я забыл, что на NES код отделён от графики, а значит большая вероятность инвертировать инструкции, а не данные. Значит надо бы добавить возможность глитчить и ромы NES :thumbup:

Интересно, почему твой экзэшник не удаляется сразу после скачивания антивирусом Вин11. Получается, он ведь как-то подписан или сертифицирован. Или же нейросеть знает как писать код, не раздражающий антивирусы.


--- Цитата: pav13 от 19 Сентябрь 2025, 13:08:51 ---просто сделай что написано на экране
--- Конец цитаты ---
Но там ведь написано на английском. А то, что на русском - закрывает окно.

Вот стали менять протэстированный работающий код сомнительным способом, да ещё перевели на ненашский язык - отсюда и проблемы пошли :biggrin:

AnyZero:
У меня и на 7ке нет сообщений. Но пофиксить можно. А про тесты,
так и на оригинал тоже надо на иконку программы кидать файл. Если в открытую кинуть, закроется.
Кстати поиграв с ADD/SUB на Sega в Aero the acrobat пропадает часть интерфейса, нижняя. На Робокопе против Терминатора не проверял.

Беларус учит русский:

--- Цитата: AnyZero от 20 Сентябрь 2025, 12:48:42 ---так и на оригинал тоже надо на иконку программы кидать файл
--- Конец цитаты ---
Это написано на привычном языке, не надо знать другой :)


--- Цитата: AnyZero от 20 Сентябрь 2025, 12:48:42 ---поиграв с ADD/SUB
--- Конец цитаты ---
Наверно знаешь, что там несколько этих + и -
SUB
SUBX
SUBA
SUBI
SUBQ

ADD
ADDX
ADDA
ADDI
ADDQ
И тоже достаточно инвертировать один бит.

AnyZero:
BEQ/BNE - бессмертие, открытие дверей, уровней, проход сквозь стены, секретные менюшки.
BCC/BCS - столкновения (коллизии), проход сквозь стены, лимиты предметов.
BPL/BMI -  движение направление, таймеры, статусы в игре (в рпг отравление, лед, пламя).
BVC/BVS -  физика, анимации, графические баги, фризы.
ADDQ/SUBQ -  жизни, патроны, очки, время, счётчики.
ADDI/SUBI -  бонусы, урон, лечение.
ADD/SUB -  урон, физика, двойные прыжки, экономика.

Вообще чтоб покрыть 95% хватает BEQ/BNE и SUB/ADD, минут за 10 можно найти вообще всё нужное, а порой и смешное, остальное слишком специфичное. Но побаловаться можно.

Беларус учит русский:
Уклонился от ответа :shifty:
Раз в одном случае "счетчики" и заглавные буквы, а в другом уже "счётчики" и строчные, то предположу, что тут смешанный опыт - твой и чужой.


--- Цитата: pav13 от 23 Сентябрь 2025, 09:04:24 ---Есть ли подобное описание, но для SMD?
--- Конец цитаты ---
Код есть код, как и логика, независимо от платформы. Т.е. всё это касается и SMD.

Sharpnull:

--- Цитата: AnyZero от 19 Сентябрь 2025, 07:02:24 ---версия для nes
--- Конец цитаты ---
Нет поддержки размера PRG ROM 2-го типа из NES 2.0, поэтому не работает Galaxian, у которого задаётся 8КиБ PRG ROM через NES 2.0. Также бывают ромы с трейнером (512 байт после заголовка), код для определения положения PRG ROM и CHR ROM такой (я не проверял):

--- Код: ---    uint64_t PRGSize = header[4] * 0x4000;
    uint64_t CHRSize = header[5] * 0x2000;
    bool isTrainer = (header[6] & 0x04) == 0x04;

    // NES 2.0
    if ((header[7] & 0x0C) == 0x08) {
        uint64_t PRGSizeHigh = header[9] & 0x0F;
        if (PRGSizeHigh != 0x0F) {
            PRGSize += (PRGSizeHigh << 8) * 0x4000;
        }
        else {
            uint8_t E = header[4] >> 2;
            if (E > 0x3D) { // >= 2 EiB (exbibyte)
                PRGSize = 0;
            }
            else {
                PRGSize = ((uint64_t)1 << E) * ((header[4] & 3) * 2 + 1);
            }
        }

        uint64_t CHRSizeHigh = (header[9] & 0xF0) >> 4;
        if (CHRSizeHigh != 0x0F) {
            CHRSize += (CHRSizeHigh << 8) * 0x2000;
        }
        else {
            uint8_t E = header[5] >> 2;
            if (E > 0x3D) { // >= 2 EiB (exbibyte)
                CHRSize = 0;
            }
            else {
                CHRSize = ((uint64_t)1 << E) * ((header[5] & 3) * 2 + 1);
            }
        }
    }

    uint64_t start_prg = 16;
    if (isTrainer) {
        start_prg += 512;
    }
    uint64_t end_prg = start_prg + PRGSize; // Не включая end_prg
    uint64_t start_chr = end_prg;
    uint64_t end_chr = start_chr + CHRSize; // Не включая end_chr
--- Конец кода ---
В CHR ROM бывает код (например, Batman - Return of the Joker), можно добавить опцию как вариант.
Нет поддержки файлов с иероглифами (и другими символами), я в своей программе для вывода информации о заголовке рома использовал такой код:

--- Код: ---    LPWSTR* w_argv;
    int w_argc;

    w_argv = CommandLineToArgvW(GetCommandLineW(), &w_argc);
    if (w_argv == NULL) {
        fprintf(stderr, "Error: CommandLineToArgvW()\n");
        return 1;
    }
    // Debug
    //for (int i = 0; i < w_argc; i++) {
    //    printf("%d: ", i);
    //    WriteConsoleW(GetStdHandle(STD_OUTPUT_HANDLE), w_argv[i], lstrlenW(w_argv[i]), NULL, NULL);
    //    printf("\n");
    //}

    FILE* fp = _wfopen(w_argv[1], L"rb");
    LocalFree(w_argv);
--- Конец кода ---
Для string придётся преобразования производить через WideCharToMultiByte или как-то по-другому это всё обрабатывать.
Я не знаю что у вас в новом коде, но в старом #define _CRT_SECURE_NO_WARNINGS нужно было расположить перед #include, а fread(rom_name.data() вообще не компилируется из-за const char *, в сети пишут fread(&rom_name[0].
UPD: Лучше не называть версии программ как v2.02, а вот так https://semver.org/lang/ru/ v2.2, ..., v2.20. Кстати, меня удивило, что в Cyberpunk 2077 используется древняя система версий с десятичной дробью: 1.06 < 1.1 < 1.11.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

[*] Предыдущая страница

Перейти к полной версии