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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Секции в PE, создание секции в pe 
:(
    Опции темы
Alexey68
Дата 3.11.2013, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Alexey
*


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

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



Привет всем.
Может плохо искал, но так ничего подробного не нашёл.
Интересует программное создание секции из массива данных.
Как это выглядит схематично по пунктам?
Есть ли у кого примеры или ссылки с подробным описанием?
p.s. с pe форматом знаком.


PM MAIL   Вверх
GremlinProg
Дата 3.11.2013, 07:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Я как-то делал, только зачем? В моем случае - это было добавление некоторой информации в PE по классам C++, которой не предоставляли штатные средства компилятора: чтобы предки могли что-то знать о своих потомках. И эта добавка внедрялась только на этапе сборки проекта.

В целом - неперспективное занятие, ибо сильно специализировано под конкретное использование модели ООП.

Это сообщение отредактировал(а) GremlinProg - 3.11.2013, 07:54


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


Alexey
*


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

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



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


Эксперт
****


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

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



Цитата(Alexey68 @  3.11.2013,  15:00 Найти цитируемый пост)
но тогда мне придётся зависеть от компилятора и постоянно создавать заголовочный файл и т.п., а я хочу программно добавлять секцию с данными и не зависеть от компилятора

Для дополнительных данных приложения существует секция ресурсов, в нее штатно можно добавить любой файл.

В этом плане, создание дополнительной секции в PE равнозначно изобретению колеса.


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


Alexey
*


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

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



>>Для дополнительных данных приложения существует секция ресурсов, в нее штатно можно добавить любой файл.
в уже готовый exe?, размер данных постоянно разный
>>В этом плане, создание дополнительной секции в PE равнозначно изобретению колеса
мне как необходимо создание дополнительной секции, у Вас есть материалы по этому вопросу?

Это сообщение отредактировал(а) Alexey68 - 3.11.2013, 13:21
PM MAIL   Вверх
GremlinProg
Дата 3.11.2013, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alexey68 @  3.11.2013,  15:16 Найти цитируемый пост)
в уже готовый exe?

да, в уже готовый exe )

Добавлено через 1 минуту и 26 секунд
смотрите документацию: Adding, Deleting, and Replacing Resources

Добавлено через 6 минут и 43 секунды
Цитата(Alexey68 @  3.11.2013,  15:16 Найти цитируемый пост)
мне как необходимо создание дополнительной секции

не понял 


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


Alexey
*


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

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



то есть я имею ввиду что имеем 2 файла, один исполняемый другой например pdf, затем третьей программе указываем 1 (exe) и второй pdf и после чего в ресурсы 1го файла будет добавлен pdf.
Как это выполнить программно?
PM MAIL   Вверх
GremlinProg
Дата 3.11.2013, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Добавьте сначала в исходное приложение ресурс RT_RCDATA, например так: http://msdn.microsoft.com/en-us/library/wi...9(v=vs.85).aspx , в нем будет лежать pdf.

После этого напишите аналог этого рпимера: http://msdn.microsoft.com/en-us/library/wi...ating_Resources, только вместо lpResLock передавайте адрес буфера, в котором лежит pdf.

p.s.: тип ресурса и его идентификатор должны совпадать в обоих приложениях


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


Alexey
*


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

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



Создал файл вида:
Код

resname RCDATA
{
0x33,0x23,0x11 ...n//массив байт
}

и сохранил его под именем myres.rc, подключил его к проекту:
project-add to project (в c++ builder 2007)
как теперь я могу обращаться к массиву данных (расположенных в файле ресурсов) из приложения?

Код

#include <stdio.h>
#include <windows.h>

void main()
{
HMODULE hMod;
HRSRC hRes;
    hMod=GetModuleHandle(NULL);
    if(!hMod)
    {
      printf("error\n");
    }

    hRes=FindResource(hMod,"resname",RT_RCDATA);

    if(!hRes)
    {
      printf("error\n");
    }
    printf("%08X\n", hRes);
system("pause");
}

в этом примере я получаю адрес (hRes) на начало файла ресурсов, но как получить начало массива данных?


Это сообщение отредактировал(а) Alexey68 - 3.11.2013, 17:40
PM MAIL   Вверх
GremlinProg
Дата 4.11.2013, 07:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alexey68 @  3.11.2013,  18:15 Найти цитируемый пост)
как получить начало массива данных?

