Просмотр полной версии : Проблема с поиском строки в PE файле
Пробую найти байт с которого начинается текстовая строка находящяся в PE файле
Пытаюсь делать вот так
int segg(char str[100],char path[300],char sub[100])
{
int seg=0;DWORD rb;
char *fil=new char[1024*1024];
HANDLE f=CreateFile(path,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_RANDO M_ACCESS,0);
ReadFile(f,fil,1024*1024,&rb,NULL);
for(;;)
{
if(strlen(fil)==0)
{
fil+=1;seg++;
if(strstr(fil,str)!=NULL){strcpy(sub,fil);break;}
}
seg=seg+strlen(fil);
fil+=strlen(fil);
if(seg==rb)
{
MessageBox(Form1->Handle,"Не тот файл","Ошибка",MB_ICONERROR);
break;
}
}
CloseHandle(f);
return(seg);
}
Проблема заключается в том что эта ф-ция может находить одни строки и ненаходить другие.Хотя WinHEX их находит :confused: Немогу понять в чем прикол :(
Попробуй сделать так.
{$IFDEF WIN32}
{$R STRTBL32.RES}
{$ELSE}
{$R STRTBL16.RES}
const
LANG_ENGLISH = $09;
const
LANG_SPANISH = $0A;
const
LANG_SWEDISH = $1D;
{$ENDIF}
function GetLanguage: word;
{$IFDEF WIN32}
{$ELSE}
var
s: string;
i: integer;
{$ENDIF}
begin
{$IFDEF WIN32}
GetLanguage := GetUserDefaultLangID and $3FF;
{$ELSE}
s[0] := Char(GetProfileString('intl',
'sLanguage',
'none',
@s[1],
sizeof(s) - 2));
for i := 1 to length(s) do
s[i] := UpCase(s[i]);
if s = 'ENU' then
GetLanguage := LANG_ENGLISH
else if s = 'ESN' then
GetLanguage := LANG_SPANISH
else if s = 'SVE' then
GetLanguage := LANG_SWEDISH
else
GetLanguage := LANG_ENGLISH;
{$ENDIF}
end;
procedure TForm1.FormCreate(Sender: TObject);
var
a: array[0..255] of char;
StrTblOfs: integer;
begin
{Получаем текущий язык системы и начало соответствующих строк в таблице}
case GetLanguage of
LANG_ENGLISH: StrTblOfs := 0;
LANG_SPANISH: StrTblOfs := 16;
LANG_SWEDISH: StrTblOfs := 32;
else
StrTblOfs := 0;
end;
{Загружаем и устанавливаем заголовок кнопки "Yes" в соответствии с языком}
if LoadString(hInstance,
StrTblOfs + 1,
@a,
sizeof(a)) <> 0 then
Button1.Caption := StrPas(a);
{Загружаем и устанавливаем заголовок кнопки "No" в соответствии с языком}
if LoadString(hInstance,
StrTblOfs + 2,
@a,
sizeof(a)) <> 0 then
Button2.Caption := StrPas(a);
end;
Я в паскале абсолютно ни как не шарю
0verbreaK
14.11.2008, 14:10
Попробуй перевести указатель на начало файла
SetFilePointer (hFile, lDistLow, &lDistHigh, FILE_BEGIN);
По моему все проще. Разный регистр символов. Оно? ;)
И ещё.. Ты сравниваешь по моему не все строки. Если строка находится не внутри твоего мегабайта, где ты проводишь сравнение, а в середине, т.е. к примеру половина строки в 1м мегабайте, другая половина во 2м мегабайте. Тогда ты естессно ничего не найдешь )))
0verbreaK
16.11.2008, 03:59
По моему все проще. Разный регистр символов. Оно?
ага у аффтара спрашиваешь?
ясли я правельно тебя понял то этот исходник должен тебе помочь
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Label1: TLabel;
OpenDialog1: TOpenDialog;
Button2: TButton;
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
var
S:string;
size,he:integer;
c:byte;
begin
{ TODO -oUser -cConsole Main : Insert code here }
S:= fileSearch(edit1.text, 'E:\gav\');
if S<>'' then
begin
he:=fileOpen(S,fmOpenReadWrite);
size:=Windows.GetFileSize(he,nil);
edit2.text:= intToStr(size);
end;
fileread(he,c,1); // считать один байт
if C <>ord('M')then
begin
exit;
end;
fileread(he,c,1); // считать один байт
if c<> ord('Z')then
begin
exit;
end;
MessageBox(0,'обнаружена стандартная'#10#13' структура РЕ файла','файл найден',MB_ICONINFORMATION);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
OpenDialog1.Execute;
Edit1.Text:= OpenDialog1.FileName ;
end;
end.
или вот правда придеться расписать структуру ре фаила зато ты сможешь смотреть и мнеять весь фаил неплохо зная его тип (исползуеться при написании крипторов)
tupe
pe_head=record // структура PE //Signature:dword;
CPU_Type:word;
Num_of_Objects:word;
Time_Date_Stamp:dword;
Pointer_to_COFF_table:dword;
COFF_table_size:dword;
NT_Header_Size:word;
Flags:word;
Magic:word;
Link_Major:byte;
Link_Minor:byte;
Size_of_Code:dword;
Size_of_Init_Data:dword;
Size_of_UnInit_Data:dword;
Entry_point_RVA:dword;
Base_of_Code:dword;
Base_of_Data:dword;
Image_Base:dword;
Object_Align:dword;
File_Align:dword;
OS_Major:word;
OS_Minor:word;
USER_Major:word;
USER_Minor:word;
SubSys_Major:word;
SubSys_Minor:word;
Reserved:dword;
Image_Size:dword;
Header_Size:dword;
File_CheckSum:dword;
SubSytem:word;
DLL_Flags:word;
Stack_Reserve_Size:dword;
Stack_Commit_Size:dword;
Heap_Reserve_Size:dword;
Heap_Comit_Size:dword;
Loader_Flags:dword;
Num_of_RVA_and_Sizes:dword;
Export_Table_RVA:dword;
Export_Data_Size:dword;
Import_Table_RVA:dword;
Import_Data_Size:dword;
Resource_Table_RVA:dword;
Resource_Data_Size:dword;
Exception_Table_RVA:dword;
Exception_Data_Size:dword;
Security_Table_RVA:dword;
Security_Data_Size:dword;
Fix_Ups_Table_RVA:dword;
Fix_Ups_Data_Size:dword;
Debug_Table_RVA:dword;
Debug_Data_Size:dword;
Image_Description_RVA:dword;
Description_Data_Size:dword;
Machine_Specific_RVA:dword;
Machnine_Data_Size:dword;
TLS_RVA:dword;
TLS_Data_Size:dword;
Load_Config_RVA:dword;
Load_Config_Data_Size:dword;
Reserved1:array[1..8] of byte;
IAT_RVA:dword;
IAT_Data_Size:dword;
Reserved2:array[1..24] of byte;
end;
Section_table=record // структура таблица секции
Object_Name:array[1..8] of char;
Virtual_Size:dword;
Section_RVA:dword;
Physical_Size:dword;
Physical_Offset:dword;
Reserved:array[1..12] of byte;
Object_Flags:dword;
после ты сможешь спокойно получить доступ к любой секции без гимароя например
begin
name:=st[y].Object_Name; // получить имя секции
end; ну и так далие пример на Delphi из криптора слеша
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot