Показать полную графическую версию : Help с программой
Я начинаю только изучать делфи. Кое что освоил. Но вот задумал написать прогу. Как мне сделать,чтоб:открываем файл(бинарник),и чтоб прога начинала в нём искать заданные мною фрагменты в hex-формате. И потом найденные фрагменты надо вывести куда нибудь(в таблицу). И чтоб потом можно было заменить найденные франменты на свои. Помогите плиз
Для начала помогите с организацией поиска найденных заранее определённых кусков бинарника в таблицу. Как мне лучше будет искать изначально заданные фрагменты загруженного файла?
Файл я открываю через файл. потоки:
procedure TForm1.N2Click(Sender: TObject);
begin
if OpenDialog1.Execute then
begin
fs:=TFileStream.Create('111.bin', fmOpenReadWrite);
end;
end;
nemo555
По большому счёту принцип работы программы от языка не зависит. Прямая дорога к алгоритма поиска подстроки в строке (http://algolist.manual.ru/search/esearch/index.php). Я бы рекомендовал реализовать КМП (http://algolist.manual.ru/search/esearch/kmp.php) (как самый попсовый) или сдвиг-или (как очень простой в реализации, если разобраться с его сутью. Но у него есть ограничение на длину искомой подстроки). Если файл заведомо меньше доступного объёма (виртуальной) памяти, то я бы банально считал его в память целиком для дальнейшего поиска требуемого фрагмента.
DillerInc
22-11-2006, 23:23
Я бы рекомендовал реализовать КМП (как самый попсовый)
...а что в нём такого попсового?? :huh:
Можно попробовать следующим образом,но тут идёт подход с проекцией файла:
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;
В общем,что-то вроде этого.Только имей в виду,что в коде наверняка есть ошибки, т.к. я уже давно на Дельфях ничего не писал.
DillerInc
...а что в нём такого попсового??в данном случае "попсовый" - синоним слова популярный. Я например кроме него других алгоритмов и не смогу по памяти реализовать. За ненадобностью.
Всем спасибо. Буду разгребать. Ещё вопросик. Как лучше сделать округление числа. Я использую ф-ю round. Но получается полное округление. А мне надо допустим до одной десятой. Пример: 12,5467845416216
Округлить надо до одной цифры после запятой. Через какую ф-ю сделать?
round((12,5467845416216)*10) / 10 = 12,500000000000...
Diseased Head
03-12-2006, 12:56
CyraxZ Молоток! Отсюда вывод - хочеш быть хорошим программистом, надо хорошо знать математику. :advice:
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC