Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вытаскивание строк из PE-файла 
V
    Опции темы
Alexeis
Дата 10.12.2006, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



  Что называется сказано, сделано. Прикрепляю логи "выдеральщика" написанного по вашему алгоритму. 
Подопытной прогой стал сам выдеральщик smile
размер лога 301кб, тогда как размер экзешника 359кб, учитывая форматирование текстового файла, в лог попало около 240кб из экзешника, что составляет более половины его размера. 
  Что после этого скажете о вероятности совпадения? Просмотрите логи. Много ли там полезного текста?
С таким же успехом можно было открыть его в блокноте и искать текст без всякой обработки. 

Проверялись 3 подряд идущих символа. Если они были допустимыми, то проверялся текст идущий за ними, все что больше 3х символов считалось строкой. Просмотр лога показал, что увеличение минимального числа символов до 4 или 5 ти много эффективности не добавит, но зато приведет к тому, что увеличится потеря полезного текста. Такой алгоритм явно требует дополнительной обработки и структурного подхода.

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  log.txt 301,83 Kb


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
W4FhLF
Дата 10.12.2006, 08:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата

Конечно, это же синонимы. 


Ок, просто уточнил, дабы не расходиться в рассуждениях smile

Цитата

А вот делфи совсем так не делает. Есть спец программа StrepReloc, которая уменьшает размер делфийского экзешника за счет сокращения пространства между секциями, причем довольно существенно, значит что-то там есть. Оверлеи наверняка тоже можно найти. Ведь есть программы типа AsPack, которые предлагают сжимать или не сжимать оверлеи, значит их можно таки найти. Да аналогично и таблица импорта экспорта, пусть она расположена внутри другой секции, это же повод для того чтобы ее не искать. Надо ради пробы написать такую программку которая ищет без разбора строки. Я уверен что она выдаст их такое количество, что мало не покажется.


1. Я не знаю как работает ваша хвалёная программа, но могу с уверенностью сказать, если она и перестраивает таблицу секций, что даёт уменьшение размера программы, то происходит это за счёт отбрасывания нулей в конце секции, а эти нули и есть выравнивание по FileAlignment, которые само собой учтеные в таблице секций в поле PointerToRawSize.
2. Оверлеи найти легко, можно взять последнюю секцию, суммировав её смещение в файле и размер на диске можно получить указатель на оверлей или же можно взять ImageBase из заголовка и просуммировать его с SizeOfImage из того же опционального заголовка, получим виртуальный указатель на оверлей. Только я не понял к чему это?smile Вы сказали мы туда не лезем, ибо неправильноsmile
3. Вообще совсем не учитывать таблицу импорта я бы не стал, лучше сделать это опциональной функцией алгоритма, впрочем, не об этом речь.

Цитата

Для поиска защищенных строк это вообще дохлый пример, так как они наверняка зашифрованы и будут элементарно проигнорированы как символы не попадающие в таблицу.


На практике много чего встретишь, Вы бы попробовали.

Цитата

 Что называется сказано, сделано. Прикрепляю логи "выдеральщика" написанного по вашему алгоритму. 
Подопытной прогой стал сам выдеральщик 



alexeis1, Вы не перестаёте меня поражать... что за отношение к делу? Вы готовы идти любыми путями или я произвожу впечатление глупово человека? 
Посмотрите внимательно в свой лог, 80% строк, если не больше, включают в себя непечатаемые символы, хотя может вы являетесь обладателем какой-нибудь расширенной клавиатуры и у Вас есть возможность набрать такое(пример из лога):

