Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Проблема с поиском строки в PE файле (https://forum.antichat.xyz/showthread.php?t=91724)

_nic 13.11.2008 23:47

Проблема с поиском строки в 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_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 их находит :confused: Немогу понять в чем прикол :(

cash$$$ 14.11.2008 01:05

Попробуй сделать так.

Код:

{$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;


_nic 14.11.2008 01:23

Я в паскале абсолютно ни как не шарю

0verbreaK 14.11.2008 14:10

Попробуй перевести указатель на начало файла


SetFilePointer (hFile, lDistLow, &lDistHigh, FILE_BEGIN);

groupby 14.11.2008 21:32

По моему все проще. Разный регистр символов. Оно? ;)

groupby 14.11.2008 21:37

И ещё.. Ты сравниваешь по моему не все строки. Если строка находится не внутри твоего мегабайта, где ты проводишь сравнение, а в середине, т.е. к примеру половина строки в 1м мегабайте, другая половина во 2м мегабайте. Тогда ты естессно ничего не найдешь )))

0verbreaK 16.11.2008 03:59

По моему все проще. Разный регистр символов. Оно?

ага у аффтара спрашиваешь?

Грот 17.11.2008 21:18

ясли я правельно тебя понял то этот исходник должен тебе помочь

Код:

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 из криптора слеша


Время: 23:27