Модераторы: feodorv, GremlinProg, xvr, Fixin

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> идентификация программ библиотеками, возможно ли? 
:(
    Опции темы
W4FhLF
Дата 16.1.2009, 18:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



Цитата(GremlinProg @  16.1.2009,  17:59 Найти цитируемый пост)
я пытаюсь просто отстоять точку зрения, что там где за тебя уже подумали, не нужно городить огород


Давай ты не будешь обобщать. Я говорю про конкретную область, про PE формат. Предложенная тобой библиотека экономит 2-3 строки кода на самых элементарных вещах, для которых ничего городить не надо(может хватит уже бросаться столь страшными словами, это убедительности в споре со мной нисколько не придаёт). Если человек не знает как работают эти функции, он работать с PE не сможет. 

Поэтому прицнип твой в данном случае не работает. Ради 2-3х функций никакая библиотека здесь нафиг не сдалась.

Добавлено через 4 минуты и 28 секунд
А в общем случае согласен, что велосипеды -- зло.


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
GremlinProg
Дата 16.1.2009, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(W4FhLF @  16.1.2009,  20:18 Найти цитируемый пост)
 Предложенная тобой библиотека экономит 2-3 строки кода на самых элементарных вещах, для которых ничего городить не надо

во первых, предложил ее не я, а майкрософт
во вторых, корректность базы, определение сигнатур DOS и PE заголовков в пару операций ни как не уложишь, а это уверенность в корректности PE

в данном случае это библиотека, значит ни о какой фиксированной компановке этого PE не может быть и речи, exe-шник его несущий, может быть любой, как корректный так и нет, если программа свалится в этой длл из-за того, что ее PE поврежден или не соответствует принятому в dll стандарту, значит виноват не разработчик программы, а разработчик dll, он не позаботился о таких вариантах исхода.
Цитата(W4FhLF @  16.1.2009,  20:18 Найти цитируемый пост)
Давай ты не будешь обобщать.

я предпочитаю вещи называть своими именами, хотя последнее предложение ближе в тему, причем от темы PE я пока не отклонялся, это единственная причина, почему я участвую в обсуждении
Цитата(W4FhLF @  16.1.2009,  20:18 Найти цитируемый пост)
может хватит уже бросаться столь страшными словами, это убедительности в споре со мной нисколько не придаёт

я ни коим образом не пытаюсь ни кого запугать, не вижу смысла, я лишь пытаюсь объяснить целесообразность использования этой API взамен ручным расчетам PE популярным языком, то-же самое майкрософт рекомендует делать при расчете RVA->VA, хотя это правило тоже присутствует в спецификации, тем не менее, майкрософт идет к нам навстречу и предлагает свои услуги в соответствии API своей спецификации.

зачем мне делать повторную работу майкрософт (к тому же небезопасную), если уместно использование API?
вопрос риторический


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 16.1.2009, 19:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



GremlinProg, что "фильтруй"?
Цитата(GremlinProg @  16.1.2009,  18:53 Найти цитируемый пост)
exe-шник его несущий, может быть любой, как корректный так и нет, если программа свалится в этой длл из-за того, что ее PE поврежден или не соответствует принятому в dll стандарту

1) как некорректный exe-шник может оказаться в памяти?
2) что значит "принятому в dll стандарту"?

3)какой смысл в функции которая возвращает сумму аргумента и константы или которая возвращает сумму двух аргументов?
PM MAIL ICQ   Вверх
GremlinProg
Дата 16.1.2009, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



GoldFinch, в таких случаях, пост нужно отредактировать, а не создавать новый,
что фильтровать ты уже понял
Цитата(GoldFinch @  16.1.2009,  21:30 Найти цитируемый пост)
как некорректный exe-шник может оказаться в памяти?

некорректный не может, а с непредсказуемым содержимым PE, которое не учитывается в твоей dll, но пропускает загрузчик - вполне
Цитата(GoldFinch @  16.1.2009,  21:30 Найти цитируемый пост)
 что значит "принятому в dll стандарту"?

