hex -> asm_code

Тема в разделе "WASM.RESEARCH", создана пользователем YoungBastard, 14 июл 2005.

  1. YoungBastard

    YoungBastard New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2005
    Сообщения:
    231
    Адрес:
    Russia
    такой вопрос: кто как перегоняет чисто текстовый hex-код в asm код?

    поделитесь способами
     
  2. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    Чёто вопроса не понял. Ты имеешь в виду перевод чисто текстового файла в ASM?

    Что то типа этого
    Код (Text):
    1.  
    2. FC 31 C0 8E C0 8E D8 FA 8E D0
    3. -->
    4. cld
    5. xor ax, ax
    6. mov es, ax
    7. mov ds, ax
    8. cli
    9. mov ss, ax
    10.  


    Тогда ответ прост: нужно перевести файл в обычный бинарный и скормить дизасму.
     
  3. Jupiter

    Jupiter Jupiter

    Публикаций:
    0
    Регистрация:
    12 авг 2004
    Сообщения:
    532
    Адрес:
    Russia
    вопрос задан некорректно

    у меня возникло несколько доп. вопросов:

    1. HEX-код есть ассемблерные инструкции?

    т.о. EB05 -> jmp <..> или 9090 -> nop, nop

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

    2. HEX-код есть данные?

    т.о. hex-данные в asm код db 'blabla' или dd <данные>



    YoungBastard, по-конкретнее, пожалуйста.
     
  4. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    копируешь в clipboard

    берёшь hiew открываешь любой файл в любом месте

    f3

    дальше на системном меню говоришь изменить вставить

    всё
     
  5. YoungBastard

    YoungBastard New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2005
    Сообщения:
    231
    Адрес:
    Russia
    Jupiter

    я имел в виду, что бы можно было и узнать данные это или нет.



    Кстати, на мой взгляд лучше всего в winhex занести hex файл, а потом бинарник отдать иде. Узнает и данные и код.



    Хотелось бы какой-нить изощренный способ услышать=)
     
  6. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    Если речь о том, чтобы взять кусок файла и определить, код это или данные, то можно попробовать частотный анализ. Дизассемблировать, а затем определить, сколько раз встречается каждая инструкция x86. В нормальном коде чаще всего встречается MOV (35%), затем PUSH(10%), CALL (6%), CMP (5%), ADD (4%), POP (4%). Если будет часто встречаться какая-нибудь POPAD

    или OUTSW, то это, скорее всего, не код.



    Изощренный способ, конечно, но ведь именно такой ты хотел услышать :). В реальности проще юзать HEX-редактор + дизассемблер.
     
  7. YoungBastard

    YoungBastard New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2005
    Сообщения:
    231
    Адрес:
    Russia
    SDragon

    да, связка winhex+ida лучше...

    НО иногда не бывает таких инструментов... =(
     
  8. SDragon

    SDragon New Member

    Публикаций:
    0
    Регистрация:
    6 июн 2005
    Сообщения:
    133
    Адрес:
    Siberia
    YoungBastard

    Попробуй Biew (http://biew.sf.net). Переключись в режим дизассемблера, затем F4 (Modify) и вставь свои hex-коды через системное меню.



    Вот еще один способ быстро (но не точно) определить, данные это или код. Нужно построить спектр, т.е. подсчитать, сколько раз встречается каждый символ в файле:
    Код (Text):
    1. memset(array, 0, 256);
    2. for(каждый символ в файле)
    3.    array[значение символа]++


    Или в WinHex - Tools > Analyse File.



    В коде x86 обычно бывает 3 максимума: 00, FF и 8B. 00 - потому что в 32-битных операндах старшие байты часто равны нулю (например, SUB EAX, 238h - 2D 38020000).



    FF - первый байт CALL (а также некоторых форм PUSH/JMP/INC/DEC), также в Relative CALL (opcode E8) часто встречается ссылка на n-ое число байтов назад (типа E8 52F4FFFF).



    Ну а 8B - это MOVE.



    Если в файле часто встречаются эти три байта, возможно, это код. Хотя некоторые компиляторы выдают код с другими максимумами. И на маленьких кусочках файлов этот способ работает крайне плохо (нужно несколько килобайт кода, чтобы набрать достаточно статистики).