Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » програмирование native windows api

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

Anna



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я использую Eclipse CDT и MinGW
 
подскажите как сделать native windows программу
 
т.е. не PE format/managed code, a "Unmanaged code" (compile directly to machine code, not PE format)

Всего записей: 1116 | Зарегистр. 11-11-2002 | Отправлено: 08:05 23-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Anna
http://www.independent-software.com/linking-a-flat-binary-from-c-with-mingw.html
ключевая вещь - objcopy

Всего записей: 15111 | Зарегистр. 20-09-2014 | Отправлено: 09:28 23-11-2018 | Исправлено: Mavrikii, 09:32 23-11-2018
musyakara

BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
прощайте




Флуд, клоноводство. a.k.a borka8, lormutryas, XFERODYCH и так далее.

Всего записей: 9 | Зарегистр. 13-11-2018 | Отправлено: 10:03 23-11-2018 | Исправлено: musyakara, 10:13 23-11-2018
Anna



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо, я прочитала  
 
Он использует -nostdlib option c gcc  и его flat binary не может использовать native windows api/библеотеки
 
Можно ли сдалать чтобы flat binary использовала native windows api/библеотеки
 
 
 

Всего записей: 1116 | Зарегистр. 11-11-2002 | Отправлено: 17:26 23-11-2018 | Исправлено: Anna, 20:40 23-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Anna

Цитата:
Он использует -nostdlib

чтобы уменьшить размер файла, убрав ненужное (ссылки на библиотеки).

Цитата:
Obviously, code is being included that we didn’t write: references to standard libraries

без него ваш код не должен использовать никаких сторонних библиотек, либо быть статическим (не проверял)
 
1) зачем вам это нужно?
2) так как у машинного кода идет жесткая привязка к адресации в памяти - под Windows он может и не работать (если эта область будет занята).

Всего записей: 15111 | Зарегистр. 20-09-2014 | Отправлено: 21:23 23-11-2018
Anna



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо Mavrikii
 
это мой research project в школе
 

Цитата:
без него ваш код не должен использовать никаких сторонних библиотек

 
 
т.е. я вообще не могу  link  native windows api/библеотеки dynamically?
 

Всего записей: 1116 | Зарегистр. 11-11-2002 | Отправлено: 03:02 24-11-2018 | Исправлено: Anna, 03:10 24-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Anna

Цитата:
т.е. я вообще не могу  link

в данном случае речь была лишь о стандартных библиотеках libc, неправильно сформулировал
https://blogs.oracle.com/linux/hello-from-a-libc-free-world-part-1-v2
 
я, обычно, программирую для веба, поэтому могу не знать всех особенностей прикладного программирования. поэтому могу ошибаться, но то, что убрали, лишь таблица символов, связанная с инклудом в коде. к примеру - https://software.intel.com/en-us/node/704818
 
для этого и переписали код без инклуда и связанного с ним определения функции main, что позволило не подключать стандартную библиотеку языка. но в этом нет прямой необходимости.
 
+ https://blogs.oracle.com/linux/hello-from-a-libc-free-world-part-2-v2 (это все для Linux, но смысла не меняет)
 
если вам нужны сторонние библиотеки - это, в теории, не должно мешать.
видимо вам нужно https://ru.wikipedia.org/wiki/Native_API , этот API используется на момент загрузки системы
https://malwaretips.com/threads/theory-native-windows-api-ntapi.63573/

Всего записей: 15111 | Зарегистр. 20-09-2014 | Отправлено: 03:44 24-11-2018 | Исправлено: Mavrikii, 04:06 24-11-2018
Anna



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо Mavrikii  
 
я правильно поняла что если я испоьзую
 
 
flat binary -> то статическое использование библиотек
 
PE format/ELF format -> то динамическое использование библиотек

Всего записей: 1116 | Зарегистр. 11-11-2002 | Отправлено: 07:59 25-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Anna

Цитата:
я правильно поняла что если я испоьзую

нет и не углубляйтесь в это.
https://stackoverflow.com/questions/140061/when-to-use-dynamic-vs-static-libraries
статика пихает код библиотеки в ваш исполняемый файл, увеличивая его размер.
динамика подгружает когда нужно внешний файл (требуется его наличие).
не понимаю вообще зачем в это уперлись. -nostdlib лишь не цепляет ненужную стандартную информацию (если не используется код/функции требующие эту информацию), тем самым получается "чистый" и небольшой файл. но только если ваш код не использует ничего, что требует тех библиотек.
 
по ссылке выше был пример, там показано как обращаться к нативному API - получать адреса различных функций внутри dll и вызывать их. к примеру

Цитата:
LPVOID lpFuncAddress2 = GetProcAddress(GetModuleHandle("ntdll.dll"), "NtRaiseHardError");

получение адреса функции NtRaiseHardError в DLL ntdll.dll

Всего записей: 15111 | Зарегистр. 20-09-2014 | Отправлено: 08:10 25-11-2018 | Исправлено: Mavrikii, 08:22 25-11-2018
Anna



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо Mavrikii  
 
