|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Окт 31, 2003 10:56:20 1. mov word ptr MyStruc.Myfield,ax Что окажется в [ebx].MyStruc? Он ведь переворачивает как-то, прежде чем в память пишет. 2. mov dword ptr MyStruc.Myfield,eax что окажется в [ebx].MyStruc? Он ведь переворачивает как-то, прежде чем в память пишет. 3.Прочитал я тут про формат PE(Portable Executable) и разобрался, как в винде происходит вызов процедур из DLL. И ещё видел юнит к Turbo Pascal который работает с сокетами, обращаясь к VxD через int 16h И возник вопрос, а как он узнаёт пользователя, который запустил прогу? Dll подгружаются каждая своя под каждого пользователя? Просто странно, происходит обычный вызов Call, и вдруг DLL узнаёт о привилегиях программы, вызвавший Call, каким образом? И вообще, ведь DLL не является процессом вроде, так что у неё могут быть свои привилегии, я так понимаю? Она потипу смотрит по стеку, кто её вызвал, потом по адресу узнаёт пользователя и привилегии, и решает выполнять или нет? 4.Можно ли в Protect Mode шлюзы процедур распологать в GDT, а не в IDT ведь IDT слишком узкая для такого дела...Т.е если присвоить дескриптору бит системности, и обозначить его, как шлюз процедуры кольца 0, то можно ли потом зделать Call на этот дескриптор? Скорей всего, мне кажется, что нельзя, но это просто так неудобно, обращаться к ядру через системные прерывания. Мне так кажется. Просто если есть формат PE, то ведь удобно везде использовать его, а не смешивать два способа вызова процедур. 5. И ещё, а в бинарных файдах, скажем BMP тоже всё перевёрнуто, как если из eax писать в память? И нафиг вообще так сделано, что всё местами меняется? 6. А сравнение с памятью как происходит(scasd,cmp), так, будто бы из памяти загружается в регистр, и сравнивается, тоесть тоже с перевёртыванием? 7.Вот ещё вопросик, а как с совместимостью указателей в C/C++? В смысле, в досе размер смещения FFFF а в ProtectMode FFFFFFFF. Как из RM безболезненно перейти в 32-х битный PM, если я пишу на C+TASM. В смысле вот в Асме есть SEGMENT USE32/ SEGMENT USE16, а как быть с "C",ведь то я был под 16-ти битами, а теперь под 32-мя? И вообще, какго размера эти указатели? |
|
|
Дата: Окт 31, 2003 11:30:02 MishaSt Про переворачивает: Применительно к x86 архитектуре понимайте так - "младшие" данные располагаются по младшим адресам, а "старшие" по старшим, адрес при этом указывает на "младшие" данные, т.е. если записать двойное слово из EAX = 012345678h по адресу 0, то получим: 00000000 78 00000001 56 00000002 34 00000003 12 если прочитать его обратно в EAX, оно будет выглядеть так же, как до записи. При сравнении при помощи CMP надо учитывать перевертывание, при сравнении любым из SCASx'ов не надо. |
|
|
Дата: Окт 31, 2003 13:52:07 3.Прочитал я тут про формат PE(Portable Executable) и разобрался, как в винде происходит вызов процедур из DLL. И ещё видел юнит к Turbo Pascal который работает с сокетами, обращаясь к VxD через int 16h И возник вопрос, а как он узнаёт пользователя, который запустил прогу? Dll подгружаются каждая своя под каждого пользователя? Просто странно, происходит обычный вызов Call, и вдруг DLL узнаёт о привилегиях программы, вызвавший Call, каким образом? И вообще, ведь DLL не является процессом вроде, так что у неё могут быть свои привилегии, я так понимаю? Она потипу смотрит по стеку, кто её вызвал, потом по адресу узнаёт пользователя и привилегии, и решает выполнять или нет? Сам то понял че спросил? DLL копируется в память процесса, соответственно становится его частью, соответственно наследует все его свойства и ничего сама "узнавать" не должна |
|
|
Дата: Окт 31, 2003 18:11:03 При сравнении при помощи CMP надо учитывать перевертывание Что здесь имеется ввиду? mov eax, 12345678h mov [ebx], eax cmp dword ptr [ebx], 12345678h ;-?? Вы хотите сказать, что эта команда CMP не сравнит пока данные не будут перевёрнуты? |
|
|
Дата: Окт 31, 2003 20:05:51 3.Прочитал я тут про формат PE(Portable Executable) и разобрался, как в винде происходит вызов процедур из DLL. И ещё видел юнит к Turbo Pascal который работает с сокетами, обращаясь к VxD через int 16h И возник вопрос, а как он узнаёт пользователя, который запустил прогу? Dll подгружаются каждая своя под каждого пользователя? Просто странно, происходит обычный вызов Call, и вдруг DLL узнаёт о привилегиях программы, вызвавший Call, каким образом? И вообще, ведь DLL не является процессом вроде, так что у неё могут быть свои привилегии, я так понимаю? Она потипу смотрит по стеку, кто её вызвал, потом по адресу узнаёт пользователя и привилегии, и решает выполнять или нет? Сам то понял че спросил? DLL копируется в память процесса, соответственно становится его частью, соответственно наследует все его свойства и ничего сама "узнавать" не должна Я про то, когда вызываешь функцию, которою не все имеют права вызывать,например, записи в реестр, то значит DLL обращается к устройству, или к Native Api, а оно, устройство или Native Api определяет, выполнять процедуру или нет, значит так получается, и что, для каждого приложения своя копия kernel32.dll загружается? А как устройство или Native Api определет пользователя, от которого выполняется данная процедура? |
|
|
Дата: Окт 31, 2003 20:23:43 MishaSt У тебя, родной, в голове такая жуткая каша стоит, что аж страшно. Смешались в кучу кони, люди, и залпы тысячи орудий слились в протяжный вой. Native API не определяет ничего. Это ему на хер не нужно. Native API - это, всего лишь, переходники к функциям ядра (не все, не всегда, но для упрощения оставим как есть). А вот в ядре система решает (согласно объектам ядра), ЧТО делать с поступившим запросом - есть ли у тебя необходимые права, а не пытаешься ли ты залезть по недопустимым адресам и т.п. Что до копии kernel32.dll. Да, под NT+ каждый процесс в своем контексте может иметь kernel32.dll. То, что она будет загружена - не факт, но ntdll.dll загружается принудительно. |
|
|
Дата: Окт 31, 2003 20:42:57 Я про то, когда вызываешь функцию, которою не все имеют права вызывать,например, записи в реестр, то значит DLL обращается к устройству, или к Native Api, а оно, устройство или Native Api определяет, выполнять процедуру или нет, значит так получается, и что, для каждого приложения своя копия kernel32.dll загружается? А как устройство или Native Api определет пользователя, от которого выполняется данная процедура? Володя в принципе правильно сказал. Хочу чутка дополнить 1) Перед задаванием вопросов. ЧИТАЕМ РИХТЕРА !!! 2) По поводу DLL - Это кусок процесса уже. Такой же как модуль в трупо-паскале. 3) Все привилегии контроллируются внутри ядра. 4) Читаем книги 5) Читаем MSDN 6) Читаем опять книги. newbe блин. |
|
|
Дата: Ноя 3, 2003 04:58:27 AsmGuru62 Зачем такой тривиальный пример. Я имел ввиду, например, если прочитать в память bmp-файл, то для сравнения сигнатуры 'BM', можно использовать cmp FileHeader.bfType,04D42h ; 'B' - 042h, 'M' - 04Dh хотите сказать, что эта команда CMP не сравнит Ты не видишь разницы между моим надо учитывать и своим не сравнит? |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.055 |