Исследование 16-bit DOS executable. NTVDM, Реальные адреса символов и symloc

Тема в разделе "WASM.RESEARCH", создана пользователем black c0de, 23 янв 2006.

  1. black c0de

    black c0de New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    10
    Адрес:
    Ukraine
    Есть дизассемблированный при помощи IDA листинг 16и-разрядного ДОС приложения.

    Есть список сегментов, достаточно большой - seg000...seg139 + dseg

    Делаю следующее:



    1) IDA -> produce MAP file

    2) *.map -> idasym.exe -> *.sym

    3) *.sym -> load to symbol loader and translate

    4) символы становятся видны в SoftIce по команде SYM



    НО!!! пробую получить адрес какого-либо сегмента - облом, пишеьт мол таких имен нет.

    Имена seg000-seg139, dseg присутствуют в IDA и в сгенереном map-файле. В чем дело??





    MAP-file:


    Код (Text):
    1.  
    2. Start Stop Length Name Class
    3.  
    4. 00000H 00986H 00987H seg000 CODE
    5. 00987H 013ADH 00A27H seg001 CODE
    6. ...... ...... ...... ......
    7. 0E4C0H 0F2CFH 00E10H dseg DATA
    8. 0F2D0H 0F3B5H 000E6H seg139 STACK
    9.  
    10.  
    11. Address Publics by Value
    12.  
    13. 0000:0000 start
    14. ......... ; тут очень много loc_xxxx
    15. 0E4C:01ED aYN?
    16. 0E4C:01F6 a02u02u02u
    17. 0E4C:0206 word_E6C6
    18. 0E4C:0208 word_E6C8
    19. 0E4C:020A word_E6CA
    20. 0E4C:020C aNetSoprocessor
    21. ......... ; разные переменные
    22. Program entry point at 0001:0000
    23.  




    так как программа 16и розрядная, в Windows XP она выполняется в контексте процесса NTVDM??



    в списке процессов ее нет, по командам ADDR, MAP32 ничего не получаю соответственно.

    MAPV86 ничего не выводит. В листинге команды MOD - NTVDM вообще нет, в документе написано что-то вроде

    того, что NTVDM отображается как какой-то WOW процесс (WOWEXEC) и рядом же пример листинга, но у меня нет даже этого

    wowexec. В таскМенеджере ntvdm есть.

    Как это все понять?



    Читал SoftICE Command Reference.pdf на тему NTVDM, как-тос мутно все...

    Что можно вытянуть по ntvdm:

    > PROC -x NTVDM

    .......... ;пару блоков различной информации



    > TASK

    > No LDT



    на 171ой странице вроде то, что мне требуется:



    Use the MAPV86 command to get the starting address of the programs static code segment. Add 10h to the address if the program in an executable (.EXE). Use the SYMLOC command to set the symbol table alignment to that value.



    но MAPV86 молчит при загруженом NTVDM. Там даже очень красивый пример есть, но толку.. у меня не выводит ничего =(((







    !!! ??????? !!!

    КАК СПРОЕЦИРОВАТЬ ЗАГРУЖЕННЫЕ В САЙС СИМВОЛЫ ПО ВЕРНЫМ РЕАЛЬНЫМ ФИЗИЧЕСКИМ АДРЕСАМ???

    Игрался с SYMLOC и ничего не вышло. Ведь SoftIce ругается на имена сегментов segNNN, dseg. НО ПОЧЕМУ, ведь они есть

    в сгенереном map-файле. Думаю эти вопросы и проблемы у меня возникают из-за нехватки опыта и отсутствия

    каких-то знаний по 16-и разрядным приложениям. Как мне спроецировать таблицу символов???

    u SymbolName меня перекидывает на invalid участки памяти, хотелось ыб использовать имена в командах установки

    брэйкпоинтов да и при трасировке удобнее...



    PS: DS 3.2.
     
  2. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    16-разрядные приложения в среде Windows эмулируются через NtVdm, поэтому все адреса оказываются другими. Исполняется на самом деле 32-разрядный код, который ntvdm пошагово создаёт. То есть 16-разрядной программы как таковой нет. ntvdm читает файл и генерирует 32-команды. А в трассировке помочь не могу, у меня вообще DOS-приложения криво с SICE'ом работают. Так что map-файл ты в памяти вряд ли найдёшь. А вообще эмуляторы сейчас используют для защиты (только не DOS'осовские, а свои собственные).
     
  3. black c0de

    black c0de New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    10
    Адрес:
    Ukraine
    исследуемая программа была написана в 90х, на Turbo C++. для финансовых организаций. там используется парольная защита, которую мне нужно обойти чтобы получит доступ к БД. тоесть сама программа написана под DOS и эмуляцию включает уже винда. получается, что никаких готовых методов нет, чтобы спроецировать символы с map'a...

    =((
     
  4. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Ух ты, что называется, век живи -- век учись. ;))



    black c0de

    а ты им ход конем! пользуй 9х назло проклятым буржуям. ;)
     
  5. black c0de

    black c0de New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    10
    Адрес:
    Ukraine
    хм.... ;) пийдется не пожалеть времени и места на винте и таки поставить win9x =)



    txx!
     
  6. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow


    Ойли, да што ты !)))



    Это где ты такое взял то ?? NTVDM всего лишь является монитором V86 машины, внутри которой нормльно исполняется это 16ти битный код досовского или win16 приложения. ядро регулирует функциональность ntvdm функцией NtVdmControl. Внутри 16 битного приложения исполняются привелегированные инструкции in/out, intXX, которые генерируют исключение #GP - один из методом перехода из v86 в pm. внутри виртуальной машины крутится код модулей ntdos.sys и еще какой то хрени, не помню точно, которым по срабатыванию к примеру 16битным кодом int21h после обработчик #GP передает управление и те в конечном итоге вызывают инструкцию 0xcc с параметрами, всё это генерирует исключение #UD, который в свою очередь в зависимости от регистров решает какую ядерную функцию вызвать, после обработки всё возвращается на круге своя.

    Если интересно, то очень рекомендую заглянуть всорцы винды.

    И нет там никакого перевода в 32битный код и всего прочего, потому как это незачем, если в процессор аппаратно введен режим v86.
     
  7. black c0de

    black c0de New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    10
    Адрес:
    Ukraine
    есть какието методы определения адреса заррузки 16и разрядкного приложения под NTVDM для проецирования символов???
     
  8. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    CARDINAL

    Просто когда я дизассемблировал NtVdmControl в ядре ОС мне показалось, что всё именно так. А на счёт аппаратной поддержки 16-битного кода в защищённом режиме -в курсе (доки Intel'а читал). А насчёт исходников винды - где ты их взял? Или ты ReactOs посмотрел?

    Ядро само по себе ничего не контролирует, NtVdmControl вызывается программой и та через int 2Eh/sysenter связывается с ядром. Поэтому программы под ntvdm исполняются медленнее.

    black c0de

    Подключись к процессу ntvdm и поищи там байты из исследуемого приложения. Для строки-то я функцию помню - s, но там должна быть такая же для hex-кодов.
     
  9. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Нет, видимо в SoftIce нельзя искать байты, или у меня уж совсем крыша поехала:) Но вот NC.exe загрузил, подсмотрел несколько байт из файла и запустил ArtMoney, так вот эти байты я нашёл! Как это сделать без ArtMoney, я пока не знаю.
     
  10. black c0de

    black c0de New Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    10
    Адрес:
    Ukraine
    хех, я байты нахожу то и все трассирую. по инт3 вываливается все. все ок. я хочу чтобы имена переменных и функций из ИДА можно было видеть в листинге сайса. что интересно, NTVDM все время грузит мое приложение по тем же адресам, потому сижу и выписываю адреса на бумажке, они всегда одни и теже.

    хотелось бы symloc натравить. в даташите на сайс есть описание symloc for 16-bit executables.. но неполучается. там надо параметром имя сегмента задать, а имени как такового нет =(((
     
  11. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    NullSessi0n

    Исходники ядра винды в свое время слил, когда нахаляву раздавали.



    Тебе стоит заглянуть в реализацию ntoskrnl!NtVdmControl. А всего лучше трасерни какое нить 16 битное приложение внутри нтвдм и посмотри откуда куда и что вызывается, просто я вижу, что ты этогоне делал , а основываешься лишь не теоретических доводах.

    Программы под нтвдм исполняются медленнее по той простой причине, что потоки нтвдм так же свопируются как и все остальные потоки, и плюс к тому же, засчёт того, что приложение внутри нтвдм живёт засчёт исключений процессора и непрерывных циклов внутри некоторых функций псевдодоса - отъедает практически всё процессорное время на себя. По этому вопросц для урегулирования использования процессорного времени процессом нтвдм придумали такую приблуду как tame nt, которая как я понял, но , глубоко не лазил, ослабляет потребление процессорного времени нтвдм, если окно последней в данный момент не активно.
     
  12. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    ntoskrnl... поиск байтов... wassup?

    хз что там на нт придумали, не смотрел, но в 9х всё было (и есть) просто и логично. Если твоя прога 100% real-mode MZ, а не под экстендер или NE, то работа с символами тривиальна:



    mapv86



    Ищешь базовый адрес своей проги, может попасться environment, его отбрасываешь. Допустим

    ...

    12B8:0000 owner is myprog

    ...



    сегмент 12B8 -- это сегмент PSP, поэтому прибавляем 100h байт (т.е. 10h к сегменту) и опаньки:

    symloc 12C8



    Вообще dldr должен сам символы грузить.



    Возможно у тебя прога не 'чистая' MZ, привел бы первые ~10К файла в аттаче на всякий.
     
  13. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow
    если прога досявая, то можно было бы сделать дос раздел и установить айс для доса, входит в комплект студии 3.1, там всё бы и делал
     
  14. CARDINAL

    CARDINAL Member

    Публикаций:
    0
    Регистрация:
    23 янв 2004
    Сообщения:
    551
    Адрес:
    Moscow


    да, нтвдм эмулирует команды x86, если у тебя архитектура отличная от х86. Так бы и сказал , что у тебя альфа, а то мозги паришь). Но, эти процессоры 64-х разрядные ))
     
  15. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    ntvdmControl трассил я на компе друга, а у него Athlon. Тогда мы по поводу ntvdm как раз и спорили.

    Комп там 64-х разрядный. И уже давно забыл, что в функции-то этой.

    Так что я основываюсь не на теории, а на дырявой памяти.

    А под отсутствием контроля со стороны ядра имел ввиду что NtVdm сама выполняет ntvdmControl. А не ядро. Ну а насчёт исключений я действительно не знал.

    Видно, я не ясно мыслю, так как не ясно выражаю.

    И файл в студию, попробуем что-нибудь сделать. А про SoftIce я смудил:) команда s всё позволяет.

    + Но ведь у Athlon'ов x86-64, почему идёт программная эмуляция (переписывание кода)?
     
  16. NullSessi0n

    NullSessi0n New Member

    Публикаций:
    0
    Регистрация:
    20 янв 2006
    Сообщения:
    322
    Делаешь addr ntvdm и ты в эмуляторе.

    Даёшь mapv86 и появляется несколько строчек, только вот непонятно что с ними делать.

    Адрес проги находешь записав байты на entry и поискав с помощью s.

    А далее надо сделать symloc <сегмент>. И какое тебе ещё имя сегмента? _BC_ всё написал, только в ntvdm надо было предварительно залезть.

    И извините за то, что вызвал жуткий флейм.
     
  17. Peshuha

    Peshuha New Member

    Публикаций:
    0
    Регистрация:
    11 фев 2003
    Сообщения:
    41
    сорри