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

Поиск:

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



****


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

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



подробнее - в нормальных программах первая секция - это секция кода, и ее rva равен 0x1000
размер 1й секции (кода) можно прочитать из таблицы секций в заголовке
Код

char* base=GetModuleHandle(NULL)
int N=*(base+*(base+0x3C)+sizeof(PE_HEADER)).SizeOfRawData
char *p=base+0x1000;
int hash=0;
for(int i=N;0!=i;i--)
{
    hash=hash*5+*p;
    p++;
}


PM MAIL ICQ   Вверх
shara
Дата 10.1.2009, 23:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GoldFinch, 

Цитата(GoldFinch @  9.1.2009,  20:43 Найти цитируемый пост)
int N=*(base+*(base+0x3C)+sizeof(PE_HEADER)).SizeOfRawData

я сколько не пытался так и не понял смысла этой строчки... и компилятор усиленно на нее ругается



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



****


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

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



а говориш формат PE файлов разобрал....
PM MAIL ICQ   Вверх
shara
Дата 11.1.2009, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GoldFinch, 
это да, но против компилятора не попрешь...  сама идея понятна, вот с конкретной реализацией проблемы... в статьях что я нашел примеры не оч понятны


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



****


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

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



зачем тебе примеры если есть описание формата файла?
по смещению 0x3C находится raw offset PE заголовка, за PE заголовком находится таблица секций, тебе нужно поле SizeOfRawData первой секции, в нем лежит размер этой 1й секции в файле...

Добавлено через 3 минуты и 33 секунды
вот строчка которая должа компилиться
  int FirstSectionSize =*(int*)((char*)base+*(int*)((char*)base+0x3C)+0xF8+0x10);
0xF8 - размер PE заголовка, 0x10 смещение поля SizeOfRawData
PM MAIL ICQ   Вверх
shara
Дата 14.1.2009, 21:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



GoldFinch, 
в общем эта строчка 
Цитата

int FirstSectionSize =*(int*)((char*)base+*(int*)((char*)base+0x3C)+0xF8+0x10);
 тоже не хочет работать компилятор ругается на сложение двух поинтеров

но всеравно спасибо - я уже сам со всем разобрался. все таки PE штука классная. Главное узнать где он в файле начинается, отдельное спасибо за 
Цитата

char* base=GetModuleHandle(NULL)

потом берем нужную структуру из winnt.h и присваем ей нужный адрес... ну а дальше дело техники 


вопрос можно снимать. 
кстати тестил на в разных версиях Винды - контрольная сумма (хеш) одинакова. - т.е. идея заслуживает на жизнь
пока все это писал, возник один вопрос: можно ли читать нужные мне биты файла, зная только начало PE заголовка + смещение нужного поля в структуре. тогда не нужно будет каждый раз работать со структурами а сразу читать байты из памяти по конкретному адресу. или все же для корректной работы в других ОС или возможно новых нововведениях в самой структуре PE лучше все оставить так как есть?


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



****


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

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



Цитата(shara @  14.1.2009,  21:22 Найти цитируемый пост)
можно ли читать нужные мне биты файла, зная только начало PE заголовка + смещение нужного поля в структуре. тогда не нужно будет каждый раз работать со структурами а сразу читать байты из памяти по конкретному адресу

можно, pe формат никогда не поменяется, для 32-разрядных ОС по кр мере
PM MAIL ICQ   Вверх
jonie
Дата 15.1.2009, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



http://www.pelib.com/index.php
гугл поможет не зная формата работать с ним)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
shara
Дата 15.1.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



блин, столкнулся с проблемой 
как можно узнать начало PE заголовка загруженного в память файла... у меня возникло бОльшое подозрение что GetModuleHandle(NULL) не всегда прав. 
пробовал искать РЕ по адресу 0х4000Е0 интересная штука получается, если любой файл откомпилить с опицей DEBUG то все нормально и PE находится по выше указанному адресу... компилю значит этот же файл с опцией RELIS и нифига - никакого PE по адресу 0х4000Е0 нет! че такое????  smile  smile  smile

Добавлено через 1 минуту и 21 секунду
jonie, всеже предпочитаю не использовать чужую либу, хочу сам разобраться  smile 


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


Эксперт
****


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

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



Цитата(shara @  15.1.2009,  22:32 Найти цитируемый пост)
как можно узнать начало PE заголовка загруженного в память

Цитата

PIMAGE_NT_HEADERS ImageNtHeader(
  PVOID ImageBase
);
...
Requirements
Header: Declared in Dbghelp.h.
Library: Use Dbghelp.lib.



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



****


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

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



shara, ты вообще про PE формат читал?
raw offset (и rva) PE-заголовка находится по смещению 0x3C (поле IMAGE_DOS_HEADER.e_lfanew)

Это сообщение отредактировал(а) GoldFinch - 15.1.2009, 21:43
PM MAIL ICQ   Вверх
shara
Дата 15.1.2009, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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

#include "stdafx.h"
#include <Windows.h>

#define NTSIGNATURE(a)  ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew))

int _tmain(int argc, _TCHAR* argv[])
{
    char *base = (char*)GetModuleHandle(NULL);
    printf("NT signature = %s",NTSIGNATURE(base));

    return 0;
}

 smile

Добавлено через 2 минуты и 57 секунд
GoldFinch, 
Цитата(GoldFinch @  15.1.2009,  20:43 Найти цитируемый пост)
raw offset (и rva) PE-заголовка находится по смещению 0x3C (поле IMAGE_DOS_HEADER.e_lfanew)

да да да а я гдето в одной из статей краем глаза увидел +0хE0 на там файле на котором все тестировал проконало. когда пошел дальше начались глюки ... бывает, я не волшебник и с РЕ работаю всего второй день))))


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



****


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

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



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


Эксперт
****


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

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



Цитата(GoldFinch @  15.1.2009,  23:43 Найти цитируемый пост)
ты вообще про PE формат читал?

GoldFinch, а ты вправе кому-либо на это указывать, узнав о спецификации незадолго до shara?
Цитата(GoldFinch @  3.12.2008,  17:28 Найти цитируемый пост)
в "спецификации" ПЕ истине соответствует около половины. ее лучше не читать.

тем более с такими высказываниями
shara, а это тебе место, где GoldFinch уже наступил на свои грабли и теперь зовет тебя на них наступить, чтобы ему не было так одиноко: http://forum.vingrad.ru/index.php?showtopi...t&p=1715653
дело, конечно твое, кого слушать, мое дело - предупредить )


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


Опытный
**


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

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



GremlinProg, 
насчет использования ImageNtHeader я тоже подумывал, но мне важна скорость работы моего приложения потому-что оно будет запускаться очень много раз. а на работу АПИшных функций понадобиться время(пусть даже и не большое но это критичный параметр). решил все же использовать описание структур из файла Winnt.h и жестко к ним привязываться (жертвуем универсальностью за скорость) тут я согласен с  GoldFinch что PE врядли измениться в актуальное время

думаю что идея использованная мною в маленьком ЕХЕшнике описанном выше заслуживает на жизнь 


to 
GoldFinch, 
Цитата(GoldFinch @  15.1.2009,  21:37 Найти цитируемый пост)
да.. такими  темпами ты нескоро чтонить толковое сделаешь... 
  я это все пишу на работе, в рабочее время, т.е. многозадачность рулит  smile 



--------------------
   с точки зрения аэродинамики шмель не может летать  
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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