примеры, которые ты приводил для определения PE не соответствуют определению NT-заголовка, поскольку не соответствует спецификации, поэтому стандарт ты сам себе и заводишь в dll
NT-заголовок, как и DOS - маркируются сигнатурами, при соответствии которых спецификации, они и считаются соответственно NT и DOS
Цитата(GoldFinch @  16.1.2009,  21:30 Найти цитируемый пост)
какой смысл в функции которая возвращает сумму аргумента и константы или которая возвращает сумму двух аргументов?

смысл я уже объяснил пару-тройку раз, не вижу смысла повторять, попробуй перечитать тему


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 16.1.2009, 20:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



GremlinProg, так вот как раз мой код, который работает так же как и загрузчик заголовок разберет, а твой, который по офиц. спецификации вылетит с ошибкой.
кстати разницы нет, вылетит твой код с критом или выдаст ошибку о том что не может разобрать формат, задача всеравно не будет решена
PM MAIL ICQ   Вверх
GremlinProg
Дата 16.1.2009, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
GoldFinch
Дата 16.1.2009, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



GremlinProg, тебе надо задачу решать, а не багрепорты собирать
PM MAIL ICQ   Вверх
GremlinProg
Дата 16.1.2009, 20:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(GoldFinch @  16.1.2009,  22:28 Найти цитируемый пост)
тебе надо задачу решать, а не багрепорты собирать

именно для того, чтобы не собирать багрепорты и нужно использовать одну функцию, которая все сделает правильно


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
shara
Дата 16.1.2009, 22:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ого  smile 

фигасе, не думал что моя тема вызовет столь жаркие споры... 

Цитата(GoldFinch @  16.1.2009,  10:32 Найти цитируемый пост)
а какова кстати цель такой идентификации? определить загрузила ли библиотеку своя программа или нет? тогда можно и без изысков с PE форматом обойтись, компилить эту свою программу с уникальным стабом (dos stub) и проверять с него ли начинается модуль
т.е. по адресу GetModuleHandle(NULL) должна будет лежать заранее известная последовательность байт


а если я ее зарание не знаю, могу ли я ее сначала прочитать (эту последовательность) ну скажем пару десятков символов, где-то сохранить а потом по ней уже определять "мой" это экзкшник или не "мой"?
по памяти вылетать не буду? 



--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
GoldFinch
Дата 17.1.2009, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 2
Всего: 26



shara, 0x1000 байт можешь читать спокойно
dos stub не может быть больше 64кбайт
PM MAIL ICQ   Вверх
W4FhLF
Дата 17.1.2009, 08:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



Цитата(GoldFinch @  17.1.2009,  00:17 Найти цитируемый пост)
dos stub не может быть больше 64кбайт


Ты хотел сказать байт? 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Earnest
Дата 17.1.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 33
Всего: 183



Уважаемые сэры! А вам не приходило в голову, что каждый конкретный код пишется прежде всего для того, чтобы решить одну маленькую задачу в большой череде задач различной сложности. 
Возможно, по эфективности решение использовать "прямые вычисления" vs API функций и получше. И разобраться в устройстве PE-формата тому, кто туда лезет, тоже неплохо. 
НО. Использование функций API - самодокументировано. А если там будет написано "адрес A" + "смещение B", то придется писать комментарий. Ах, я забыла, все настолько крутые, что по арифметическому выражению сразу поймут, что там написано. Ну так подумайте о тех, кто будет поддерживать этот код после вас. Хорошо написанный код должен читаться как рассказ об применяемом алгоритме, без лишних подробностей.
Конечно, бывают случаи, когда нужно что-то круто оптимизировать. Но разве этот случай такой?

Цитата(GoldFinch @  16.1.2009,  20:13 Найти цитируемый пост)
GremlinProg, а вы сами пишете функции которые выполняют только одну арифметическую операцию?

Я часто именно так и делаю. Особенно, если вычисление идет через добывание переменных из структур\классов. Причем называю функцию так, чтобы она ясно читалось в контексте общего алгоритма. 

Короче, поддерживаю мнение GremlinProg. 


--------------------
...
PM   Вверх
W4FhLF
Дата 17.1.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



А кто предлагает писать арифметику? 

Код

