Есть небольшая программа под MS-DOS. Вроде бы изначально написанная на ассемблере и без каких-либо защит от отладки. Требуется написать программу, делающую то же самое, но на Си. Имеются IDA, Dosbox, справочник по системным вызовам MS-DOS, "Intel® 64 and IA-32 Architectures Software Developer’s Manual" и знание ассемблера. Опыта работы с дизассемблерами и отладчиками — никакого. Существуют ли какие-нибудь руководства или советы по этому вопросу? Если пошлёте в гугл, по каким словам искать? Пока нахожу только более новое — для Windows.
cmpayc реверсите, восстанавливаете все алгоритмы, пишите на си что возможно, где нет асм-вставки затраты по времени огромны
Читает несколько других файлов: текстовые сообщения, звуки PCM, картинки, и байткод, который управляет их выводом.
Пишете программу на Си, вставляете ассемблерные вставки с int 3h или nop'ами, чтобы можно было найти этот код. Затем открываете в дизассемблере / отладчике и смотрите - во что превратился Си-код, который вы написали. Про это пока можно ошибиться. На первых порах можно не заметить разложенные грабли. Для ДОСа это не нужно. ДОС - в 16-тиразрядном режиме (если только не используете редкие 32-разрядные программы для ДОСа). Если вы программировали, тем более на асме, то как может быть что вы ни разу не отлаживали программы? Вообще скажу что MS-DOS - старая система. Сейчас давно пора учить Windows и начинать Linux, а не отставать от прогресса на целых 20 лет. Лучше сразу начать с Windows, ибо там ассемблер со стороны программиста почти не отличается. И прошу не начинать по этому поводу священных войн .
Компилятор под ДОС искать? И зачем? Вывод gcc -S для этой цели подойдёт? Использую его как справочник по ассемблеру. Сама программа, вроде, иногда использует 32-разрядные регистры. Программировал на Си и Паскале. На ассемблере только читал чужие программы или переводил с ассемблера на высокоуровневый Для отладки использовал интегрированную среду или сообщения в консоль или в файлы. Я это затеял, чтобы переписать программу под линукс Чем-то мне Досбокс не нравится
Как я понял, вы под Линуксом запустили DosBox и оттуда пытаетесь DOS-программу переписать для Линукса? Сразу бы сказали . Если эта программа использует только ф-ции ДОСа, то без проблем, а вот если напрямую обращается к железу то перенести программу на Линукс будет затруднительно. Нужно будет хорошо знать устройство ДОСа и Линукса чтобы воспроизвести такую операцию. А раз вы работаете в Линуксе, ох... Как бы сказать... В Линуксе используется другой синтаксис асм-команд. С Intel-синтаксисом знаком только GDB (GnuDebugger), а транслятор ассемблера переваривает только AT&T-синтаксис. Скорее всего, вам сначала надо выучить новый синтаксис ассемблера (статьи - на сайте), а потом занимать дизассемблированием на Линуксе. Или поставить FASM/NASM и использовать его вместо транслятора, установленного по умолчанию. Хотя можно использовать GDB (GnuDebugger) только для диз-я и пока не писать в Линуксе асм-программы. Если GDB сложен, поставьте ALD, он гораздо проще и уже имеет Intel-синтаксис.
Нет. Dosbox — основное средство для запускания досовых программ. Если Qemu или VirtualBox дадут какие-то преимущества, буду запускать там. А пишу сразу в линуксе. Насколько я могу судить по системным требованиям, пишет в видеопамять VGA, обращается к Sound Blaster-у, задействует EMS. Как работает с клавиатурой и мышью — не выяснял. Где об этом читать в отношении доса? Справочник по вызовам BIOS у меня есть, но там не все возможности VGA (например, нет Mode-X) и ничего про Sound Blaster. А для линукса воспользуюсь, например, SDL. Есть Nasm. Кроме того, писать на ассемблере я не собираюсь. А для вставки nop-ов хватит и поверхностных знаний синтаксиса AT&T А в IDA синтаксис интеловский. Судя по беглому поиску в гугле, у ALD какие-то неустранимые проблемы с AMD64. Можно ли использовать GDB для дизассемблирования программы, запущенной внутри DosBox? Если нет, то где это проще делать, в Qemu или VirtualBox? Можете ли посоветовать соответствующее руководство?
пофиг на чем писалась реверсируемая программа. хекс-рейс-то ведь все равно работает с машинными кодами (вообще если точнее с ассемблерным листингом, выданном Идой, ну не суть...). угумс. 5.5 утекшая в паблек - в ней есть хекс-рейс. )
Линукс не даст вам напрямую обратиться к железу как ДОС (только если драйвер). В этом и будут проблемы - как-то придется делать по-другому. Но это же не Gnu-сная программа. То есть Линукс у вас на 64-разрядной машине установлен? Нет, для ДОСа гнудебаггера нет. Только если отлаживать удаленно, с другого компьютера с Линуксом (или с др. виртуальной системы), хотя не пробывал. Есть Turbo Debugger. По GDB есть множество руководств в сети, лучшее даже не могу назвать. Но это сложный отладчик. На opennet есть перевод официальной документации: http://www.opennet.ru/docs/RUS/gdb/gdb_toc.html Кажется, еще в Knoppix входит руссифицированный вариант. А сторонней литературы туча .
Нарисовать битмап с известной палитрой или проиграть PCM — не проблема. Вопрос только, как узнать, что программа под досом делает именно это. А не, скажем, перегоняет массив в другой участок памяти. Главный вопрос — как работает интерпретатор байткода. А я пока даже не нашёл, где читаются соответствующие файлы. Сами ж просили без холиворов Да. Подавляющему большинству программ безразлично. Именно с виртуальной. Dosemu можно, Qemu можно, но про Dosbox нахожу только как отлаживают его самого Значит нельзя. Жалко. Поэтому вопрос: с чего начать?
Есть просмотрщики физической памяти и шпионы для MS-DOS. Наконец, отладчики . Можно перехватить int 21h, чтобы знать какие ф-ции вызывает программа. Это я имею ввиду что GDB установлен в Linux-системе по умолчанию. А стороннего (NASM, IDA, HTEditor) можно поставить что угодно. Из программ по умолчанию по-моему только GDB может показывать Intel-синтаксис. Я бы рекомендовал небольшую статью, вводящую в GDB с разбором 7-10 основных команд. Н-р, статья в книге "Искусство дизассемблирования" или вот: Отладка двоичных файлов под gdb http://www.insidepro.com/kk/141/141r.shtml погружение в технику и философию gdb или отладка двоичных файлов под gdb https://www.evilfingers.com/publications/research_RU/gdb-bin.pdf особенности национальной отладки в UNIX https://www.evilfingers.com/publications/research_RU/UNIX.deb.pdf
Я знаю, где находится переменная с именем файла. Я знаю, где вызывается int 21h, которому предшествует mov ah, 3Dh. Я могу найти, из каких мест эта процедура вызывается. Вопрос, как простым образом определять, на которую из строковых констант указывает dx? Если значение dx формируется как константа + содержимое стека + ax. Заодно сразу вопрос: в простом случае может стоять mov dx, imm16 IDA показывает, что по адресу seg000:imm16 стоит какая-то переменная. Но адрес этой переменной в таблице ставит на 10000h больше imm16 — 1358Ah вместо 358Ah. Для читаемости удобнее было бы заменить все подобные константы на адреса переменных: mov dx, offset aDatafile_g16 Как в IDA сделать это автоматически? Спасибо.
Ты от жизни на пару лет отстал Добавь в командной строке -masm=intel и будет тебе интеловский синтаксис и в gcc и в gas.