Реверсинг программы под MS-DOS. С чего начать?

Тема в разделе "WASM.BEGINNERS", создана пользователем cmpayc, 10 мар 2010.

  1. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Есть небольшая программа под MS-DOS. Вроде бы изначально написанная на ассемблере и без каких-либо защит от отладки. Требуется написать программу, делающую то же самое, но на Си. Имеются IDA, Dosbox, справочник по системным вызовам MS-DOS, "Intel® 64 and IA-32 Architectures Software Developer’s Manual" и знание ассемблера. Опыта работы с дизассемблерами и отладчиками — никакого.

    Существуют ли какие-нибудь руководства или советы по этому вопросу? Если пошлёте в гугл, по каким словам искать? Пока нахожу только более новое — для Windows.
     
  2. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    cmpayc
    реверсите, восстанавливаете все алгоритмы, пишите на си что возможно, где нет асм-вставки
    затраты по времени огромны
     
  3. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    cmpayc
    может начать с того что, самому на си написать все, что можете из ее функциольнальности
     
  4. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    *функциональности
     
  5. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Сперва нужно понять, что и как она делает :) Я и спрашиваю, как это лучше выяснять.
     
  6. Rockphorr

    Rockphorr Well-Known Member

    Публикаций:
    0
    Регистрация:
    9 июн 2004
    Сообщения:
    2.622
    Адрес:
    Russia
    cmpayc
    что она делает в общих чертах можно понять банально запустив ее
     
  7. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Читает несколько других файлов: текстовые сообщения, звуки PCM, картинки, и байткод, который управляет их выводом.
     
  8. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Пишете программу на Си, вставляете ассемблерные вставки с int 3h или nop'ами, чтобы можно было найти этот код. Затем открываете в дизассемблере / отладчике и смотрите - во что превратился Си-код, который вы написали.
    Про это пока можно ошибиться. На первых порах можно не заметить разложенные грабли.
    Для ДОСа это не нужно. ДОС - в 16-тиразрядном режиме (если только не используете редкие 32-разрядные программы для ДОСа).
    Если вы программировали, тем более на асме, то как может быть что вы ни разу не отлаживали программы?

    Вообще скажу что MS-DOS - старая система. Сейчас давно пора учить Windows и начинать Linux, а не отставать от прогресса на целых 20 лет. Лучше сразу начать с Windows, ибо там ассемблер со стороны программиста почти не отличается. И прошу не начинать по этому поводу священных войн :).
     
  9. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Компилятор под ДОС искать?
    И зачем?
    Вывод gcc -S для этой цели подойдёт?
    Использую его как справочник по ассемблеру.
    Сама программа, вроде, иногда использует 32-разрядные регистры.
    Программировал на Си и Паскале. На ассемблере только читал чужие программы или переводил с ассемблера на высокоуровневый :) Для отладки использовал интегрированную среду или сообщения в консоль или в файлы.
    Я это затеял, чтобы переписать программу под линукс :) Чем-то мне Досбокс не нравится :)
     
  10. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Как я понял, вы под Линуксом запустили DosBox и оттуда пытаетесь DOS-программу переписать для Линукса? Сразу бы сказали :).
    Если эта программа использует только ф-ции ДОСа, то без проблем, а вот если напрямую обращается к железу
    то перенести программу на Линукс будет затруднительно. Нужно будет хорошо знать устройство ДОСа и Линукса чтобы воспроизвести такую операцию.

    А раз вы работаете в Линуксе, ох... Как бы сказать... В Линуксе используется другой синтаксис асм-команд. С Intel-синтаксисом знаком только GDB (GnuDebugger), а транслятор ассемблера переваривает только AT&T-синтаксис. Скорее всего, вам сначала надо выучить новый синтаксис ассемблера (статьи - на сайте), а потом занимать дизассемблированием на Линуксе. Или поставить FASM/NASM и использовать его вместо транслятора, установленного по умолчанию.

    Хотя можно использовать GDB (GnuDebugger) только для диз-я и пока не писать в Линуксе асм-программы. Если GDB сложен, поставьте ALD, он гораздо проще и уже имеет Intel-синтаксис.
     
  11. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    Может HexRays переварит Вашу программу ? :)
     
  12. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Нет. 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? Можете ли посоветовать соответствующее руководство?
     
  13. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Где его взять? Там же, где IDA Pro? :)

    Есть ли смысл в декомпиляторе, если программа писалась не на Си?
     
  14. Guru_of_Zen

    Guru_of_Zen Member

    Публикаций:
    0
    Регистрация:
    21 янв 2010
    Сообщения:
    288
    пофиг на чем писалась реверсируемая программа.

    хекс-рейс-то ведь все равно работает с машинными кодами (вообще если точнее с ассемблерным листингом, выданном Идой, ну не суть...).

    угумс. 5.5 утекшая в паблек - в ней есть хекс-рейс. )
     
  15. reverser

    reverser New Member

    Публикаций:
    0
    Регистрация:
    27 янв 2004
    Сообщения:
    615
    Hex-Rays умеет декомпилировать только 32-битный код.
     
  16. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Линукс не даст вам напрямую обратиться к железу как ДОС (только если драйвер). В этом и будут проблемы - как-то придется делать по-другому.
    Но это же не Gnu-сная программа.
    То есть Линукс у вас на 64-разрядной машине установлен?
    Нет, для ДОСа гнудебаггера нет. Только если отлаживать удаленно, с другого компьютера с Линуксом (или с др. виртуальной системы), хотя не пробывал. Есть Turbo Debugger.
    По GDB есть множество руководств в сети, лучшее даже не могу назвать. Но это сложный отладчик. На opennet есть перевод официальной документации:
    http://www.opennet.ru/docs/RUS/gdb/gdb_toc.html
    Кажется, еще в Knoppix входит руссифицированный вариант. А сторонней литературы туча :).
     
  17. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Нарисовать битмап с известной палитрой или проиграть PCM — не проблема. Вопрос только, как узнать, что программа под досом делает именно это. А не, скажем, перегоняет массив в другой участок памяти.
    Главный вопрос — как работает интерпретатор байткода. А я пока даже не нашёл, где читаются соответствующие файлы.
    Сами ж просили без холиворов :)
    Да. Подавляющему большинству программ безразлично.
    Именно с виртуальной. Dosemu можно, Qemu можно, но про Dosbox нахожу только как отлаживают его самого :) Значит нельзя. Жалко.
    Поэтому вопрос: с чего начать?
     
  18. AndreyMust19

    AndreyMust19 New Member

    Публикаций:
    0
    Регистрация:
    20 окт 2008
    Сообщения:
    714
    Есть просмотрщики физической памяти и шпионы для 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
     
  19. cmpayc

    cmpayc New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2010
    Сообщения:
    25
    Я знаю, где находится переменная с именем файла. Я знаю, где вызывается int 21h, которому предшествует mov ah, 3Dh. Я могу найти, из каких мест эта процедура вызывается. Вопрос, как простым образом определять, на которую из строковых констант указывает dx? Если значение dx формируется как константа + содержимое стека + ax.

    Заодно сразу вопрос: в простом случае может стоять
    mov dx, imm16
    IDA показывает, что по адресу seg000:imm16 стоит какая-то переменная. Но адрес этой переменной в таблице ставит на 10000h больше imm16 — 1358Ah вместо 358Ah.
    Для читаемости удобнее было бы заменить все подобные константы на адреса переменных:
    mov dx, offset aDatafile_g16
    Как в IDA сделать это автоматически?

    Спасибо.
     
  20. cppasm

    cppasm New Member

    Публикаций:
    0
    Регистрация:
    18 июл 2006
    Сообщения:
    923
    Ты от жизни на пару лет отстал :)
    Добавь в командной строке -masm=intel и будет тебе интеловский синтаксис и в gcc и в gas.