Проблема с поиском строки в PE файле

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by _nic, 13 Nov 2008.

  1. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Пробую найти байт с которого начинается текстовая строка находящяся в 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 их находит :confused: Немогу понять в чем прикол :(
     
  2. cash$$$

    cash$$$ Banned

    Joined:
    6 Jan 2008
    Messages:
    385
    Likes Received:
    246
    Reputations:
    10
    Попробуй сделать так.

    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;
     
    1 person likes this.
  3. _nic

    _nic Elder - Старейшина

    Joined:
    5 May 2006
    Messages:
    651
    Likes Received:
    54
    Reputations:
    3
    Я в паскале абсолютно ни как не шарю
     
  4. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    Попробуй перевести указатель на начало файла


    SetFilePointer (hFile, lDistLow, &lDistHigh, FILE_BEGIN);
     
  5. groupby

    groupby Elder - Старейшина

    Joined:
    21 Sep 2008
    Messages:
    30
    Likes Received:
    13
    Reputations:
    0
    По моему все проще. Разный регистр символов. Оно? ;)
     
  6. groupby

    groupby Elder - Старейшина

    Joined:
    21 Sep 2008
    Messages:
    30
    Likes Received:
    13
    Reputations:
    0
    И ещё.. Ты сравниваешь по моему не все строки. Если строка находится не внутри твоего мегабайта, где ты проводишь сравнение, а в середине, т.е. к примеру половина строки в 1м мегабайте, другая половина во 2м мегабайте. Тогда ты естессно ничего не найдешь )))
     
  7. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    По моему все проще. Разный регистр символов. Оно?

    ага у аффтара спрашиваешь?
     
  8. Грот

    Грот Elder - Старейшина

    Joined:
    24 Jan 2008
    Messages:
    110
    Likes Received:
    36
    Reputations:
    0
    ясли я правельно тебя понял то этот исходник должен тебе помочь

    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 из криптора слеша
     
    #8 Грот, 17 Nov 2008
    Last edited: 17 Nov 2008