Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2011, 21:29   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Поиск текста в массиве Char, массив берётся у бинарного файла(exe, dll)

Доброго времени суток!

Имеется exe в котором планируется найти некоторый текст и опираясь на него, делать выводы.
Допустим я хочу найти текст "ASDX", что я делаю:
Код:
var
  fs:TfileStream;
  Buffer:array[0...999] of Char; //Буфер в 1000 символов
begin
  fs:=TfileStream.Create('myFile.exe',fmOpenRead);
  fs.seek(0,SoFromBegining);
  fs.ReadBuffer(@Buffer,1000); //читаю 1000 знаков
  if Pos('ASDX',Buffer) <> 0 then //пытаюсь найти там текст
  begin
  {
  Это условие не выполняется!
  }
  end;
end;
Открываю файл, считываю 1000 знаков от начала файла в массив из знаков.
Однако при попытке найти в массиве "ASDX" - ничего не находит. Однако в HEX-редакторе этот ASDX успешно зависает в первой 1000 знаков...
В run-time из под отладчика, содержимое массива отображается, но там есть только "#123#123#123" вот такого вида обозначения.. а нужно найти именно текст ASDX.

Кодю на Delphi XE.. Что я не так делаю?

Последний раз редактировалось Человек_Борща; 04.10.2011 в 21:33.
Человек_Борща вне форума Ответить с цитированием
Старый 04.10.2011, 22:04   #2
_Troy
Я не простой
Пользователь
 
Аватар для _Troy
 
Регистрация: 29.09.2011
Сообщений: 77
По умолчанию

Эм.., в кодировке может проблема?

Попробуй так читать:

Код:
const
  sz = 1000;
var
  buffer : Array of Char;
  fs     : TFileStream;
begin
  fs := TFileStream.Create('./myFile.exe', fmOpenRead);
  SetLength(buffer, sz);
  fs.read(buffer[0], sz);
  fs.Free;
end;
У меня читает и находит "This program must be run under Win32"
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нем сведения

Последний раз редактировалось _Troy; 04.10.2011 в 22:45. Причина: Дописал...
_Troy вне форума Ответить с цитированием
Старый 04.10.2011, 22:06   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
  Buffer:array[0..999] of Char; //Буфер в 1000 символов
...
  fs.ReadBuffer(Buffer,1000); //читаю 1000 знаков
Хочете сказать что код без ошибок компилировался?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 04.10.2011, 22:20   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Аватар, нет. Писался прямо тут..
А что не так? Если зделать 0..1000 получается массиве 1001 элемент. А если 1..1000, то 1000 элементов, однако 0..999 тоже 1000 элементов. Просто я с нулём считаю. Или 0 не в счёт?

Но сути не меняет.. загребаю 1000(да хоть весь файл) знаков у exe файла при помощи TFileStream и текста там нет, но есть #знаки. Хотя в WinHex говорит о том, что нужный мне текст есть в этой 1000 знаков.

Может проблема и в кодировке, как это решается?

Последний раз редактировалось Человек_Борща; 04.10.2011 в 22:23.
Человек_Борща вне форума Ответить с цитированием
Старый 04.10.2011, 22:29   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Для Д7 function Pos(Substr: string; S: string): Integer
В XE не работаю, но если там такой же формат, то оба параметра в юникоде.
Массив сделать AnsiChar, да и параметр поиска в AnsiString наверно , а какая функция для поиска смотрите сами

Цитата:
А что не так?
С размерностью все в порядке, просто массив не правильно объявлен, и ReadBuffer не может в @Buffer читать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 04.10.2011 в 22:40.
Аватар вне форума Ответить с цитированием
Старый 04.10.2011, 23:01   #6
_Troy
Я не простой
Пользователь
 
Аватар для _Troy
 
Регистрация: 29.09.2011
Сообщений: 77
По умолчанию

