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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Просмотр PE структуры 
:(
    Опции темы
Joker07
  Дата 6.11.2008, 01:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Пишу программу, просматривающую PE заголовок, не использую структуры, описанные в windows.pas. Так уж вышло что начал описывать их сам, в отдельном модуле, незнал, что оно уже все давно расписано в оном файлике.
Так вот, DOS, PE, Optional PE, Data Directories, Sessions я считываю и вывожу. Хочу также вывести таблички импорта/экспорта (как минимум) и ресурсы. Вот с этим у меня проблема.
Для начала:
1. Как преобразовать значение Time_Date_Stamp в удобоваримый вид, типа Mon Mar 06 04:10:48 MSK 2006 ?
2. Как получить список всех экспортируемых  функций - имя, адрес, ординал?

Пишу так:
Код


{ переменные }
  PEfile    :file;                          // анализируемый  файл
  EXEHead :T_DOS_HEADER;   // указатель на DOS заголовок
  PEhead    :T_PE_Header;        // указатель на PE заголовок
  Export_Table  :T_Export_Directory_Table;  // указатель на таблицу экспорта

{ поля таблицы}
  T_Export_Directory_Table = packed record
{ 00 }  Flags                     : DWord;
{ 04 }  Time_Date_Stamp           : DWord;
{ 08 }  Major_Version             : Word;
{ 0A }  Minor_Version             : Word;
{ 0C }  Name_RVA                  : DWord;
{ 10 }  Ordinal_Base              : DWord;
{ 14 }  Number_of_Functions       : DWord;
{ 18 }  Number_of_Names           : DWord;
{ 1C }  Address_of_Functions      : DWord;
{ 20 }  Address_of_Names          : DWord;
{ 24 }  Address_of_Ordinals       : DWord;
  end;


{ Далее после выбора файла пишу }

 BlockRead(PEfile, EXEHead, SizeOf(T_PE_Header));     // считываю DOS заголовок
 Seek (PEfile, EXEhead.e_lfanew);                                 // нахожу адрес PE заголовока
 BlockRead (PEfile, PEhead, SizeOf(T_PE_Header));      // считываю PE заголовок
Seek (PEfile, PEhead.Export_Table_RVA);                     // нахожу адрес таблицы экспорта
BlockRead (PEfile, Export_Table, SizeOf(T_Export_Directory_Table));  // считываю таблицу экспорта


PM MAIL   Вверх
RA
Дата 6.11.2008, 02:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Брутальный буратина
****


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

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



PM   Вверх
Joker07
Дата 6.11.2008, 19:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Как преобразовать значение Time_Date_Stamp в удобоваримый вид, типа Mon Mar 06 04:10:48 MSK 2006 ?
PM MAIL   Вверх
Joker07
Дата 12.11.2008, 22:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Не пойму как отобразить список импортируемых функций. Единственно стоящий материал нашел по адресу http://www.wasm.ru/article.php?article=1002006 Только вот примеры там на асме, а в нем я нуль.
Там пишут:
Пpедставьте, что мы хотим создать список ВСЕХ импоpтиpуемых функций PE-файла. Для этого нам потpебуетя сделать следующие шаги.

    * Убедиться, что файл является Portable Executable
    * От DOS-заголовка пеpейти к PE-заголовку
    * Получить адpес диpектоpии данных в OptionalHeader
    * Пеpейти ко втоpому элементу диpектоpии данных. Извлечь значение VirtualAddress
    * Использовать это значение, чтобы пеpейти к пеpвой стpуктуpе IMAGE_IMPORT_DESCRIPTOR
    * Пpовеpьте значение OriginalFirstThunk. Если оно не pавно нулю, следуйте RVA в OriginalFirstThunk, чтобы пеpейти к RVA-массиву. Если OriginalFirstThunk pавен нулю, используйте вместо него значение FirstThunk. Hекотоpые линкеpы генеpиpуют PE-файлы с 0 в OriginalFirstThunk. Это считается багом. Только для того, чтобы подстpаховаться, мы сначала пpовеpяем значение OriginalFirstThunk.
    * Мы сpавниваем значение каждого элемента массива с IMAGE_ORDINAL_FLAG32. Если MSB pавен единице, значит функция экспоpтиpуется чеpез оpдинал и мы можем получить его из нижнего слова элемента.
    * Если MSB pавен нулю, используйте значение элемента как RVA на IMAGE_IMPORT_BY_NAME, пpопустите Hint, и вы у имени функции.
    * Пеpейдите к следующему элементу массива и извлекайте имена пока не будет достигнут конец массива (он кончается null'ом). Сейчас мы получили имена функций, импоpтиpованных из данной DLL. Пеpеходим к следующей DLL.
    * Пеpейдите к следующему IMAGE_IMPORT_DESCRIPTOR'у и обpаботайте его. Делайте это, пока не обpаботаете весь массив (массив IMAGE_IMPORT_DESCRIPTOR кончается элементом с полями, заполненными нулями). 

Используемые там структуры: 
Код

  IMAGE_IMPORT_DESCRIPTOR STRUCT
     union
       Characteristics dd ?
       OriginalFirstThunk dd ?
     ends
     TimeDateStamp dd ?
     ForwarderChain dd ?
     Name1 dd ?
     FirstThunk dd ?
   IMAGE_IMPORT_DESCRIPTOR ENDS

   IMAGE_IMPORT_BY_NAME STRUCT
     Hint dw ?
     Name1 db ?
   IMAGE_IMPORT_BY_NAME ENDS

С седьмого пункта я уже ни черта не понимаю. После получения полей структуры IMAGE_IMPORT_DESCRIPTOR (у меня это Import_Table) пишу так:
Код

//const IMAGE_ORDINAL_FLAG32=$80000000; 

with Import_Table do
  begin
    if Original_First_Thunk<>0 then seek(pefile, Original_First_Thunk)
    else
    seek(pefile, First_Thunk);

    if Original_First_Thunk=IMAGE_ORDINAL_FLAG32 then 
//  ???????
  end;

Помогите пж-та  smile 
PM MAIL   Вверх
Riply
Дата 13.11.2008, 00:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(Joker07 @  12.11.2008,  22:40 Найти цитируемый пост)
Помогите пж-та    


Для начала, я бы выбросила к чертовой бабушке все BlockRead, seek и иже с ними,
а использовала бы MMF.

Насчет остального...
Для подгядывания, как с этим боролись другие  smile 
рискну дать юнит (с) Игоря Шевченко аж от 2003 г.
Надеюсь, он не будет возражать, что выкладываются столь давнишние его работы smile
(Если понадобятся "зависимые" юниты - они есть. Но в них все стандартно.
Вся работа с указателями и смещениями в этом юните)
Код

type
 PDWordArray = ^TDWordArray;
 TDWordArray = array[0..8191] of DWord;
 USHORT = Word;

 PIMAGE_NT_HEADERS = PImageNtHeaders;
 PIMAGE_DATA_DIRECTORY = ^IMAGE_DATA_DIRECTORY;

 PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
 IMAGE_IMPORT_DESCRIPTOR = packed record
   Characteristics: Cardinal;
   TimeDateStamp: Cardinal;
   ForwarderChain: Cardinal;
   Name: Cardinal;
   FirstThunk: Cardinal;
 end;

 IMAGE_IMPORT_BY_NAME = packed record
   Hint: WORD;
   Name: Char;
 end;
 PIMAGE_IMPORT_BY_NAME = ^IMAGE_IMPORT_BY_NAME;

 TDelayLoadImportTableItem = packed record
  Flags: LongInt;
  DllName: Cardinal;
  Handle: Cardinal;
  EpAddresses: Cardinal;
  ImportNameTable: Cardinal;
  Reserved2: Cardinal;
  Reserved3: Cardinal;
  Reserved4: Cardinal;
 end;
 PDelayLoadImportTableItem = ^TDelayLoadImportTableItem;

 TDelayLoadImportTableItemArray = array [0..1024] of TDelayLoadImportTableItem;
 PDelayLoadImportTableItemArray = ^TDelayLoadImportTableItemArray;

 PDelayLoadEntryItem = PIMAGE_IMPORT_BY_NAME;

 TPEImage = class(TDosImage)
 private
   FMapper: THSFileMapper;
   FModuleReferences: TStrings;
   FImportLibraries: TStringList;
   FNtHeaders: PIMAGE_NT_HEADERS;
   FSections: TList;
   FImports: TStringList;
   FDelayImports: TStringList;
   FExports: TStringList;
   function GetSection(I: Integer): PImageSectionHeader;
   procedure LoadSections (Mapper: THSFileMapper);
   procedure LoadModuleReferences (Mapper: THSFileMapper);
   function GetImportedNameFromIATEntry (IATEntryRVA: DWord; FullInfo: Boolean = false): string;
   function GetSubSystem: THSSubSystem;
   function GetImports: TStrings;
   procedure LoadImports;
   procedure LoadDelayImports;
   function GetDelayImports: TStrings;
   procedure LoadExports;
   function GetExports: TStrings;
 protected
   procedure Load(Mapper: THSFileMapper); override;
 public
   constructor Create(const FileName: string); override;
   destructor Destroy; override;
   function EpCode: PByteArray; override;
   function RawAddress(VirtualAddress: Cardinal): Cardinal;
   function GetFullImportedFunctionName(const DllName: string; IATEntryRVA: DWord): string;
   function GetImportedFunctionName(const DllName: string; IATEntryRVA: DWord): string;
   function FindSection (VirtualAddress: Cardinal): PImageSectionHeader;
   function FindVirtualSection (VirtualAddress: Cardinal): PImageSectionHeader;
   function ConvertRVA(const RVA: Cardinal; var ASectionNumber: Integer; var AOffset: Cardinal): Boolean;
   property Mapper: THSFileMapper read FMapper;
   property ModuleReferences: TStrings read FModuleReferences;
   property ImportLibraries: TStringList read FImportLibraries;
   property NtHeaders: PIMAGE_NT_HEADERS read FNtHeaders;
   property SectionList: TList read FSections;
   property Sections[I: Integer]: PImageSectionHeader read GetSection;
   property Subsystem: THSSubSystem read GetSubSystem;
   property Imports: TStrings read GetImports;
   property ImageExports: TStrings read GetExports;
   property DelayImports: TStrings read GetDelayImports;
 end;

const
 IMAGE_FILE_LARGE_ADDRESS_AWARE = $0020;

 IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8;
 IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9;
 IMAGE_SUBSYSTEM_EFI_APPLICATION = 10;
 IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11;
 IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12;
 IMAGE_SUBSYSTEM_EFI_ROM = 13;
 IMAGE_SUBSYSTEM_XBOX = 14;

 IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = $0200;
 IMAGE_DLLCHARACTERISTICS_NO_SEH = $0400;
 IMAGE_DLLCHARACTERISTICS_NO_BIND = $0800;
 IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = $2000;
 IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = $8000;

 IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT  = 13;
 IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR = 14;

implementation

{ TPEImage }

constructor TPEImage.Create(const FileName: string);
begin
 inherited Create(FileName);
 FSections := TList.Create;
 FModuleReferences := TStringList.Create;
 FImportLibraries := TStringList.Create;
 FExports := TStringList.Create;
 with FImportLibraries do begin
   Sorted := true;
   Duplicates := dupIgnore;
 end;
 FMapper := THSFileMapper.Create(FileName);
 Load(FMapper);
end;

destructor TPEImage.Destroy;
begin
 FMapper.Free;
 FImportLibraries.Free;
 FModuleReferences.Free;
 FSections.Free;
 FImports.Free;
 FDelayImports.Free;
 FExports.Free;
 inherited;
end;

function TPEImage.EpCode: PByteArray;
var
 EpAddr: DWord;
begin
 EpAddr := RawAddress(NtHeaders^.OptionalHeader.AddressOfEntryPoint);
 if EpAddr <> 0 then
   Result := PByteArray(FMapper.Map + EpAddr)
 else
   Result := nil;
end;

function TPEImage.FindSection(VirtualAddress: Cardinal): PImageSectionHeader;
var
 I: Integer;
begin
 Result := nil;
 for I := 0 to Pred(FSections.Count) do
   if (Sections[I].VirtualAddress <= VirtualAddress) and
      (VirtualAddress < Sections[I].VirtualAddress +
       Sections[I].SizeOfRawData) then begin
     Result := Sections[I];
     Break;
   end;
end;

function TPEImage.FindVirtualSection(VirtualAddress: Cardinal): PImageSectionHeader;
var
 I: Integer;
begin
 Result := nil;
 for I := 0 to Pred(FSections.Count) do
   if (Sections[I].Characteristics and IMAGE_SCN_CNT_CODE) = 0 then begin
     if (Sections[I].VirtualAddress <= VirtualAddress) and
        (VirtualAddress < Sections[I].VirtualAddress +
         Sections[I].Misc.VirtualSize) then begin
       Result := Sections[I];
       Break;
     end
   end else
     if (Sections[I].VirtualAddress <= VirtualAddress) and
        (VirtualAddress < Sections[I].VirtualAddress +
         Sections[I].SizeOfRawData) then begin
       Result := Sections[I];
       Break;
     end;
end;

function TPEImage.ConvertRVA(const RVA: Cardinal; var ASectionNumber: Integer; var AOffset: Cardinal): Boolean;
var
 Section: PImageSectionHeader;
begin
 Result := false;
 if RVA > FNtHeaders.OptionalHeader.ImageBase then
   AOffset := RVA - FNtHeaders.OptionalHeader.ImageBase
 else
   AOffset := RVA;
 Section := FindVirtualSection(AOffset);
 if Assigned(Section) then begin
   ASectionNumber := Succ(FSections.IndexOf(Section));
   Result := true;
 end;
end;

function TPEImage.GetDelayImports: TStrings;
begin
 if not Assigned(FDelayImports) then begin
   FDelayImports := TStringList.Create;
   FDelayImports.Sorted := true;
   FDelayImports.Duplicates := dupIgnore;
   LoadDelayImports;
 end;
 Result := FDelayImports;
end;

function TPEImage.GetExports: TStrings;
begin
 Result := FExports;
end;

function TPEImage.GetFullImportedFunctionName(const DllName: string;
 IATEntryRVA: DWord): string;
begin
 if (IATEntryRVA and $80000000) <> 0 then
   Result := Format('%s.%d', [ChangeFileExt(DllName, ''),
     (IATEntryRVA and $7FFFFFFF)])
 else
   Result := Format('%s.%s', [ChangeFileExt(DllName, ''),
     GetImportedNameFromIATEntry(IATEntryRVA, true)]);
end;

function TPEImage.GetImportedFunctionName(const DllName: string; IATEntryRVA: DWord): string;
begin
 if (IATEntryRVA and $80000000) <> 0 then
   Result := Format('%s.%d', [ChangeFileExt(DllName, ''), (IATEntryRVA and $7FFFFFFF)])
 else
   Result := Format('%s.%s', [ChangeFileExt(DllName, ''), GetImportedNameFromIATEntry(IATEntryRVA)]);
end;

function TPEImage.GetImportedNameFromIATEntry(IATEntryRVA: DWord; FullInfo: Boolean): string;
var
 RawOffset: DWord;
begin
 RawOffset := RawAddress (IATEntryRVA);
 Result := StrPas(RawData + RawOffset + SizeOf(Word));
 if FullInfo then
   Result := Format('%s (Hint=%.4x)', [Result, PIMAGE_IMPORT_BY_NAME(RawData + RawOffset)^.Hint]);
end;

function TPEImage.GetImports: TStrings;
begin
 if not Assigned(FImports) then begin
   FImports := TStringList.Create;
   FImports.Sorted := true;
   FImports.Duplicates := dupIgnore;
   LoadImports;
 end;
 Result := FImports;
end;

function TPEImage.GetSection(I: Integer): PImageSectionHeader;
begin
 Result := PImageSectionHeader(FSections[I]);
end;

function TPEImage.GetSubSystem: THSSubSystem;
begin
 with NtHeaders.OptionalHeader.DataDirectory[
     IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR] do
   if (VirtualAddress <> 0) and (Size <> 0) then
     Result := hsssDotNet
   else
     case NtHeaders^.OptionalHeader.Subsystem of
     IMAGE_SUBSYSTEM_WINDOWS_GUI:
       Result := hsssGUI32;
     IMAGE_SUBSYSTEM_WINDOWS_CUI:
       Result := hsssCon32;
     IMAGE_SUBSYSTEM_NATIVE:
       Result := hsssNative;
     else
       Result := hsssUnknown;
     end;
end;

procedure TPEImage.Load(Mapper: THSFileMapper);
begin
 inherited;
 FNtHeaders := PIMAGE_NT_HEADERS(Mapper.Map + DosHeader^._lfanew);
 LoadSections(Mapper);
 LoadModuleReferences(Mapper);
 LoadExports;
end;

procedure TPEImage.LoadDelayImports;
var
 RawOffset: Integer;
 ImportDescriptor: PDelayLoadImportTableItem;
 DllName: string;
 PFunctionsAddress: PDWord;
 ImportAddress: DWord;
begin
 with NtHeaders^.OptionalHeader.DataDirectory[
     IMAGE_DIRECTORY_ENTRY_DELAY_IMPORT] do begin
   if (VirtualAddress = 0) or (Size = 0) then
     Exit;
   RawOffset := RawAddress(VirtualAddress);
 end;
 ImportDescriptor := PDelayLoadImportTableItem(RawData + RawOffset);
 while ImportDescriptor^.DllName <> 0 do begin
   if ImportDescriptor^.Flags = 1 then begin
     RawOffset := RawAddress(ImportDescriptor^.DllName);
     if RawOffset <> 0 then
       DllName := UpperCase(StrPas(RawData + RawOffset));
     RawOffset := RawAddress(ImportDescriptor^.ImportNameTable);
     PFunctionsAddress := PDWord(RawData + RawOffset);
     while PFunctionsAddress^ <> 0 do begin
       ImportAddress := PFunctionsAddress^;
       FDelayImports.Add(GetImportedFunctionName(DllName, ImportAddress));
       Inc(PFunctionsAddress);
     end;
   end;
   Inc(ImportDescriptor);
 end;
end;

procedure TPEImage.LoadExports;
var
 Offset, RawOffset: Cardinal;
 ExportDirectory: PImageExportDirectory;
 I: DWord;
 PFunctionsAddress: PDWord;

 function FindNameForOrdinal(Ordinal: Word): string;
 var
   J, K: DWord;
   POrdinals: PWordArray;
   PNames: PDWordArray;
   PName: DWord;
 begin
   Result := '';
   POrdinals := PWordArray(RawData + RawAddress(Integer(ExportDirectory^.AddressOfNameOrdinals)));
   K := DWord(-1);
   for J:= 1 to ExportDirectory^.NumberOfNames do
    if POrdinals^[J - 1] = Ordinal then
     begin
      K := J - 1;
      Break;
     end;
   if K = DWord(-1) then Exit;

   PNames := PDWordArray(RawData + RawAddress(Integer(ExportDirectory^.AddressOfNames)));
   PName := PNames^[K];
   Result := StrPas(RawData + RawAddress(PName));
 end;

begin
 Offset := FNtHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
 if Offset = 0 then Exit;

 RawOffset := RawAddress(Offset);
 ExportDirectory := PImageExportDirectory(RawData + RawOffset);
 Offset := Cardinal(ExportDirectory^.AddressOfFunctions);
 RawOffset := RawAddress(Offset);
 PFunctionsAddress := PDWord(RawData + RawOffset);
 for I:=1 to ExportDirectory^.NumberOfFunctions do
  begin
   if PFunctionsAddress^ <> 0 then FExports.AddObject(FindNameForOrdinal(Word(I - 1)), TObject(PFunctionsAddress^));
   Inc(PFunctionsAddress);
  end;
end;

procedure TPEImage.LoadImports;
var
 RawOffset: Integer;
 ImportDescriptor: PIMAGE_IMPORT_DESCRIPTOR;
 DllName: string;
 PFunctionsAddress: PDWord;
 ImportAddress: DWord;
begin
 with NtHeaders^.OptionalHeader.DataDirectory[
     IMAGE_DIRECTORY_ENTRY_IMPORT] do begin
   if (VirtualAddress = 0) or (Size = 0) then
     Exit;
   RawOffset := RawAddress(VirtualAddress);
 end;
 ImportDescriptor := PIMAGE_IMPORT_DESCRIPTOR(RawData + RawOffset);
 while ImportDescriptor^.Name <> 0 do begin
   RawOffset := RawAddress(ImportDescriptor^.Name);
   if RawOffset <> 0 then
     DllName := UpperCase(StrPas(RawData + RawOffset));
   if ImportDescriptor^.Characteristics = 0 then
     RawOffset := RawAddress(ImportDescriptor^.FirstThunk)
   else
     RawOffset := RawAddress(ImportDescriptor^.Characteristics);
   PFunctionsAddress := PDWord(RawData + RawOffset);
   while PFunctionsAddress^ <> 0 do begin
     ImportAddress := PFunctionsAddress^;
     FImports.Add(GetImportedFunctionName(DllName, ImportAddress));
     Inc(PFunctionsAddress);
   end;
   Inc(ImportDescriptor);
 end;
end;

procedure TPEImage.LoadModuleReferences(Mapper: THSFileMapper);
var
 IAddr: DWord;
 PImport: PIMAGE_IMPORT_DESCRIPTOR;
 PModName: PChar;
begin
 with NtHeaders^.OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] do
   if Size <> 0 then begin
     IAddr := RawAddress(VirtualAddress);
     PImport := PIMAGE_IMPORT_DESCRIPTOR(Mapper.Map + IAddr);
     while PImport^.Name <> 0 do begin
       PModName := Mapper.Map + RawAddress(PImport^.Name);
       FModuleReferences.Add(PModName);
       FImportLibraries.Add(UpperCase(PModName));
       Inc(PImport);
     end;
   end;
end;

procedure TPEImage.LoadSections(Mapper: THSFileMapper);
var
 PSection: PImageSectionHeader;
 I: Integer;
begin
 PSection := PImageSectionHeader(DWord(@(NtHeaders^.OptionalHeader)) +
       NtHeaders^.FileHeader.SizeOfOptionalHeader);
 for I:=1 to NtHeaders^.FileHeader.NumberOfSections do begin
   FSections.Add (PSection);
   Inc(PSection);
 end;
end;

function TPEImage.RawAddress(VirtualAddress: Cardinal): Cardinal;
var
 I: Integer;
 Position: Cardinal;
begin
 Result := 0;
 for I := 0 to Pred(FSections.Count) do
  if (Sections[I].VirtualAddress <= VirtualAddress) and
     (VirtualAddress < Sections[I].VirtualAddress + Sections[I].SizeOfRawData) then
   begin
    Position := VirtualAddress - Sections[I].VirtualAddress;
    Result := Sections[I].PointerToRawData + Position;
    Break;
   end;
end;




PM MAIL   Вверх
CodeMonkey
Дата 13.11.2008, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



...я бы отправил к JclPeImage.pas из JCL...


--------------------
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
PM MAIL WWW ICQ Skype GTalk Jabber   Вверх
Riply
Дата 13.11.2008, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Комодератор
Сообщений: 572
Регистрация: 27.3.2007
Где: St. Petersburg

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



Цитата(CodeMonkey @  13.11.2008,  11:28 Найти цитируемый пост)
...я бы отправил к JclPeImage.pas из JCL... 


Т.е. что надо куда-то послать - мнения совпали  smile 
А  место назначения играет не очень важную роль: принцип разбора же один и тот же. 
Может Jcl вариант и получше (не смотрела), а данный код даже
когда-то использовала, работает smile

PM MAIL   Вверх
bems
Дата 14.11.2008, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



    
Цитата(Riply @  13.11.2008,  00:58 Найти цитируемый пост)
использовала бы MMF
будут проблемы при расширении до PE64



--------------------
Обижено школьников: 8
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

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

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

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

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

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


 




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


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

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