PDA

View Full Version : خواندن Resourceها ...



Hamid_PaK
سه شنبه 22 اسفند 1385, 00:56 صبح
کسی می دونه که چطور می توان با DataDirectory و یا ImageSectionHeader ، لیست Resourceهای فایل exe را خارج کرد ؟؟؟
لیست با آدرس و سایز هر یک ...

با تشکر ...

Hamid_PaK
سه شنبه 22 اسفند 1385, 19:33 عصر
دوستان نظری ندارند !!!

با تشکر ، یا حق ...

Bad_Programer
سه شنبه 22 اسفند 1385, 20:55 عصر
عزیزم مگه شما مثال خود دلفی را برای انجام این کار نخواندی بهترین راه استفاده از رکوردها می باشد که در مثال دلفی وجود دارد.اگه مثال را نداری بگو بذاریم.البته چون قبلاً خیلی زور زدم تا توانستم بفهمم چکار کردند اگه سوالی داشتی بپرس اگه بتوانیم جواب میدهیم.

Hamid_PaK
سه شنبه 22 اسفند 1385, 23:33 عصر
مثال جالبی بود ...
من هم همین جاههای کار بودم ولی مشکل ایجاست که من وقتی می خواهم زیر مجموعه ها را دریافت کنم کار نمی کنه !!!

یه مثال می خوام ...
تا جایی که تعداد ریسورسها رو دریافت کردیم درست حالا می ریم سراق هر یک از زیر مجموعه های اونها ، مشکل اوجاست ...



var
DosHead: PImageDosHeader;
imgsection: PImageSectionHeader;
i, j: Integer;
numbers: Word;
hFile,
hFileMapping: Cardinal;
p: PBYTE;
FResourceBase{,
FResourceRVA}: Longint;
DirTable: PResourceDirectoryTable;
DirEntry: PResourceDirectoryEntry;
DirCount: Integer;
ResType,
ResName: String;
strU: PResourceDirectoryStringU;
begin
try
hFile := CreateFile('test_me.exe', GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
except
MessageBox(0,'','',0);
Exit;
end;
if (hFile <> INVALID_HANDLE_VALUE) then begin
hFileMapping := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, 0, 'mappedfile');
if hFileMapping <> 0 then begin
p := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
DosHead := PImageDosHeader(p);
if p <> nil then
if DosHead.e_magic = IMAGE_DOS_SIGNATURE then begin
p := Pointer(Integer(p) +DosHead._lfanew);
PEHead := PImageNtHeaders(p)^;
if PEHead.Signature = IMAGE_NT_SIGNATURE then begin
numbers := PEHead.FileHeader.NumberOfSections;
i := 0;
p := Pointer(Integer(p) +SizeOf(IMAGE_NT_HEADERS));
repeat
imgsection := PImageSectionHeader(p);
if imgsection.VirtualAddress >= PEHead.OptionalHeader.DataDirectory[2].VirtualAddress then begin
FResourceBase := imgsection.PointerToRawData +LongWord(DosHead);
//FResourceRVA := imgsection.VirtualAddress;
DirTable := PResourceDirectoryTable(FResourceBase);
with DirTable^ do
DirCount := cNameEntries + cIDEntries -1;

DirEntry := PResourceDirectoryEntry(FResourceBase +SizeOf(DirTable));

for j := 0 to DirCount do begin
Inc(DirEntry);
with DirEntry^ do begin
//if (not HighBitSet(name)) and (name <= 16) then
ShowMessage(Format('%d %d', [name and $80000000, RVA and $7fffffff]));
if HighBitSet(name) then begin
strU := PResourceDirectoryStringU(StripHighBit(name) +FResourceBase);
ResName := WideCharToStr(@strU.NameString, strU.Length);
ShowMessage(Format('%d %x %s', [StripHighBit(name), StripHighBit(name) +imgsection.PointerToRawData, ResName]));
end;
end;
end;
end;
p := Pointer(integer(p) +SizeOf(IMAGE_SECTION_HEADER));
Inc(i);
until i >= numbers;
end;
end;
end;
CloseHandle(hFileMapping);
end;
CloseHandle(hFile);
//end;

با تشکر ، یا حق ...

Hamid_PaK
چهارشنبه 23 اسفند 1385, 21:23 عصر
مشکل حل شد ...