Человек_Борща, дай exe этот - проверить хочу)
Знание бывает двух видов. Мы сами знаем предмет — или же знаем, где найти о нем сведения
_Troy вне форума Ответить с цитированием
Старый 04.10.2011, 23:09   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

да любой exe,dll открой hex-редактором... и найди там строку затем попробуй найти её в delphi.
Человек_Борща вне форума Ответить с цитированием
Старый 04.10.2011, 23:30   #8
chertovich
Форумчанин
 
Аватар для chertovich
 
Регистрация: 26.07.2009
Сообщений: 489
По умолчанию

Например так:
Код:
const
  Value = 'Vist';  // Искомая строка
var
  FileStream: TFileStream;
  Str: AnsiString; // Буфер
begin
  SetLength(Str, Length(Value));

  FileStream := TFileStream.Create('c:\whitebox_2192011-131742.log', fmOpenRead);

  FileStream.Position := 0;

  while FileStream.Position < FileStream.Size do
  begin
    // Перемещение значений на позицию назад (конвеер)
    Str[1] := Str[2];
    Str[2] := Str[3];
    Str[3] := Str[4];

    // Считывание 1 байта, медленно, можно сделать все намного быстрее, считывая в память больше и анализировать буфер
    FileStream.ReadBuffer(Str[4], 1);

    // Если найдена. При этом позиция строки будет равна FileStream.Position - 4
    if Str = Value then ShowMessage('Найдено значение');
  end;
end;
Если в глубине души вы программист, то, следуя своим наклонностям, вы захотите написать кусок кода.

Последний раз редактировалось chertovich; 04.10.2011 в 23:39.
chertovich вне форума Ответить с цитированием
Старый 08.10.2011, 00:29   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

chertovich, ваш способ действительно работает...
Код:
function FileIsPacked2(aFileName:string):Boolean;
const
  Val='UPX';
var
  fs:TFileStream;
  Buff:AnsiString;
  bff:AnsiChar;
  s:string;
  tStart,tEnd,f:cardinal;
begin
  Result:=False;
  SetLength(Buff,Length(Val));
  fs:=TFileStream.Create(aFileName,fmOpenRead);
  try
  fs.position:=0;
  tStart:=GetTickCount;
  while (fs.Position < fs.Size) do
  begin
    buff[1]:=buff[2];
    Buff[2]:=buff[3];
    buff[3]:=bff;
    fs.ReadBuffer(bff,1);
    if (buff = Val) then Result:=True;
  end;
  tEnd:=(GetTickCount - tStart);
  f:=Round(fs.Size/1024);
  ShowMessage('На выполнения поиска значения "UPX" в файе размером: '+IntToStr(f)+' кб затрачено: '+IntToStr(tEnd)+' ms');
  finally
    FreeAndNil(fs);
  end;
end;
но результат пичален:
На файл размером 10 кб тратиться 50 ms
На файл 1 мб затрачивается 5 секунд или 5247 ms

Следовательно на файл размером, скажем 10 мб, будет затрачено 50 секунд.

Можно ли быстрее?

вообще у меня задача:
Открыть exe, считать 1100 байт, перевести их в строку и там найти версию упаковщика(при помощи рерулярного выражения).

Последний раз редактировалось Человек_Борща; 08.10.2011 в 01:56.
Человек_Борща вне форума Ответить с цитированием
Старый 08.10.2011, 09:36   #10
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

Что мешает сделать
Код:
while fs.position < 1100
phomm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
квадраты вместо текста i-ula Microsoft Office Word 1 06.06.2011 19:18
мемо. вместо текста цифры maloun C++ Builder 5 02.02.2011 17:51
Как вставить кусок текста в текст Tomatos Общие вопросы Delphi 5 24.09.2009 21:00
получить кусок из адреса memka PHP 3 08.04.2009 12:52
ссылка вместо текста!!! Abbatik Помощь студентам 7 09.02.2008 13:29