![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| SaikstiN |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 17.1.2009 Репутация: нет Всего: нет |
С с++ знаком не очень давно, зато с гуглом уже на ты (это, так сказать, небольшое замечание) Вообще, я гуглил практически везде где можно, но ничего путного в том числе и примеров не нашел... Проблема в следующем.. Есть у меня обычный проект Win32 в VS 6.0 (если не ошибаюсь, About говорит о 94-98) Хотел я там создать окошко через API (люблю я это : ) полупрозрачное.. Естественно, линковщик заругался на отсутствие описания функции SetLayeredWindowAttributes и несколько констант к ним... + в коде мне нужно было отслеживать WM_LEAVE с помощью TrackMouseEvent, чего в VS 6.0 тоже нет...почему нет, мне ответил гугл... (он еще, разумеется, посоветовал юзать VS 2008 ну или какая там последняя, но переход на новый IDE не состоялся : ) Ок, я решил написать их описание у себя и столкнулся с проблемой незнания как это всё написать поиск дал немного инфы, ничего путного я не нашел... вконце концов гугл посоветовал мне юзать LoadLibrary и GetProcAddress ок, вышло супер... но я подумал, а если вообще не подключать windows.h (смущает огромное количество инструкций внутри; макросов, обьявлений, подключений других библиотек и т.д.) и все функции загружать автоматически (т.е. динамическая линковка) (зачем я так подумал даже не спрашивайте) ок...отключил..куча ошибок...прописал дефайны на типы и несколько структур...ошибок поменьшало.... теперь стал остро вопрос...откуда брать (адреса ф-ций) LoadLibrary и GetProcAddress? ответ -> гугл....пошарив с полдня, Хром от большого количества вкладок вырубился, что впрочем ничуть не огорчило - инфы там особо не было... нашел я только два момента - __declspec(dllimport) и DEF-файл второй способ работает только с длл (?) и в IMPORTS внешних функций содержать вроде как не может.... первый вроде оно самое, но как его использовать не увидел (всмысле как использовать для внешних функций, вроде вызова MessageBeep от user32.dll, или той же LoadLibrary от кернела) я копал микрософтские header'ы, но, то, что я там находил, и пытался вставить к себе в проект, не работало... если кто-то знает (или же может это очень заезженная тема, киньте ссыль), напишите хотя бы возможно ли это, и если да, малююсенький пример если так никто и не понял о чем это я, могу привести код и описание ошибок (хотя, на мой взгяд, всё наглядно) Спасибо |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| SaikstiN |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 17.1.2009 Репутация: нет Всего: нет |
и что же...максимум что я могу делать, это подключать windows.h для LoadLibrary и GetProcAddress и потом уже загружать через них остальные функции?
весело.... а это только загрузку kernel'а так сделали хреново динамически, или и остальных библиотек тоже? ...антивирусники и в таком случае (через LoadLibrary и GetProcAddress) будут сигналить? Это сообщение отредактировал(а) SaikstiN - 15.10.2009, 17:01 |
|||
|
||||
| DrHex |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 171 Регистрация: 2.5.2009 Репутация: нет Всего: нет |
Это одни из самых базовых функций. Не хочешь юзать системные??? Пиши сам. Не хочеш подключать windows.h Сделай свою ручками таблицу импорта..... А вообще зачем такое на С++ пишу на асме............ --------------------
google.com и это все. |
|||
|
||||
| GremlinProg |
|
||||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
с чего бы это? динамическая загрузка - шанс распознать и учесть особенности платформы, на которой выполняется приложение, например: отсутствие какой-либо библиотеки, или различие имен библиотек или функций иногда без динамической загрузки вообще не обойтись, например: при использовании драйверов, не поставляющихся с операционкой, особенно, когда программа заточена не только для работы с этим устройством смешно бы было: `работа программы "рога и копыта" невозможна без устройства "копыта", так что бреются все, кого интересуют только "рога"` просто антивирусному ПО сложнее анализировать такие динамические вложения, но это совсем не значит, что только поэтому они их блокируют для примера мог хотя бы заглянуть в тот же winuser.h все ведь описано:
для статической загрузки, по типу того, что представлено выше, требования примерно те же, что и для динамической, т.е. тут участвует та же пара : библиотека и имя функции __declspec(dllimport) обеспечивает привязку к имени функции, а библиотеку можно подключить разными способами, вот один из них:
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||||||||
|
|||||||||||||
| SaikstiN |
|
||||||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 17.1.2009 Репутация: нет Всего: нет |
Именно это я (наверно) и искал! Не понимал, откуда __declspec(dllimport) будет брать библиотеку, но теперь ясно...
именно так я и делал, но..почти всегда, даже когда я все макросы #define позаменял ручками, ничего не хотело работать...причем брал header'ы с самых разных компиляторов, и искал в них, но всё отказывалось работать...наверное проблема была в чем-то маленьком и незаметном как всегда сейчас попробовал опять собрать, уже с вашим кодом, вывело такую ошибку
я так понял, адрес ищет внутри екзешника? вот код:
и ещё вопросик
- это когда перед запуском антивирус его проверяет? (ну пусть по эвристическому анализу, или как там) у меня, например, Касперский перед запуском новых или измененных екзешников окошечко выводит, для проверки , и частенько довольно долго проверяет... это, конечно же, не может нравиться пользователю... значит, все таки лучше вписывать объявления функций, как выше.. тогда объявления пишутся в таблицу импорта, так ведь? |
||||||||||
|
|||||||||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
нужно отключить декорирование плюсов: поставить extern "C"
упростил немного типизацию, для наглядности:
+ по-моему, при отключении CRT прагма comment lib уже не будет распознанаваться, в этом случае, можно просто из свойств проекта подключить библиотеки, но это уже смотри сам, VS 6 под рукой нету, не подскажу Добавлено через 28 секунд да -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
B где у вас динамическая линковка? Я её не вижу. Вижу статическую, в бинарнике будет ссылка на user32.dll, и на функцию из него. Тут же человек хочет получить адрес функции GetProceAddress без использования GetProcAddress, чтобы в дальнейшем через неё получить адрес LoadLibrary и выполнить её... Добавлено через 43 секунды GremlinProg, ну не динамическое это, вам не кажется?) Добавлено через 1 минуту и 54 секунды или под
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| GremlinProg |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
динамическую я и не писал ) как и SaikstiN
да, уже понял, я просто связал в цепочку "LoadLibrary и GetProcAddress" и "подобные программы будут с 99% вероятностью блокироваться", а на первую часть цитаты не обратил внимания, мои извинения jonie непонятно только, зачем искать в секции импорта адреса из Kernel32, которая уже заведомо участвует в работе приложения ) объявить обе функции статически и все строим замки на пустом месте?
видимо, SaikstiN все таки хочет просто подключить API без windows.h, а статически или динамически - не имеет значения -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
Редко кто получал базу kernel32 по статическим адресам, т.к. в каждой ОС (и сервиспаке) она разная Никто получение базы kernel32 блокировать не будет, т.к. это нормальный код для упаковщиков. Нормальные антивирусы это проигнорируют, а недоантивирусы (типа авиры) этого не заметят, т.к. сигнатуру на такой код делать глупо, будут ложные срабатывания на кучу программ, а эмулятора у недоантивирусов нет. Код получения базы kernel32, и затем адресов ее функций гуглится с 1го запроса, однако нормальный импорт конечно проще. Это сообщение отредактировал(а) GoldFinch - 15.10.2009, 20:17 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
по статическим адресам? может все таки по фиксированным адресам? в секции импорта статически задаются только расположения адресов, а не сами адреса, база библиотеки тут не имеет значения, т.к. загрузчик уже сам корректирует эти адреса в соответствии с базами по статическим расположениям, т.е. на выходе образа в адресное пространство, все адреса функций уже корректны, в этом и фишка статической адресации -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| SaikstiN |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 17.1.2009 Репутация: нет Всего: нет |
GremlinProg, спасибо, работает.
Даже не знал о таком extern "C", теперь понял я подключил user32.lib через Link -> General Object/Library Modules Всем спасибо за ответы ;) Это сообщение отредактировал(а) SaikstiN - 15.10.2009, 21:04 |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
GoldFinch, не надо нам тут. Получение базы кернела это признак не упаковщика, а защиты вроде asprotect или армадиллы... и это плохой подход и плохой код. У меня включена DEP - попробуйте позапускайте такие "игрушки" в win vista под гостем ..
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
| GoldFinch |
|
|||
![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2141 Регистрация: 30.11.2008 Репутация: 2 Всего: 26 |
GremlinProg, по "статически прописанным в коде", типа 0x7C800000 для xpsp2
секция импорта тут ни при чем вообще, база (HMODULE) kernel32 нужна чтобы вызвать аналог GetProcAddress(Kernel32Base,"funcname") jonie, упаковщики ничем не отличаются от протекторов в плане получения импорта DEP тут вообще ни при чем, это запрет исполнения кода в страницах памяти где исполнение кода запрещено. С импортами это никак не связано. Учите матчасть. |
|||
|
||||
| jonie |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5613 Регистрация: 21.8.2005 Где: Владимир Репутация: 7 Всего: 118 |
GoldFinch, учите матчасть. В любом нормальном упаковщике GetProcAddress присуствует в импорте - покажите где нет?
-------------------- Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |