db in code

Discussion in 'WASM.BEGINNERS' started by bill, Dec 13, 2008.

  1. bill

    bill New Member

    Blog Posts:
    0
    Joined:
    Dec 13, 2008
    Messages:
    3
    Объясните пожалуйста вот такой код....
    Я начинаю изучать assembler и некоторым вещам не могу найти объяснения...
    Ни как не пойму, следующее...
    Вот листинг IDA:

    ...ранее в коде... mov ah, 4Eh
    seg000:0106 mov dx, 10Dh ; mask for search ie *.*0
    seg000:0109 int 21h
    seg000:010B jb short locret_1011C
    seg000:010D loc_1010D:
    seg000:010D sub ch, ds:2Ah ; *.*0
    seg000:0111 mov dx, 9Eh
    seg000:0114 call bp

    по метке (адресу) loc_1010D лежит маска для поиска файлов *.*0
    Но это просто маска а не код... IDA отобразила это как "sub ch, ds:2Ah".

    А, вот текст этого куска:

    LEA DX, FileMask
    INT 21h
    JC ff_exit
    FileMask: DB '*.*', 0
    MOV DX, 9Eh
    CALL BP
    MOV AH, 4Fh

    Вопрос такой: Ведь DB '*.*',0 при выполнении будет интерпретироваться как команда? Почему так можно писать - это раз? И почему это "работает"?
     
  2. T800

    T800 Member

    Blog Posts:
    0
    Joined:
    Dec 7, 2006
    Messages:
    293
    Location:
    Moscow
    bill
    Ну если ты не позволишь eip попасть на этот участок кода, то процик ничего интерпретировать и пытаться не будет.
     
  3. black_hole

    black_hole New Member

    Blog Posts:
    0
    Joined:
    Jan 3, 2006
    Messages:
    44
    Смотри lea dx,FileMask
    асм итерпретировал как mov dx,10dh ведь адрес loc_1010d(aka FileMask) имеено 010d в текущем сегменте, далее игра по правилам DOS в ah 4eh в dx адрес строки. Всё далее работу за нас делает DOS(aka int 21h). А IDA, она и в Африке IDA - интерактивный, значит расчитывает на человеческий фактор, а раз тут она его упустила, то и прокололась с интерпретацией), вернее когда я последний раз её пытался юзать(а это было очень давно), она уже тогда такие места выделяла красными вопросами, а в справке написали хелповаятели, что мол трактуется это место неоднозначно, поэтому проверьте 10 раз...
     
  4. T800

    T800 Member

    Blog Posts:
    0
    Joined:
    Dec 7, 2006
    Messages:
    293
    Location:
    Moscow
    del plz
     
  5. bill

    bill New Member

    Blog Posts:
    0
    Joined:
    Dec 13, 2008
    Messages:
    3
    T800>>Ну если ты не позволишь eip попасть на этот участок кода, то процик ничего интерпретировать и пытаться не будет.

    Согласен. Я только не пойму одно ведь непосредственно перед

    FileMask: DB '*.*', 0

    стоит

    JC ff_exit - условный переход...

    То есть логика (моя) говорит что условие может как выполниться так и нет...

    To black_hole IDA не причем... я пытаюсь понять почему "такой" работает....
     
  6. black_hole

    black_hole New Member

    Blog Posts:
    0
    Joined:
    Jan 3, 2006
    Messages:
    44
    И верно - не мешало бы обойти это место, а еще проще вынести в сегмент данных)
     
  7. Y_Mur

    Y_Mur Active Member

    Blog Posts:
    0
    Joined:
    Sep 6, 2006
    Messages:
    2,494
    работает потому, что значение в регистре ch из которого вычитается нечто левое просто не используется и исключений от чтения по левым адресам в ДОС нет (в винде они очень даже возможны ;) А писать так конечно же нельзя правильно если уж размещаешь данные посреди кода, то ставить jmp через них. Иногда ещё call (совмещение push адрес данных + jmp в одном флаконе) использется но это тоже безобразие тормозящее из-за нарушения предсказателя ret.
    это стандартная проверка на успешность выполнения int 21h, скорее всего jmp там просто забыли поставить, а поскольку сбоя не было, то и при отладке не заметили.
     
  8. bill

    bill New Member

    Blog Posts:
    0
    Joined:
    Dec 13, 2008
    Messages:
    3
    >> работает потому, что значение в регистре ch из которого вычитается нечто левое просто не используется

    Чёрт возьми, логично... Я так понимаю... все зависит от того как эти данные будут интерпретированы процессором...
    Просто, я - начинающий и не с первого раза понимаю такие "извращения"... Но интересно, черт возьми...
     
  9. murder

    murder Member

    Blog Posts:
    0
    Joined:
    Jun 3, 2007
    Messages:
    628
    Я в какой-то 256b - демке видел как один и тот же участок памяти использовали как данные и как код, чтобы место сэкономить.