Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PE-Exe: Добавление новой секции, В чем ошибка ? 
:(
    Опции темы
p0s0l
  Дата 20.12.2003, 19:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



Кто-нибудь скажите, в чем тут трабл...
Мне нужно добавить новую секцию в PE-файл (секция размером примерно 400-500 байт), но это не работает...
Что я сделал не так ?

Код
procedure TForm1.btnAttachClick(Sender: TObject);
type
 PCardinal = ^Cardinal;
 TSectName = packed array[0..IMAGE_SIZEOF_SHORT_NAME-1] of char;
 TSectionsArray = packed array [0..0] of _IMAGE_SECTION_HEADER;
 PSectionsArray = ^TSectionsArray;

var
 i : cardinal;
 f : THandle;
 FileSize, BytesRead, BytesWritten : cardinal;
 Buf : pointer;
 BufAdr : cardinal absolute Buf;
 MaxRVA, MaxRVAIndex : cardinal;

 ObjectEntry : PImageSectionHeader;
 idh : PImageDosHeader absolute Buf;
 ifh : PImageFileHeader;
 ioh : PImageOptionalHeader;
 ish : PSectionsArray;

begin
// Открытие файла
 f := CreateFile (PChar('c:\project2.exe'),
                  GENERIC_READ + GENERIC_WRITE,
                  0,
                  nil,
                  OPEN_EXISTING,
                  0,
                  0);

 if f = INVALID_HANDLE_VALUE then Exit;

 FileSize := GetFileSize (f, nil);
 FileSize := (FileSize and $fffff000) + $1000;

 BufAdr := GlobalAlloc (0, FileSize + AttachDataSize);

 ReadFile (f, Buf^, FileSize, BytesRead, nil);

// Адреса заголовков
 ifh := PImageFileHeader (BufAdr + idh._lfanew + 4);
 ioh := PImageOptionalHeader (cardinal(ifh) + IMAGE_SIZEOF_FILE_HEADER);

// Указатель на массив секций
 ish := PSectionsArray (cardinal(ioh) + IMAGE_SIZEOF_NT_OPTIONAL_HEADER);

// Поиск максимального RVA
 MaxRVA := ish[0].VirtualAddress;
 MaxRVAIndex := 0;
 for i := 1 to ifh.NumberOfSections-1 do
   if ish[i].VirtualAddress > MaxRVA then
   begin
     MaxRVA := ish[i].VirtualAddress;
     MaxRVAIndex := i;
   end;

// Заполнение новой секции
 ObjectEntry := @(ish[ifh.NumberOfSections]);

 FillChar (ObjectEntry^, SizeOf(ObjectEntry^), 0);
 TSectName(ObjectEntry.Name)  := 'CODE2'#0#0#0;
 ObjectEntry.Misc.VirtualSize := $00001000;
 ObjectEntry.SizeOfRawData    := $00001000;
 ObjectEntry.Characteristics  := $c0000040; // Read+Write, Initialized data

 ObjectEntry.VirtualAddress := ((MaxRVA + ish[MaxRVAIndex].Misc.VirtualSize) and $FFFFF000) + $1000;

 ObjectEntry.PointerToRawData := ish[ifh.NumberOfSections-1].PointerToRawData + ish[ifh.NumberOfSections-1].SizeOfRawData;

// Увеличение числа секций
 Inc (ifh.NumberOfSections);

// Запись измененного файла
 SetFilePointer (f, 0, nil, FILE_BEGIN);
 WriteFile (f, Buf^, ObjectEntry.PointerToRawData + ObjectEntry.SizeOfRawData, BytesWritten, nil);

// Конец
 GlobalFree (BufAdr);

 CloseHandle (f);
end;




--------------------
С уважением, г-н Посол.
PM   Вверх
p0s0l
Дата 20.12.2003, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



При запуске пишет "Error Executing Program" - т.е. ошибка в структуре файла.
Действия таковы:
В разделе секций дописываю одну секцию (параметры высчитываю вроде правильно)
Увеличиваю количество секций в заголовке IMAGE_FILE_HEADER.
В конец файла дописываю кусочек данных

Параметры у секции высчитываются так:
физич. адрес = физ. адрес последней секции + физ. размер последней секции
вирт. адрес = макс. вирт. адрес из всех секций + вирт. размер этой секции (у которой найден макс. виртуальный адрес), выравненный по границе страницы.
размер и физический и виртуальный = 4096 байт (1000h), если ставлю реальный размер (456 байт), то непомогает...

Это сообщение отредактировал(а) p0s0l - 20.12.2003, 19:20


--------------------
С уважением, г-н Посол.
PM   Вверх
stab
Дата 21.12.2003, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Попробуй поменять ioh.SizeOfImage, значение должно быть кратно Object Align. И еще понять не могу зачем это:

Код

FileSize := GetFileSize (f, nil);
FileSize := (FileSize and $fffff000) + $1000


выравнивание что ли?


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
p0s0l
Дата 21.12.2003, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

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



cully, спасибо, помогло.



--------------------
С уважением, г-н Посол.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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