procedure GetResource(BaseOffst, RVAOffst, ResOffst: Longint);
var
bin: TMemoryStream;
dirTable: PResourceDirectoryTable;
dirEntry: PResourceDirectoryEntry;
datEntry: PResourceDataEntry;
strU: PResourceDirectoryStringU;
i, cnt: Integer;
begin
dirTable := PResourceDirectoryTable(BaseOffst +ResOffst);
dirEntry := PResourceDirectoryEntry(BaseOffst +ResOffst +SizeOf(TResourceDirectoryTable));
cnt := dirTable.cNameEntries +dirTable.cIDEntries;
ShowMessage(Format('[ %d - %d %x ]', [cnt, dirEntry.name, dirEntry.RVA]));
for i := 0 to cnt -1 do begin
if HighBitSet(dirEntry.RVA) then begin
if not (HighBitSet(dirEntry.name)) and (dirEntry.name <= 16) then begin
resTp := Copy(GetEnumName(TypeInfo(TResourceType), dirEntry.Name), 3, 20);
end else
if HighBitSet(dirEntry.name) then begin
strU := PResourceDirectoryStringU(BaseOffst +StripHighBit(dirEntry.name));
resNam := WideCharToStr(@strU.NameString, strU.Length);
end else
resNam := Format('%d', [dirEntry.name]);
GetResource(BaseOffst, RVAOffst, StripHighBit(dirEntry.RVA));
end else begin
datEntry := PResourceDataEntry(BaseOffst +dirEntry.RVA);
if datEntry.Size > 0 then begin
bin := TMemoryStream.Create;
try
bin.Write(Pointer(BaseOffst -RVAOffst +Longint(datEntry.OffsetToData))^, datEntry.Size);
bin.SaveToFile(Format('Res_%s_%s.bin', [resTp, resNam]));
finally
bin.Free;
end;
end; //}
{ShowMessage(Format('%s %.8x, %x %d',
[resName, dirEntry.RVA, datEntry.OffsetToData, datEntry.Size]));//}
end;
Inc(dirEntry);
end;
end;

procedure TMainForm.bt_testClick(Sender: TObject);
var
mem: TMemoryStream;
DosHead: PImageDosHeader;
PEHead: PImageNtHeaders;
imgsection: PImageSectionHeader;
i, j: Integer;
numbers: Word;
hFile,
hFileMapping: Cardinal;
p: PBYTE;
FResourceBase,
FResourceRVA: Longint;
DirTable: PResourceDirectoryTable;
DirEntry,
DirEntry2: PResourceDirectoryEntry;
DataEntry: PResourceDataEntry;
DirCount: Integer;
ResType,
ResName: String;
strU: PResourceDirectoryStringU;
begin
try
hFile := CreateFile('niro_dbase.exe', GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
except
MessageBox(0,'','',0);
Exit;
end;
if (hFile <> INVALID_HANDLE_VALUE) then begin
hFileMapping := CreateFileMapping(hFile, nil, PAGE_READWRITE, 0, 0, 'mappedfile');
if hFileMapping <> 0 then begin
p := MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);
DosHead := PImageDosHeader(p);
if p <> nil then
if DosHead.e_magic = IMAGE_DOS_SIGNATURE then begin
p := Pointer(Integer(p) +DosHead._lfanew);
PEHead := PImageNtHeaders(p);
if PEHead.Signature = IMAGE_NT_SIGNATURE then begin
numbers := PEHead.FileHeader.NumberOfSections;
i := 0;
p := Pointer(Integer(p) +SizeOf(IMAGE_NT_HEADERS));
repeat
imgsection := PImageSectionHeader(p);
if imgsection.VirtualAddress >= PEHead.OptionalHeader.DataDirectory[2].VirtualAddress then begin
FResourceBase := imgsection.PointerToRawData +LongWord(DosHead);
FResourceRVA := imgsection.VirtualAddress;
//ShowMessage(Format('%x, %x', [FResourceBase, FResourceRVA]));
GetResource(FResourceBase, FResourceRVA, 0);
end;
p := Pointer(integer(p) +SizeOf(IMAGE_SECTION_HEADER));
Inc(i);
until i >= numbers;
end;
end;
end;
CloseHandle(hFileMapping);
end;
CloseHandle(hFile);
//end;
end;


یا حق ...