1. FindResource
2. LoadResource
3. LockResource


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


Эксперт
***


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

Репутация: 16
Всего: 39





--------------------
Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte")
PM MAIL   Вверх
Alexey68
Дата 5.11.2013, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Alexey
*


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

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



Спасибо за помощь, интересует теперь как загрузить масиив байт в ресурсы exe'шника, так не получается, что у меня тут неправильно?:
Код

#include <stdio.h>
#include <windows.h>
#include "pdf.h"
void main()
{
HMODULE hMod, LoadExe;
HRSRC hRes;
HGLOBAL hGlob;
BYTE *lpbArray;
HANDLE hUpdateRes;  // update resource handle

hMod = LoadLibraryA("test.exe");
//hMod=GetModuleHandle(LoadExe);

    if(!hMod)
    {
    printf("Error\n");
    }
    hRes=FindResource(hMod,"resname",RT_RCDATA);

    if(!hRes)
    {
    printf("Error\n");
    }

    hGlob=LoadResource(hMod,hRes);

    if(!hGlob)
    {
    printf("Error\n");
    }

    lpbArray=(BYTE*)LockResource(hGlob);
    if(!lpbArray)
    {
    printf("Error\n");
    }
hUpdateRes = BeginUpdateResource("test.exe", FALSE);
    if (hUpdateRes == NULL)
    {
    printf("Error\n");
    }
UpdateResource(hUpdateRes,       // update resource handle
         RT_RCDATA,                   // change dialog box resource 
         "resname",                  // dialog box name 
         MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US),  // neutral language
         Pdf_array,                   // ptr to resource info 
         sizeof(Pdf_array)); // size of resource info.
EndUpdateResource(hUpdateRes, FALSE);

system("pause");
}

сам файл ресурсов имеет вид:
Код

resname RCDATA
{
'23','47','80','50','32','00','00','00','78','00'.....n
}


Это сообщение отредактировал(а) Alexey68 - 5.11.2013, 11:19
PM MAIL   Вверх
GremlinProg
Дата 5.11.2013, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Alexey68 @  5.11.2013,  13:16 Найти цитируемый пост)
что у меня тут неправильно?

пока, на первый взгляд, не выполнено вот это условие:
Цитата

An application must be able to obtain write-access to this file; the file referenced by pFileName cannot be currently executing


Добавлено через 1 минуту и 53 секунды
т.е его нарушает загрузка образа через LoadLibrary, зачем это вообще?


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


Alexey
*


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

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



С добавлением разобрался:
Код

hUpdateRes = BeginUpdateResource(file_name, TRUE);//если установить False, то помимо имеющегося 
//ресурса с именем RESNAME (добавленного в среде c++ builder), 
//добавится ещё один с таким же именем, 
//но в нижнем регистре
result = UpdateResource(hUpdateRes,
     RT_RCDATA,                
     "resname",                
     MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
     array_rc,                 
     size); 

после этого открываю с помощью ресторатора и там находится заменённый мной ресурс в папке RC_DATA ресурс resname.
Далее при попытке доступа к массиву байт добавленного мной выше, я получаю нулевой адрес ресурса хотя ресурс на самом деле додбавлен, использую этот код:
Код

hMod=GetModuleHandle(NULL);
    if(!hMod)
    {
    printf("Error\n");
    }
    hRes=FindResource(hMod, "resname", RT_RCDATA);
    if(!hRes)
    {
    printf("Error\n");
    }
    hGlob=LoadResource(hMod,hRes);
    if(!hGlob)
    {
    printf("Error\n");
    }
    lpbArray=(BYTE*)LockResource(hGlob);
    if(!lpbArray)
    {
    printf("Error\n");
    }
   printf("%08X", lpbArray);//нулевой указатель

но массив байт на самом деле имеется, в чём может быть ошибка всё вроде правильно?...
to:
GremlinProg
>>как успехи?
С помощью приведённого мной выше кода не могу получить доступ к массиву

Это сообщение отредактировал(а) Alexey68 - 10.11.2013, 04:45
PM MAIL   Вверх
GremlinProg
Дата 9.11.2013, 07:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



как успехи?


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.0559 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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