я поняла про -nostdlib
 
 
Вот если я использую flat binary, то я не могу link DLLs, и поэтому нужно копировать код из библиотек в exe-файл. Это использование библиотек статически  
 
А PE format/ELF format дозволяют динамически подгружать код из DLLs. Это как указано в .idata (import data) section - которая перечисляет import функции из DLLs
 
А во flat binary нету .idata section - поэтому нельзя dynamically link DLLs
 
 
Я это правильно поняла?

Всего записей: 1116 | Зарегистр. 11-11-2002 | Отправлено: 09:02 25-11-2018 | Исправлено: Anna, 09:03 25-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Anna

Цитата:
Это как указано в .idata (import data) section - которая перечисляет import функции из DLLs

эта информация для PE загрузчика, чтобы он знал с чем ему нужно работать.
вы из машинного кода также можете загрузить нужную библиотеку и обратиться к ее методам.  
в случае нативного API основные библиотеки сидят на фиксированных адресах (для всех процессов, а не в определенной области памяти)  
http://www.nynaeve.net/?p=198
поэтому вы можете вызвать ту же LoadLibrary из ядра (загрузит ее в память, поправит адреса, подгрузит другие dll, если нужно, вызовет точку входа, если есть), найти адрес нужной функции и обратиться к ней.
можно и без обращения к LoadLibrary - https://www.codeproject.com/Tips/430684/Loading-Win-DLLs-manually-without-LoadLibrary
 
вот еще почитайте, хоть и старое http://www.drdobbs.com/tracing-nt-kernel-mode-calls/184416246
вот неплохо и подробно (loadlibrary все же в ядре, поправил) https://ikriv.com/blog/?p=1650
 
вот еще интересное, правда об ассемблере, но чтобы понять идею
https://board.flatassembler.net/topic.php?p=112183
http://www.craigwardman.com/Blogging/BlogEntry/finding-the-address-of-getprocaddress

Всего записей: 15111 | Зарегистр. 20-09-2014 | Отправлено: 09:17 25-11-2018 | Исправлено: Mavrikii, 10:06 25-11-2018
Anna



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Спасибо огромное - разобралась
 
 
Другой вопрос:  
 
Почему на Windows все програмы в PE формате и вообще нету программ в machine code?
 
И как это в Линуксе: большинсво программ в machine code или в каком-то формате типа ELF?

Всего записей: 1116 | Зарегистр. 11-11-2002 | Отправлено: 10:48 25-11-2018
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
господа, а чем вас не устроил штатный топ?
 
http://forum.ru-board.com/topic.cgi?forum=33&topic=0555#1

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 11:20 25-11-2018
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну, тут до WinAPI далеко, код даже ещё в память не загружен.
А ещё данные и константы, а потом ещё надо будет все импорты резолвить
и начать исполнение с начала кода. Для всего этого и многого другого
программы и пакуют в PE, ELF, Mach-O, итд форматах, в которых имеется
дополнительная информация для системного загрузчика, чтобы он мог
сделать всё правильно.
Чисто машинный код разве что в BIOSe и в программах для микроконтроллеров
можно найти только.

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 14:23 25-11-2018
Anna



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Чисто машинный код разве что в BIOSe и в программах для микроконтроллеров  
можно найти только.

 
 
В Линуксе тоже?

Всего записей: 1116 | Зарегистр. 11-11-2002 | Отправлено: 17:52 25-11-2018
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да, там везде ELF, но я насчёт kernel неуверен.
А на MacOS Mach-O формат.
 
Native binary применяется в основном при старте операционной системы, когда ещё ничего нет, а загрузиться надо. Соответственно, и внешних API нет, которых можно было бы вызвать, в лучшем случае int, всё осталное надо писа́ть самому. На микроконтроллерах другая история, там очень мало ресурсов, и не имеет смысла городить операционную систему с API, блекджеком итд,  а всё делать из бинарного кода.
 
Если не секрет, что за школа такая, где подобные исследования ведутся?
 
 

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 18:56 25-11-2018
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Anna
машинный код слишком привязан к адресам. его используют, как и написали, когда нет ОС (до загрузки системы или в тех случаях, когда ее нет вообще). понятно, что все можно написать с нуля, но зачем изобретать велосипед если PE и аналоги сильно упрощают работу с ресурсами, делая многие "нудные" действия за вас.
 
насчет разницы между PE и ELF
https://news.ycombinator.com/item?id=8029564
https://forum.osdev.org/viewtopic.php?f=1&t=17686
http://www.codenet.ru/progr/formt/elf_pe.php

Всего записей: 15111 | Зарегистр. 20-09-2014 | Отправлено: 21:23 25-11-2018 | Исправлено: Mavrikii, 21:24 25-11-2018
ne_viens

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Посмотрел формат ядра Дебиана - PE там. Вернее 64 битный его вариант PE32+

Всего записей: 1530 | Зарегистр. 01-11-2004 | Отправлено: 11:18 26-11-2018
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » програмирование native windows api


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru