Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Help с программой

Ответить
Настройки темы
Help с программой

Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Я начинаю только изучать делфи. Кое что освоил. Но вот задумал написать прогу. Как мне сделать,чтоб:открываем файл(бинарник),и чтоб прога начинала в нём искать заданные мною фрагменты в hex-формате. И потом найденные фрагменты надо вывести куда нибудь(в таблицу). И чтоб потом можно было заменить найденные франменты на свои. Помогите плиз
Для начала помогите с организацией поиска найденных заранее определённых кусков бинарника в таблицу. Как мне лучше будет искать изначально заданные фрагменты загруженного файла?
Файл я открываю через файл. потоки:

procedure TForm1.N2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
fs:=TFileStream.Create('111.bin', fmOpenReadWrite);
end;
end;

Отправлено: 21:17, 22-11-2006

 

редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


nemo555
По большому счёту принцип работы программы от языка не зависит. Прямая дорога к алгоритма поиска подстроки в строке. Я бы рекомендовал реализовать КМП (как самый попсовый) или сдвиг-или (как очень простой в реализации, если разобраться с его сутью. Но у него есть ограничение на длину искомой подстроки). Если файл заведомо меньше доступного объёма (виртуальной) памяти, то я бы банально считал его в память целиком для дальнейшего поиска требуемого фрагмента.

-------
http://ivank.ru


Отправлено: 22:30, 22-11-2006 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Аватара для DillerInc

Обратный инженер


Сообщения: 644
Благодарности: 47

Профиль | Отправить PM | Цитировать


Цитата:
Я бы рекомендовал реализовать КМП (как самый попсовый)
...а что в нём такого попсового??

Можно попробовать следующим образом,но тут идёт подход с проекцией файла:

Код: Выделить весь код
var
 hExe, FileSize, hFileMapping, MapViewPtr : Cardinal;
 Pos : Integer;
begin
// Открываем файл
 hExe := CreateFile(OpenDlgBox.lpstrFile, GENERIC_READ, 0, nil, OPEN_EXISTING,
                     FILE_ATTRIBUTE_NORMAL, 0);
// Получаем размер файла
 FileSize := GetFileSize(hExe, nil);
// Создаём проекцию файла
 hFileMapping := CreateFileMapping(hExe, nil, PAGE_READWRITE, 0, 0, nil);
// Отображаем созданную проекцию в адресное пространство вызывающего процесса
 MapViewPtr := MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
// Тут начинаем искать нужную сигнатуру,например:
 for Pos := 0 to FileSize do
  if MapViewPtr[Pos]   = $3D then   // ассемблерная команда CMP EAX, 2000
  if MapViewPtr[Pos+1] = $00 then
  if MapViewPtr[Pos+2] = $20 then
  if MapViewPtr[Pos+3] = $00 then
  if MapViewPtr[Pos+4] = $00 then
   begin
    Типа нашли!!;
    Break;
   end else Типа ничего не нашли;
// Ну и в конце концов...
// Сворачиваем отображение в памяти
 UnMapViewOfFile(MemPtr);
// Закрываем проекцию файла
 CloseHandle(hFileMapping);
// Закрываем открытый файл
 CloseHandle(hExe); 
end;
В общем,что-то вроде этого.Только имей в виду,что в коде наверняка есть ошибки, т.к. я уже давно на Дельфях ничего не писал.

-------
То,что неясно,следует выяснить.То,что трудно творить,следует делать с великой настойчивостью. © Конфуций


Отправлено: 23:23, 22-11-2006 | #3


редкий гость


Сообщения: 1696
Благодарности: 44

Профиль | Сайт | Отправить PM | Цитировать


DillerInc
Цитата:
...а что в нём такого попсового??
в данном случае "попсовый" - синоним слова популярный. Я например кроме него других алгоритмов и не смогу по памяти реализовать. За ненадобностью.

-------
http://ivank.ru


Отправлено: 23:32, 22-11-2006 | #4


Новый участник


Сообщения: 42
Благодарности: 0

Профиль | Отправить PM | Цитировать


Всем спасибо. Буду разгребать. Ещё вопросик. Как лучше сделать округление числа. Я использую ф-ю round. Но получается полное округление. А мне надо допустим до одной десятой. Пример: 12,5467845416216
Округлить надо до одной цифры после запятой. Через какую ф-ю сделать?

Отправлено: 00:11, 03-12-2006 | #5


Аватара для CyraxZ

Ветеран


Сообщения: 784
Благодарности: 11

Профиль | Отправить PM | Цитировать


round((12,5467845416216)*10) / 10 = 12,500000000000...
Это сообщение посчитали полезным следующие участники:

Отправлено: 09:43, 03-12-2006 | #6


Аватара для Diseased Head

Ветеран


Сообщения: 881
Благодарности: 55

Профиль | Отправить PM | Цитировать


CyraxZ Молоток! Отсюда вывод - хочеш быть хорошим программистом, надо хорошо знать математику. :advice:

-------
Знаю точно, что я есть. Остальное, всё, не точно.
Возможное - невозможно! Но невозможное - возможно, но нужна жертва соразмерная.


Отправлено: 12:56, 03-12-2006 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » Help с программой

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Система - Слежение за программой. LINCOLN Программное обеспечение Windows 7 10-06-2009 02:07
Пробелма с программой Protector Suite 5.6.2 KTM Хочу все знать 4 12-02-2009 22:55
Бред с программой heruvim41 Программное обеспечение Windows 4 20-03-2007 08:45
Помгите разобраться с программой TarasBulba Программирование и базы данных 1 30-08-2002 22:26




 
Переход