Пробую найти байт с которого начинается текстовая строка находящяся в PE файле Пытаюсь делать вот так Code: 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_RANDOM_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 их находит Немогу понять в чем прикол
Попробуй сделать так. Code: {$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;
Попробуй перевести указатель на начало файла SetFilePointer (hFile, lDistLow, &lDistHigh, FILE_BEGIN);
И ещё.. Ты сравниваешь по моему не все строки. Если строка находится не внутри твоего мегабайта, где ты проводишь сравнение, а в середине, т.е. к примеру половина строки в 1м мегабайте, другая половина во 2м мегабайте. Тогда ты естессно ничего не найдешь )))
ясли я правельно тебя понял то этот исходник должен тебе помочь Code: 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. или вот правда придеться расписать структуру ре фаила зато ты сможешь смотреть и мнеять весь фаил неплохо зная его тип (исползуеться при написании крипторов) Code: 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 из криптора слеша