Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Про функции LoadLibrary и GetProcAddress... Тип инструкции вызова этих функций какой 
:(
    Опции темы
sgi1981
Дата 31.3.2006, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 7
Всего: 10



Здравствуйте знатоки работы компьютерного железа !

Мне нужно пояснить одну вещь.

Допустим что при выполнении прикладной программы она вызывает подпрограммы WINDOWS — API-функции.
Но чтобы вызвать подпрограмму нужно задать процессору в инструкции вызова подпрограммы либо явно адрес начала кода вызываемой подпрограммы в самой инструкции вызова, либо адрес ячейки памяти где хранится адрес начала этой подпрограммы. Так же обстоит дело с вызовом API-функций. Значит прикладная программа имеет либо то либо другое.
Известно что адрес какой-нибудь функции АПИ можно узнать, если загрузить библиотеку в которой находится эта функция в память функцией LoadLibrary, а потом узнать адрес функцией GetProcAddress. После этого можно вызывать АПИ функцию ссылаясь на ячейку памяти в команде call m32. В ячейке памяти m32 имеется тот адрес, который получен функцией GetProcAddress.
Хорошо. Так можно узнать адреса почти всех АПИ-функций.
Но если мы таким образом вызываем функции АПИ, то как мы можем вызвать сами функции LoadLibrary или GetProcAddress?
Ведь мы не можем узнать их адресов самой же функцией GetProcAddress, потому что выше приведенным образом в этом случае мы не можем вызвать функцию GetProcAddress так как эта же функция должна выдать свой адрес. То же самое и с LoadLibrary.
Выходит, что адреса этих двух функций должны быть константами.
Если это так, то где я могу узнать значения адресов этих АПИ функций (LoadLibrary и GetProcAddres) ?
А может я вообще туплю...
Многие наверно подумают "ну для того чтобы вызывать АПИ есть же подключаемые файлы "*.inc" чего тут голову морочить ?"
Я знаю, что для того чтобы можно было вызывать АПИ в ассемблерной программе, есть подключаемые файлы.
Но меня уже задолбало то, что во всех книгах написано, что эти файлы нужно использовать, а не объясняется их содержание и то как они используются компилятором.
И вообще в конечном итоге, интересно, какой же тип команды процессора вызова подпрограммы-АПИ используется в WINDOWS пиложениях ?
Может адреса АПИ функций имеют всегда постоянное значение и их не обязательно узнавать функцией GetProcAddress ?
Может постоянное значение имеют только адреса функций LoadLibrary и GetProcAddress ?
Ну могу я понять в конце концов что на самом деле представляют инструкции типа call GetProcAddress, call LineTo и другие ?
Ведь я же знаю, что процессору нужно каким-то образом задать адрес этих функций !
Я не хочу просто так подчиняться каким-то указаниям учебников не зная что делается на самом деле.


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
cardinal
Дата 31.3.2006, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Тут пример с GetProcAddress на VB:
VB-VB-002158


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
sgi1981
Дата 31.3.2006, 02:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 7
Всего: 10



Цитата
http://vingrad.ru/VB-VB-002158


А ну попробуйте так

Код

push edi
push ecx
mov edi, [esp+12] ;// get the pointer to the number to shift
mov ecx, [esp+16]; //get the number to shift by
shl dword ptr [edi], cl ;// left shifting
pop ecx
pop edi
ret 16

Проверьте, я прав или нет ?
А то я могу и ошибаться smile smile smile
Теперь за сколько времени сдвигается... ?
smile

Это сообщение отредактировал(а) sgi1981 - 31.3.2006, 03:39


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Chingachguk
Дата 31.3.2006, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

Но если мы таким образом вызываем функции АПИ, то как мы можем вызвать сами функции LoadLibrary или GetProcAddress?


Обычная проблема для вирусов smile Но обычное приложение использует ИМПОРТ адресов функций - посмотри конец EXE-файла для Windows, и ты увидишь...

Цитата

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


Дельная мысль ! Но асм - это наименьшее evil в этом смысле. Инклюды для асма - те же инклюды для C. Однако все, что нада сделать - это подставить в PE-файле те функции, которые тебе нужно ИМПОРТИРОВАТЬ. См. также формат PE-файла.

Цитата

Ну могу я понять в конце концов что на самом деле представляют инструкции типа call GetProcAddress, call LineTo и другие ?


Нет, это "богохульство" smile Нет никаких загадочных "выделенных функций". Есть только машинные команды _в_любом_случае_, хоть те DOS, хоть те UNIX.



--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
sgi1981
Дата 31.3.2006, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 7
Всего: 10



Я несколько часов назад убедился что все API-функции WINDOWS из библиотек ядра этой ОС
kernel32.dll
user32.dll
gdi32.dll

всегда имеют постоянный адрес в памяти независимо от того как занята память.
Значит адреса этих функций - это константы.
Я даже вызывал отдельные АПИ используя заранее известные их адреса.

Например
Код

mov eax, 2009486767;
call eax;

Это будет аналогично
Код

call SetDIBitsToDevice



--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
sgi1981
Дата 31.3.2006, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 7
Всего: 10



Цитата(Chingachguk @ 31.3.2006, 09:33)
Нет, это "богохульство" smile Нет никаких загадочных "выделенных функций". Есть только машинные команды _в_любом_случае_, хоть те DOS, хоть те UNIX.

Я имел в виду вопрос какие формы машинной команды CALL используется при вызове функций АПИ в программах


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
cardinal
Дата 31.3.2006, 23:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Цитата(sgi1981 @ 31.3.2006, 00:30 Найти цитируемый пост)
Проверьте, я прав или нет ?

Ты не прав потому, что "the number to shift by" передается при помощи указателя на него. Почему я не помню. Но никто не запрещает провернуть всю работу описанную в статье и сказать, что value можно передать "по простому". Посмотреть надо ли запоминать esp или нет (компилятор это делает) и замерить время исполнения.

А вообще статья не про то как писать сдвиг на ассемблере. smile


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
sgi1981
Дата 1.4.2006, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 7
Всего: 10



"get the number to shift by" - число разрядов на которое сдвигается операнд -
это значение которое записывается непосредственно в стек.


Передается при помощи указателя значение
"get the pointer to the number to shift" - операнд который нужно сдвинуть.

Код

;--------------------
mov edi, [esp+12] ;// прочитали значение указателя на сдвигаемый операнд
mov ecx, [esp+16]; //прочитали непосредственное значение сдвигов
shl dword ptr [edi], cl ;// вот теперь компьютер сдвигает этот операнд в памяти
;режим адресации : смещение в сегменте задано в регистре edi и 
;указано что операнд в памяти задан как четырехбайтное слово
;--------------------

Цитата
Посмотреть надо ли запоминать esp или нет (компилятор это делает) и замерить время исполнения.

В данном случае запоминать esp не нужно потому, что мы учитываем все команды push и pop и esp при выполнении этой подпрограммы никак не может измениться против нашей воли. Даже если процессор переключится на подпрограмму обработки прерывания, то при выходе из неё он все равно восстановит значение esp таким какое оно и было до выполнения прерывания.

Цитата
...Почему я не помню...

Потому что в противном случае сдвигаемое значение осталось бы в стеке и не скопировалось назад в оригинальный операнд.

Это сообщение отредактировал(а) sgi1981 - 1.4.2006, 00:28


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
cardinal
Дата 1.4.2006, 01:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: нет
Всего: 99



Интересно. smile Ладно, спасибки, посмотрим как-нибудь. Если хочешь попробуй сам протестировать, мне пока некогда...

Правда,
Код

mov edi, [esp+12] ;// прочитали значение указателя на сдвигаемый операнд
mov ecx, [esp+16]; //прочитали непосредственное значение сдвигов

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


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Chingachguk
Дата 1.4.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

mov eax, 2009486767;
call eax;

Это будет аналогично

call SetDIBitsToDevice


Это будет аналогично ТОЛЬКО в данной версии OS, данном ее билде.

Существует несколько способов узнать адрес API, минуя импорт в PE (актуально для вирусов и тп). Например, сканирование kernel32 и проверка crc32, и т.п.




--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
sgi1981
Дата 1.4.2006, 11:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 7
Всего: 10



Цитата(Chingachguk @ 1.4.2006, 10:46)
Это будет аналогично ТОЛЬКО в данной версии OS, данном ее билде.


Допустим.
Каким тогда образом прикладная программа узнает адрес API-функции работая на разных версиях ОС ?
Ведь чтобы вызвать подпрограмму процессору нужно указать её адрес. А это можно сделать либо непосредственным указанием адреса точки перехода в машинной инструкции, либо указать на ячейку памяти где хранится адрес начала кода подпрограммы.
Если как вы говорите адреса АПИ могут меняться от одной версии ВИНДЫ к другой и одна и та же программа будет выполняться, то должны существовать ячейки памяти куда либо ОС либо программа должны будут подставлять новые адреса для АПИ в ходе выполнения программы!
Цитата
Однако все, что нада сделать - это подставить в PE-файле те функции, которые тебе нужно ИМПОРТИРОВАТЬ


Ну это опять из оперы "нажмите на эту кнопку и все сделается за вас". Нет мне это не нравится.

Цитата
Существует несколько способов узнать адрес API, минуя импорт в PE (актуально для вирусов и тп). Например, сканирование kernel32 и проверка crc32, и т.п.

Ну я же писал про функции

LoadLibrary и GetProcAddress.



--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
sgi1981
Дата 1.4.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 284
Регистрация: 16.3.2006

Репутация: 7
Всего: 10



Значит в исполняемом файле формата PE есть такая секция, где перечисляются названия нужных функций API и между названиями четырехбайтные ячейки памяти. Когда загрузчик запускает такой файл, он просматривает имена подпрограмм в той секции и уже в памяти подставляет нужные адреса в эту секцию.
Так все происходит ?


--------------------
Тело в нашем пространстве - есть часть пространства, в которой пространство обладает дисторсией относительно внешнего пространства.
PM MAIL   Вверх
Chingachguk
Дата 2.4.2006, 02:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1232
Регистрация: 25.3.2002
Где: Москва

Репутация: нет
Всего: 18



Цитата

Так все происходит ?


Примерно так smile Я же рекомендовал открыть EXE в far'е и посмотреть его таблицу импорта. Импорт может быть также по ординалу - ID функции, но это не рекомендуецца.


--------------------
I don't like the drugs (but the drugs like me). M.Manson.
PM MAIL ICQ   Вверх
SergeCpp
Дата 6.4.2006, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


 
**


Профиль
Группа: Участник
Сообщений: 955
Регистрация: 8.8.2005
Где: At Home

Репутация: 1
Всего: 124



Для удобного просмотра разнообразных исполняемых файлов и файлов других типов есть прекраснейшая программа PEView (30 K)

Она, кстати, прилагается к книге Свена Шрайбера "Недокументированные возможности Windows 2000 (8 M)",
что служит весомым подтверждением в пользу программы (которую я использую уже много лет)
Автор программы открыт для общения (можно присылать ему замеченные ошибки - он их исправляет)

Сайт разработчика, посвящённый программированию на Ассемблере содержит несколько других полезных программ,
например, программу преобразования H-файлов в INC-файлы и удобно структурированного просмотра полученных файлов (29 K)

Также есть там и начальные примеры программ для Windows на Ассемблере (67 K)

PM MAIL WWW ICQ   Вверх
oleg1973
Дата 13.4.2006, 17:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


asm fanat
****


Профиль
Группа: Экс. модератор
Сообщений: 3283
Регистрация: 16.7.2003
Где: Italy

Репутация: 7
Всего: 34



самый эффективный способ получения адреса LoadLibrary - "разборка" имаджа кернела загруженого в память
проще говоря кернел же у нас мапится автоматом в любой процесс
вот и сканируем память на присутствие таблицы ехпорта
(вариант с SEH не будет пахать на МЕ к примеру)


--------------------
SST 465555
icq 200-512-712
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1294 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.