ѓД]_^[ГђSVWѓДм‹щ‰$Ќ

или может быть такое:

Ђы-tbЂы+t_Ђы$t_ЂыxtZЂыXtUЂы0u

Цитата

По поводу отличия программы на делфи от С++. Тут вообще не должно быть сложностей. Секция кода в делфи завется "CODE" а в Microsoft С++ ".code" . Признаков на самом деле много. Стоит глянуть хотя бы в ресурсы.


Ну во-первых секции я могу обозвать как душей угодно, они вообще названия могут не иметь, лоадер винды на это не смотрит, во-вторых у нас, что свет клином сошёлся на С++ и Delphi? 
Я не буду описывать тут все тонкости техники определения компилятора, но скажу, что занимался этой проблемой довольно плотно и каждый день сталкиваюсь с этим на практике, я могу программу на делфи спрятать так, что определить то, что она на делфи сможет лишь опытный реверсер, да и то по косвеным признакам. Поэтому писать анализатор в данном случае нет никакого смысла. Попробуйте загнать программу весом 365 Кб в тот же PEiD он едва ли выдаст лог больше 20 Кб размером, при том, что он не учитывает компилятор.

Это сообщение отредактировал(а) W4FhLF - 10.12.2006, 10:35


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alexeis
Дата 10.12.2006, 16:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(W4FhLF @  10.12.2006,  08:29 Найти цитируемый пост)
1. Я не знаю как работает ваша хвалёная программа, но могу с уверенностью сказать, если она и перестраивает таблицу секций, что даёт уменьшение размера программы, то происходит это за счёт отбрасывания нулей в конце секции, а эти нули и есть выравнивание по FileAlignment, которые само собой учтеные в таблице секций в поле PointerToRawSize.


Код

program StripReloc;
{$APPTYPE CONSOLE}

{
  StripReloc v1.12
  Strip relocation section from Win32 PE files
  Copyright (C) 1999-2004 Jordan Russell. All rights reserved.
  http://www.jrsoftware.org/

  This program is free software; you can redistribute it and/or
  modify it under the terms of the GNU General Public License
  as published by the Free Software Foundation; either version 2
  of the License, or (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program; if not, write to the Free Software
  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

  $jrsoftware: stripreloc/StripReloc.dpr,v 1.12 2004/02/24 06:40:04 jr Exp $
}

uses
  Windows, SysUtils, Classes;

{x$R *.RES}

const
  Version = '1.12';

var
  KeepBackups: Boolean = True;
  WantValidChecksum: Boolean = False;
  ForceStrip: Boolean = False;

  ImageHlpHandle: THandle;
  CheckSumMappedFile: function(BaseAddress: Pointer; FileLength: DWORD;
    HeaderSum: PDWORD; CheckSum: PDWORD): PImageNtHeaders; stdcall;

function CalcChecksum(const FileHandle: THandle): DWORD;
var
  H: THandle;
  M: Pointer;
  OldSum: DWORD;
begin
  M := nil;
  H := CreateFileMapping(FileHandle, nil, PAGE_READONLY, 0, 0, nil);
  if H = 0 then
    RaiseLastWin32Error;
  try
    M := MapViewOfFile(H, FILE_MAP_READ, 0, 0, 0);
    Win32Check(CheckSumMappedFile(M, GetFileSize(FileHandle, nil), @OldSum, @Result) <> nil);
  finally
    if Assigned(M) then
      UnmapViewOfFile(M);
    CloseHandle(H);
  end;
end;

procedure Strip(const Filename: String);
type
  PPESectionHeaderArray = ^TPESectionHeaderArray;
  TPESectionHeaderArray = array[0..$7FFFFFFF div SizeOf(TImageSectionHeader)-1] of TImageSectionHeader;
var
  BackupFilename: String;
  F, F2: File;
  EXESig: Word;
  PEHeaderOffset, PESig: Cardinal;
  PEHeader: TImageFileHeader;
  PEOptHeader: ^TImageOptionalHeader;
  PESectionHeaders: PPESectionHeaderArray;
  BytesLeft, Bytes: Cardinal;
  Buf: array[0..8191] of Byte;
  I: Integer;
  RelocVirtualAddr, RelocPhysOffset, RelocPhysSize: Cardinal;
  OldSize, NewSize: Cardinal;
  TimeStamp: TFileTime;
begin
  PEOptHeader := nil;
  PESectionHeaders := nil;
  try
    RelocPhysOffset := 0;
    RelocPhysSize := 0;
    BackupFilename := Filename + '.bak';

    Write(Filename, ': ');
    AssignFile(F, Filename);
    FileMode := fmOpenRead or fmShareDenyWrite;
    Reset(F, 1);
    try
      OldSize := FileSize(F);
      GetFileTime(TFileRec(F).Handle, nil, nil, @TimeStamp);

      BlockRead(F, EXESig, SizeOf(EXESig));
      if EXESig <> $5A4D {'MZ'} then begin
        Writeln('File isn''t an EXE file (1).');
        Exit;
      end;
      Seek(F, $3C);
      BlockRead(F, PEHeaderOffset, SizeOf(PEHeaderOffset));
      if PEHeaderOffset = 0 then begin
        Writeln('File isn''t a PE file (1).');
        Exit;
      end;
      Seek(F, PEHeaderOffset);
      BlockRead(F, PESig, SizeOf(PESig));
      if PESig <> $00004550 {'PE'#0#0} then begin
        Writeln('File isn''t a PE file (2).');
        Exit;
      end;
      BlockRead(F, PEHeader, SizeOf(PEHeader));
      if not ForceStrip and (PEHeader.Characteristics and IMAGE_FILE_DLL <> 0) then begin
        Writeln('Skipping; can''t strip a DLL.');
        Exit;
      end;
      if PEHeader.Characteristics and IMAGE_FILE_RELOCS_STRIPPED <> 0 then begin
        Writeln('Relocations already stripped from file (1).');
        Exit;
      end;
      PEHeader.Characteristics := PEHeader.Characteristics or IMAGE_FILE_RELOCS_STRIPPED;
      GetMem(PEOptHeader, PEHeader.SizeOfOptionalHeader);
      BlockRead(F, PEOptHeader^, PEHeader.SizeOfOptionalHeader);
      if (PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress = 0) or
         (PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size = 0) then begin
        Writeln('Relocations already stripped from file (2).');
        Exit;
      end;
      RelocVirtualAddr := PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress;
      PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].VirtualAddress := 0;
      PEOptHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC].Size := 0;
      if not WantValidChecksum then
        PEOptHeader.CheckSum := 0;
      GetMem(PESectionHeaders, PEHeader.NumberOfSections * SizeOf(TImageSectionHeader));
      BlockRead(F, PESectionHeaders^, PEHeader.NumberOfSections * SizeOf(TImageSectionHeader));
      for I := 0 to PEHeader.NumberOfSections-1 do
        with PESectionHeaders[I] do
          if (VirtualAddress = RelocVirtualAddr) and (SizeOfRawData <> 0) then begin
            RelocPhysOffset := PointerToRawData;
            RelocPhysSize := SizeOfRawData;
            SizeOfRawData := 0;
            Break;
          end;
      if RelocPhysOffset = 0 then begin
        Writeln('Relocations already stripped from file (3).');
        Exit;
      end;
      if RelocPhysSize = 0 then begin
        Writeln('Relocations already stripped from file (4).');
        Exit;
      end;
      for I := 0 to PEHeader.NumberOfSections-1 do
        with PESectionHeaders[I] do begin
          if PointerToRawData > RelocPhysOffset then
            Dec(PointerToRawData, RelocPhysSize);
          if PointerToLinenumbers > RelocPhysOffset then
            Dec(PointerToLinenumbers, RelocPhysSize);
          if PointerToRelocations <> 0 then begin
            { ^ I don't think this field is ever used in the PE format.
              StripRlc doesn't handle it. }
            Writeln('Cannot handle this file (1).');
            Exit;
          end;
        end;
      if PEOptHeader.ImageBase < $400000 then begin
        Writeln('Cannot handle this file -- the image base address is less than 0x400000.');
        Exit;
      end;
    finally
      CloseFile(F);
    end;
    if FileExists(BackupFilename) then
      Win32Check(DeleteFile(BackupFilename));
    Rename(F, BackupFilename);
    try
      FileMode := fmOpenRead or fmShareDenyWrite;
      Reset(F, 1);
      try
        AssignFile(F2, Filename);
        FileMode := fmOpenWrite or fmShareExclusive;
        Rewrite(F2, 1);
        try
          BytesLeft := RelocPhysOffset;
          while BytesLeft <> 0 do begin
            Bytes := BytesLeft;
            if Bytes > SizeOf(Buf) then Bytes := SizeOf(Buf);
            BlockRead(F, Buf, Bytes);
            BlockWrite(F2, Buf, Bytes);
            Dec(BytesLeft, Bytes);
          end;
          Seek(F, Cardinal(FilePos(F)) + RelocPhysSize);
          BytesLeft := FileSize(F) - FilePos(F);
          while BytesLeft <> 0 do begin
            Bytes := BytesLeft;
            if Bytes > SizeOf(Buf) then Bytes := SizeOf(Buf);
            BlockRead(F, Buf, Bytes);
            BlockWrite(F2, Buf, Bytes);
            Dec(BytesLeft, Bytes);
          end;
          Seek(F2, PEHeaderOffset + SizeOf(PESig));
          BlockWrite(F2, PEHeader, SizeOf(PEHeader));
          BlockWrite(F2, PEOptHeader^, PEHeader.SizeOfOptionalHeader);
          BlockWrite(F2, PESectionHeaders^, PEHeader.NumberOfSections * SizeOf(TImageSectionHeader));
          if WantValidChecksum then begin
            PEOptHeader.CheckSum := CalcChecksum(TFileRec(F2).Handle);
            { go back and rewrite opt. header with new checksum }
            Seek(F2, PEHeaderOffset + SizeOf(PESig) + SizeOf(PEHeader));
            BlockWrite(F2, PEOptHeader^, PEHeader.SizeOfOptionalHeader);
          end;
          NewSize := FileSize(F2);
          SetFileTime(TFileRec(F2).Handle, nil, nil, @TimeStamp);
        finally
          CloseFile(F2);
        end;
      finally
        CloseFile(F);
      end;
    except
      DeleteFile(Filename);
      AssignFile(F, BackupFilename);
      Rename(F, Filename);
      raise;
    end;
    Writeln(OldSize, ' -> ', NewSize, ' bytes (',
      OldSize - NewSize, ' difference)');
    if not KeepBackups then
      if not DeleteFile(BackupFilename) then
        Writeln('Warning: Couldn''t delete backup file ', BackupFilename);
  finally
    FreeMem(PESectionHeaders);
    FreeMem(PEOptHeader);
  end;
end;

var
  SR: TSearchRec;
  S: String;
  FilesList: TStringList;
  P, I: Integer;
  HasFileParameter: Boolean = False;
  NumFiles: Integer = 0;
label 1;
begin
  try
    Writeln('StripReloc v' + Version + ', Copyright (C) 1999-2004 Jordan Russell, www.jrsoftware.org');
    if ParamCount = 0 then begin
      Writeln('Strip relocation section from Win32 PE files');
      Writeln;
    1:Writeln('usage:     stripreloc [switches] filename.exe');
      Writeln;
      Writeln('switches:  /B  don''t create .bak backup files');
      Writeln('           /C  write a valid checksum in the header (instead of zero)');
      Writeln('           /F  force stripping DLLs instead of skipping them. do not use!');
      Halt(1);
    end;
    Writeln;

    for P := 1 to ParamCount do begin
      S := ParamStr(P);
      if S[1] <> '/' then
        Continue;
      Delete(S, 1, 1);
      I := 1;
      while I <= Length(S) do begin
        case UpCase(S[I]) of
          '?': goto 1;
          'B': begin
                 KeepBackups := False;
                 if I < Length(S) then begin
                   { For backward compatibility, do keep backups if the character
                     following 'B' is a '+'. }
                   if S[I+1] = '+' then begin
                     KeepBackups := True;
                     Inc(I);
                   end
                   else if S[I+1] = '-' then
                     Inc(I);
                 end;
               end;
          'C': begin
                 ImageHlpHandle := LoadLibrary('imagehlp.dll');
                 if ImageHlpHandle = 0 then begin
                   Writeln('Error: Unable to load imagehlp.dll.');
                   Writeln('       It is required when using the /C parameter.');
                   Halt(1);
                 end;
                 CheckSumMappedFile := GetProcAddress(ImageHlpHandle, 'CheckSumMappedFile');
                 if @CheckSumMappedFile = nil then begin
                   Writeln('Error: Unable to get address of CheckSumMappedFile in imagehlp.dll.');
                   Writeln('       It is required when using the /C parameter.');
                   Halt(1);
                 end;
                 WantValidChecksum := True;
               end;
          'F': ForceStrip := True;
        else
          Writeln('Invalid parameter: /', S[I]);
          Halt(1);
        end;
        Inc(I);
      end;
    end;

    for P := 1 to ParamCount do begin
      S := ParamStr(P);
      if S[1] = '/' then
        Continue;
      HasFileParameter := True;
      FilesList := TStringList.Create;
      try
        FilesList.Sorted := True;
        if FindFirst(S, 0, SR) <> 0 then begin
          Writeln('No files matching "', S, '" found.');
          Continue;
        end;
        try
          repeat
            if CompareText(ExtractFileExt(SR.Name), '.bak') <> 0 then
              FilesList.Add(ExtractFilePath(S) + SR.Name);
          until FindNext(SR) <> 0;
        finally
          FindClose(SR);
        end;
        for I := 0 to FilesList.Count-1 do
          Strip(FilesList[I]);
        Inc(NumFiles);
      finally
        FilesList.Free;
      end;
    end;
    if not HasFileParameter then
      goto 1;
    if NumFiles = 0 then
      Halt(2);
  except
    on E: Exception do begin
      Writeln('Fatal error: ', E.Message);
      Halt(3);
    end;
  end;
end.


Цитата(W4FhLF @  10.12.2006,  08:29 Найти цитируемый пост)
Только я не понял к чему это?smile Вы сказали мы туда не лезем, ибо неправильноsmile

  От того что я его не упомянул не значит, что там ненужно искать. Хорошо, что вы про него вспомнили.

Цитата(W4FhLF @  10.12.2006,  08:29 Найти цитируемый пост)
На практике много чего встретишь, Вы бы попробовали.
 Это я к тому, что если нужно искать такие строки, то одного этого средства будет явно недостаточно.

Цитата(W4FhLF @  10.12.2006,  08:29 Найти цитируемый пост)
ѓД]_^[ГђSVWѓДм‹щ‰$Ќ

или может быть такое:

Ђы-tbЂы+t_Ђы$t_ЂыxtZЂыXtUЂы0u


Это все символы которые могут встречаться в тексте, другое дело, что вероятность их появления невысока! Часть из них являются символами из математики другие просто спец. символы. Некоторые являются русскими символами с ударением. Чем больше их убрать тем больше шансов потерять полезные строки. Вот, например, во второй строке из редких только Ђ - и то это греческая буква. Во первой есть символ ‰ - его можно убрать, можно еще убрать ударные символы, так как они достаточно редкие, хорошо, уберу еще самые редкие символы.

Цитата(W4FhLF @  10.12.2006,  08:29 Найти цитируемый пост)
Ну во-первых секции я могу обозвать как душей угодно, они вообще названия могут не иметь, лоадер винды на это не смотрит, во-вторых у нас, что свет клином сошёлся на С++ и Delphi? 
Я не буду описывать тут все тонкости техники определения компилятора, но скажу, что занимался этой проблемой довольно плотно и каждый день сталкиваюсь с этим на практике, я могу программу на делфи спрятать так, что определить то, что она на делфи сможет лишь опытный реверсер, да и то по косвеным признакам. Поэтому писать анализатор в данном случае нет никакого смысла. Попробуйте загнать программу весом 365 Кб в тот же PEiD он едва ли выдаст лог больше 20 Кб размером, при том, что он не учитывает компилятор.


Это зависит от целей программки, если она направлена на взлом (что тут не обсуждается), то к ней одни требования, если она просто служит для изучения или поиска строк в своей программе или еще для чего, то тут совершенно другие требования. О назначении программы тут не было ни одного слова, потому пути реализации тоже могут отличаться.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexeis
Дата 10.12.2006, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Вот изменил, убрал кучу лишних символов, в результате логи 198кб, т.е. уменьшились всего на треть.
Вот такое множество участвовало в поиске 
Код

symbol : set of Char = [#20, #9, #32..#122, #136, #167, #168, #171, #176,
                          #177, #184, #185, #187, #192..#217, #221..#255];


Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  log.zip 89,51 Kb


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
W4FhLF
Дата 10.12.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Цитата

Strip relocation section from Win32 PE files


Вот ключевая фраза  описывающая весь алгоритм. Программа удаляет релоки, которые исполняемому файлу фактически ни к чему, но некоторые компиляторы по стандарту всё равно суют их в файл, т.к. на системах ниже NT, если у файла нестандартный ImageBase(ниже 400000h), то без релоков он просто не запустится.

Цитата

От того что я его не упомянул не значит, что там ненужно искать. Хорошо, что вы про него вспомнили.


Вы как раз сказали, что нужно искать только в сегментах и то не во всех.

Цитата

Это все символы которые могут встречаться в тексте, другое дело, что вероятность их появления невысока! Часть из них являются символами из математики другие просто спец. символы. Некоторые являются русскими символами с ударением. Чем больше их убрать тем больше шансов потерять полезные строки. Вот, например, во второй строке из редких только Ђ - и то это греческая буква. Во первой есть символ ‰ - его можно убрать, можно еще убрать ударные символы, так как они достаточно редкие, хорошо, уберу еще самые редкие символы.


Это становится просто смешно... Вот честно, просто бред... Никто и никогда в подобных анализаторах не станет учитывать символы, которые не могут быть введены с клавиатуры, иначе с таким подходом можно уйти очень далеко. Я имею кое-какой опыт в исследовании алгоритмов и вообще программ, и никогда я ещё не встречал всяких греческих букв и прочих спецсимволов в качестве полезных данных. В принципе я не исключаю возможность, что такой исход событий возможен, но это настолько ничтожная вероятность, что ей можно и более того нужно пренебречь, дабы повысить качество алгоритма для абсолютно подавляющего большинства программ.

Цитата

Это зависит от целей программки, если она направлена на взлом (что тут не обсуждается), то к ней одни требования, если она просто служит для изучения или поиска строк в своей программе или еще для чего, то тут совершенно другие требования. О назначении программы тут не было ни одного слова, потому пути реализации тоже могут отличаться.


Ну знаете, если эта программа в конечном счёте не будет вспомогательным инструментом при исследовании программы(коим, кстати, является PEiD, который, как мне казалось, здесь обсуждается), то сложно себе представить область применения данной функции.


Это сообщение отредактировал(а) W4FhLF - 10.12.2006, 17:40


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Alexeis
Дата 10.12.2006, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(W4FhLF @  10.12.2006,  17:39 Найти цитируемый пост)
Вы как раз сказали, что нужно искать только в сегментах и то не во всех.

Цитата(alexeis1 @  9.12.2006,  13:46 Найти цитируемый пост)
заголовок EXE тоже нужно читать, но для того чтобы искать строки только внутри сегментов, а не лезть в таблицу импорта или в пространство между секциями или, например, залезть в секцию ресурсов и искать строку в записанной там картинке. Т.е. нужно разобрать экзешник на секции и искать только там где могут быть строки. 


Это вы неверно интерпретировали мои слова. Я не вижу тут такой фразы. 


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Voyager
Дата 11.12.2006, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 532
Регистрация: 8.2.2005

Репутация: 2
Всего: 18



Цитата

Какой нафиг заголовок?  

Подумал что речь идет про секции в заголовке и проч., а оказывается из всего файла вытянуть нужно.

Это сообщение отредактировал(а) Voyager - 11.12.2006, 13:20
PM   Вверх
W4FhLF
Дата 11.12.2006, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 6
Всего: 121



Вот, ответ именно на это вопрос я изначально и хотел услышать, но тут вмешался  alexeis1 smile 


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
ASGDeveloper
Дата 11.12.2006, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: 1
Всего: 1



Цитата(alexeis1 @  10.12.2006,  16:34 Найти цитируемый пост)
Вот изменил, убрал кучу лишних символов, в результате логи 198кб, т.е. уменьшились всего на треть.

Можешь исходник выложить? И тогда можно тему закрывать  smile 

PM MAIL   Вверх
Alexeis
Дата 11.12.2006, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Цитата(ASGDeveloper @  11.12.2006,  14:13 Найти цитируемый пост)
Можешь исходник выложить? И тогда можно тему закрывать  smile 


Неужели такой вариант подходит?  smile  Конечно выложу, но вечером.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ASGDeveloper
Дата 11.12.2006, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: 1
Всего: 1



Цитата(alexeis1 @  11.12.2006,  14:23 Найти цитируемый пост)
Неужели такой вариант подходит? 

Я его тут доработаю напильником.  smile 
PM MAIL   Вверх
Alexeis
Дата 11.12.2006, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



Код

var
  symbol : set of Char = [#20, #9, #32..#122, #136, #167, #168, #171, #176,
                          #177, #184, #185, #187, #192..#217, #221..#255];

procedure TForm1.Button1Click(Sender: TObject);
var
  F : TFileStream;
  i, j : Integer;
  c1, c2, c3, c : Char;
  buf : AnsiString;

begin
  F := TFileStream.Create('test.exe', fmOpenRead);
  F.Seek(0, soFromBeginning);
  i := 0;
  F.Read(c1, 1);
  F.Read(c2, 1);
  F.Read(c3, 1);
  repeat
    if (c1 in symbol) and (c2 in symbol) and (c3 in symbol)
    then
      begin
        j := 0;
        repeat
          F.Read(c, 1);
          Inc(j);
        until ((i + j) >= F.Size) or (Not(c in symbol));
        Dec(j);
        SetLength(buf, j+3);
        f.Seek(i, soFromBeginning);
        f.Read(buf[1], j+3);
        Memo1.Lines.Add(buf);

        F.Read(c1, 1);
        F.Read(c1, 1);
        F.Read(C2, 1);
        F.Read(c3, 1);
        i := f.Position - 3;
      end
    else
      begin
        c1 := c2;
        c2 := c3;
        f.Read(c3, 1);
        Inc(i);
      end;
  until i >= F.Size;
  f.Free;
  Memo1.Lines.SaveToFile('log.txt');
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i : Integer;
begin
  for i := 0 to 255
  do
    memo1.Lines.Add(IntToStr(i) + ' ' + chr(i));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  ShowMessage(IntToStr(ord(Memo1.SelText[1])));
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
ASGDeveloper
Дата 12.12.2006, 10:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


developer
**


Профиль
Группа: Участник
Сообщений: 389
Регистрация: 1.4.2006

Репутация: 1
Всего: 1



Цитата(alexeis1 @  11.12.2006,  20:37 Найти цитируемый пост)
код Pascal/Delphi

Все, спасибо. Тема закрыта smile

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1514 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.