Есть дизассемблированный при помощи 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): Start Stop Length Name Class 00000H 00986H 00987H seg000 CODE 00987H 013ADH 00A27H seg001 CODE ...... ...... ...... ...... 0E4C0H 0F2CFH 00E10H dseg DATA 0F2D0H 0F3B5H 000E6H seg139 STACK Address Publics by Value 0000:0000 start ......... ; тут очень много loc_xxxx 0E4C:01ED aYN? 0E4C:01F6 a02u02u02u 0E4C:0206 word_E6C6 0E4C:0208 word_E6C8 0E4C:020A word_E6CA 0E4C:020C aNetSoprocessor ......... ; разные переменные Program entry point at 0001:0000 так как программа 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.
16-разрядные приложения в среде Windows эмулируются через NtVdm, поэтому все адреса оказываются другими. Исполняется на самом деле 32-разрядный код, который ntvdm пошагово создаёт. То есть 16-разрядной программы как таковой нет. ntvdm читает файл и генерирует 32-команды. А в трассировке помочь не могу, у меня вообще DOS-приложения криво с SICE'ом работают. Так что map-файл ты в памяти вряд ли найдёшь. А вообще эмуляторы сейчас используют для защиты (только не DOS'осовские, а свои собственные).
исследуемая программа была написана в 90х, на Turbo C++. для финансовых организаций. там используется парольная защита, которую мне нужно обойти чтобы получит доступ к БД. тоесть сама программа написана под DOS и эмуляцию включает уже винда. получается, что никаких готовых методов нет, чтобы спроецировать символы с map'a... =((
Ух ты, что называется, век живи -- век учись. ) black c0de а ты им ход конем! пользуй 9х назло проклятым буржуям.
Ойли, да што ты !))) Это где ты такое взял то ?? NTVDM всего лишь является монитором V86 машины, внутри которой нормльно исполняется это 16ти битный код досовского или win16 приложения. ядро регулирует функциональность ntvdm функцией NtVdmControl. Внутри 16 битного приложения исполняются привелегированные инструкции in/out, intXX, которые генерируют исключение #GP - один из методом перехода из v86 в pm. внутри виртуальной машины крутится код модулей ntdos.sys и еще какой то хрени, не помню точно, которым по срабатыванию к примеру 16битным кодом int21h после обработчик #GP передает управление и те в конечном итоге вызывают инструкцию 0xcc с параметрами, всё это генерирует исключение #UD, который в свою очередь в зависимости от регистров решает какую ядерную функцию вызвать, после обработки всё возвращается на круге своя. Если интересно, то очень рекомендую заглянуть всорцы винды. И нет там никакого перевода в 32битный код и всего прочего, потому как это незачем, если в процессор аппаратно введен режим v86.
есть какието методы определения адреса заррузки 16и разрядкного приложения под NTVDM для проецирования символов???
CARDINAL Просто когда я дизассемблировал NtVdmControl в ядре ОС мне показалось, что всё именно так. А на счёт аппаратной поддержки 16-битного кода в защищённом режиме -в курсе (доки Intel'а читал). А насчёт исходников винды - где ты их взял? Или ты ReactOs посмотрел? Ядро само по себе ничего не контролирует, NtVdmControl вызывается программой и та через int 2Eh/sysenter связывается с ядром. Поэтому программы под ntvdm исполняются медленнее. black c0de Подключись к процессу ntvdm и поищи там байты из исследуемого приложения. Для строки-то я функцию помню - s, но там должна быть такая же для hex-кодов.
Нет, видимо в SoftIce нельзя искать байты, или у меня уж совсем крыша поехала Но вот NC.exe загрузил, подсмотрел несколько байт из файла и запустил ArtMoney, так вот эти байты я нашёл! Как это сделать без ArtMoney, я пока не знаю.
хех, я байты нахожу то и все трассирую. по инт3 вываливается все. все ок. я хочу чтобы имена переменных и функций из ИДА можно было видеть в листинге сайса. что интересно, NTVDM все время грузит мое приложение по тем же адресам, потому сижу и выписываю адреса на бумажке, они всегда одни и теже. хотелось бы symloc натравить. в даташите на сайс есть описание symloc for 16-bit executables.. но неполучается. там надо параметром имя сегмента задать, а имени как такового нет =(((
NullSessi0n Исходники ядра винды в свое время слил, когда нахаляву раздавали. Тебе стоит заглянуть в реализацию ntoskrnl!NtVdmControl. А всего лучше трасерни какое нить 16 битное приложение внутри нтвдм и посмотри откуда куда и что вызывается, просто я вижу, что ты этогоне делал , а основываешься лишь не теоретических доводах. Программы под нтвдм исполняются медленнее по той простой причине, что потоки нтвдм так же свопируются как и все остальные потоки, и плюс к тому же, засчёт того, что приложение внутри нтвдм живёт засчёт исключений процессора и непрерывных циклов внутри некоторых функций псевдодоса - отъедает практически всё процессорное время на себя. По этому вопросц для урегулирования использования процессорного времени процессом нтвдм придумали такую приблуду как tame nt, которая как я понял, но , глубоко не лазил, ослабляет потребление процессорного времени нтвдм, если окно последней в данный момент не активно.
ntoskrnl... поиск байтов... wassup? хз что там на нт придумали, не смотрел, но в 9х всё было (и есть) просто и логично. Если твоя прога 100% real-mode MZ, а не под экстендер или NE, то работа с символами тривиальна: mapv86 Ищешь базовый адрес своей проги, может попасться environment, его отбрасываешь. Допустим ... 12B8:0000 owner is myprog ... сегмент 12B8 -- это сегмент PSP, поэтому прибавляем 100h байт (т.е. 10h к сегменту) и опаньки: symloc 12C8 Вообще dldr должен сам символы грузить. Возможно у тебя прога не 'чистая' MZ, привел бы первые ~10К файла в аттаче на всякий.
если прога досявая, то можно было бы сделать дос раздел и установить айс для доса, входит в комплект студии 3.1, там всё бы и делал
да, нтвдм эмулирует команды x86, если у тебя архитектура отличная от х86. Так бы и сказал , что у тебя альфа, а то мозги паришь). Но, эти процессоры 64-х разрядные ))
ntvdmControl трассил я на компе друга, а у него Athlon. Тогда мы по поводу ntvdm как раз и спорили. Комп там 64-х разрядный. И уже давно забыл, что в функции-то этой. Так что я основываюсь не на теории, а на дырявой памяти. А под отсутствием контроля со стороны ядра имел ввиду что NtVdm сама выполняет ntvdmControl. А не ядро. Ну а насчёт исключений я действительно не знал. Видно, я не ясно мыслю, так как не ясно выражаю. И файл в студию, попробуем что-нибудь сделать. А про SoftIce я смудил команда s всё позволяет. + Но ведь у Athlon'ов x86-64, почему идёт программная эмуляция (переписывание кода)?
Делаешь addr ntvdm и ты в эмуляторе. Даёшь mapv86 и появляется несколько строчек, только вот непонятно что с ними делать. Адрес проги находешь записав байты на entry и поискав с помощью s. А далее надо сделать symloc <сегмент>. И какое тебе ещё имя сегмента? _BC_ всё написал, только в ntvdm надо было предварительно залезть. И извините за то, что вызвал жуткий флейм.