BOOLEAN
  GetPeHeaders(
    IN  PUCHAR                    ibase,
    IN  ULONG                    moduleSize,
    OUT PIMAGE_FILE_HEADER*        pfh OPTIONAL,
    OUT PIMAGE_OPTIONAL_HEADER*    poh OPTIONAL,
    OUT PIMAGE_SECTION_HEADER*    psh OPTIONAL
    )
{
    PIMAGE_DOS_HEADER        mzhead = (PIMAGE_DOS_HEADER)ibase;
    PIMAGE_FILE_HEADER        local_pfh;
    PIMAGE_OPTIONAL_HEADER    local_poh;
    PIMAGE_SECTION_HEADER    local_psh;
    ULONG                    HeadersSize;
    
    // Check input parameters
    if (!ibase || moduleSize < sizeof(IMAGE_DOS_HEADER))
        return FALSE;
    
    // PE format signatures checking
    if(mzhead->e_magic!=IMAGE_DOS_SIGNATURE)
        return FALSE;
    
    HeadersSize = mzhead->e_lfanew + sizeof(IMAGE_FILE_HEADER);
    if (moduleSize < HeadersSize)
        return FALSE;
    
    local_pfh = (PIMAGE_FILE_HEADER)&ibase[mzhead->e_lfanew];
    if (((PIMAGE_NT_HEADERS)local_pfh)->Signature != IMAGE_NT_SIGNATURE) 
        return FALSE;
    // Headers assigning
    local_pfh = (PIMAGE_FILE_HEADER)((PUCHAR)local_pfh + sizeof(IMAGE_NT_SIGNATURE));

    HeadersSize += sizeof(IMAGE_OPTIONAL_HEADER);
    if (moduleSize < HeadersSize)
        return FALSE;
    
    local_poh = (PIMAGE_OPTIONAL_HEADER)((PUCHAR)local_pfh + sizeof(IMAGE_FILE_HEADER));
    if ((local_poh)->Magic != IMAGE_NT_OPTIONAL_HDR32_MAGIC)
        return FALSE;

    HeadersSize += local_pfh->NumberOfSections * sizeof(IMAGE_SECTION_HEADER);
    if (moduleSize < HeadersSize)
        return FALSE;

    local_psh = (PIMAGE_SECTION_HEADER)((PUCHAR)local_poh + sizeof(IMAGE_OPTIONAL_HEADER));

    if(pfh)
        *pfh = local_pfh;
    if(poh)
        *poh = local_poh;
    if(psh)
        *psh = local_psh;
    
    return TRUE;
}


Вы видите здесь хоть одно число? Эта функция возвращает указатели на основные структуры PE файла, производя все необходимые базовые проверки и даже чуть больше. И для человека работающего с PE она прозрачна и понятна, к тому же platform-independent. 

Это сообщение отредактировал(а) W4FhLF - 17.1.2009, 10:42


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
W4FhLF
Дата 17.1.2009, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


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

Репутация: 12
Всего: 121



И к тому же что, надо мне получить указатель на IMAGE_NT_HEADER, я использую API, а если надо на IMAGE_FILE_HEADER, API такой нет, писать свою функцию придётся. Так в чём смысл использования этих 2-3х API для работы с PE, которые нам предлагает Windows? 

Вот выше я уже выложил функцию для получения основных структур(в неё включён функционал ImageHlp.ImageNtHeader), теперь могу выложить ещё две функции для работы с PE из этой библиотеки. Это если кто-то опять начнёт "зачем изобретать велосипед". smile 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Lazin
Дата 17.1.2009, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 8
Всего: 154



в любом случае это сведется к тому, что кто-нибудь дизасемблирует ваш код, найдет место где происходит проверка и забьет его инструкциями nop smile

Добавлено @ 12:51
у меня есть другой вариант: часть функционала, без которого программа не может работать отправляется в службу, работающую в режиме ядра, а эта служба учится работать с лицеднзиями и проверять легальность копии =)
в этом случае сломать то-же возможно, но сложнее

Это сообщение отредактировал(а) Lazin - 17.1.2009, 13:01
PM MAIL Skype GTalk   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




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


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

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