![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Goph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 9.5.2002 Где: Кривой Рог Репутация: нет Всего: нет |
Здраствуйте!
Подскажите как создать файл в Delphi, чтобы при нажатии на кнопку можно было с винта открыть exe файл а при нажатии на другую кнопку изменить такой код в программе(важно) поменять je на jne!!!!!, то есть заменить 84 на 85!! Желательно asm вставку мне тут ктото писал.... Зарание спасибо! Vit не надо было так кричать! -------------------------------------------- Воображение горраздо важнее знаний (Энштейн) -------------------- Воображение гораздо важнее знаний! (Эйнштейн) |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Если не секрет, то зачем тут асм вставка? Находишь эти байты ( file of byte )
И меняешь, а потом записываешь... Например можно так: Читаешь байты и тут же пишешь...если находишь нужную последовательность ( по смещению так или как еще ) просто меняешь байты в переменной и пишешь дальше, а потом старый файл удаляешь -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Goph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 9.5.2002 Где: Кривой Рог Репутация: нет Всего: нет |
Это все хорошо , но я не разу с этим не сталкивался напиши подробнее!!! СПАСИБО!!! -------------------- Воображение гораздо важнее знаний! (Эйнштейн) |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Я тут статью начал о файлах:
http://www.forum.vingrad.ru/cgi-bin....;t=1166 Там где описывается запись и чтение байтов из типизированного файла - это как раз то что тебе нужно, читни, если что еще не понятно - пиши. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Goph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 9.5.2002 Где: Кривой Рог Репутация: нет Всего: нет |
Я так понял что там описуется открытие и редактирования txt! По твоему коду он не понимает что за "s" и говорит Incom... type! Мне нужно только найти Как осуществить поиск, и вписать вместо OF84B7000000 OF85B7000000 ! Как будет осуществляться поиск по смещению или просто (find)! Ответь пожайлуста! -------------------- Воображение гораздо важнее знаний! (Эйнштейн) |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Нет ты просто не дочитал, я вначале рассказал как читать текстовые файлы а затем разобрал как читать отдельные байты из файла, это совершенно разные подходы, и естественно байт как строку не прочитаешь
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
По абсолютному смещению в файле найти очень просто(если это смещение известно), если надо проводить поиск и замену по всему файлу, то прийдется его байт за байтом читать, искать нужную последовательность и менять. Если файл достаточно большой то имеет смысл его прочитать в буффер целиком, там найти и заменить что нужно.
-------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Goph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 9.5.2002 Где: Кривой Рог Репутация: нет Всего: нет |
Этот код? var Canceled:Boolean; Function GetFileSize(FIleName:String):integer; var f: File of Byte; begin try AssignFile(f, FileName); Reset(f); result:=filesize(F); CloseFile(f); except result:=-1; end; end; Procedure ReadMyFile; Var i,j:integer; Begin ProgressBar1.Max:=GetFileSize('c:\MyFile.txt' ProgressBar1.position:=0; assignfile(f,'c:\MyFile.txt' Canceled:=False; reset(f); i:=0;j:=0; while not eof(f) do begin inc(j); readln(f,s); i:=i+length(s)+2; if (j mod 1000)=0 then begin ProgressBar1.position:=i; Application.ProcessMessages; if canceled then break; end; {здесь мы что-то делаем с прочитанной строкой} end; CloseFile(f); Но сдесь он говорит что несоответствует тип "s", напиши как именно загнать файл в буфер и найти допустим 000324525 и поменять на 000324424! -------------------- Воображение гораздо важнее знаний! (Эйнштейн) |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Господи! Неужели я настолько непонятно пишу? Это же код для чтения текстового файла (и весь тот ответ посвящен текстовым файлам, надо смотреть дальше), а я тебе еще в самом первом ответе написал что надо посмотреть ту часть где я разбираю работу с типизированными файлами. Неужели совершенно не интересно самому разобраться как ЭТО все работает, а статья просматривается только на предмет найти кусок работающего кода всунуть в свою программу и забыть об этом? Я не буду писать код за вас, особенно настолько простой, могу подсказать как это делать, найти ошибку, объяснить механизм, но специально писать куски кода под чьи-то нужды не хочу. Учитывая, что найти кусок статьи посвященный чтению и записи отдельных байтов в файл в моей статье по совершенно непонятным для меня причинам не возможно я приведу его снова, попробуйте в нем разобраться и напишите если что непонятно, только как и всякая статья, моя была написана из расчета, что чтение какого-либо куска, предполагает знание того что было записано до того:
Теперь разберем типизированные файлы. Типизированный файл - это файл в котором записанны идентичные структуры. Например любой файл можно считать файлом байтов - т.е. можно его читать байт за байтом, можно перейти сразу к любому байту по его номеру, можно сразу узнать сколько байт в файле, можно заменить любой байт на другой не перезаписывая файл. Теперь все это в примерах: Объявляем файл байтов: var f:file of byte; b:Byte; Ассоциируем файловую переменную с физическим файлом: AssignFile(f,'c:\myfile.bin'); Теперь мы можем либо перезаписать/создать файл: Rewrite(f); Либо открыть существующий для чтения и записи: Reset(f); Обратите внимание, что функция Reset хотя и имеет такой же формат как и для текстовых файлов, но открытый ей файл можно и читать и писать, в отличие от текстовых. Теперь функции работы с файлом: read(f,b); - прочитать 1 байт write(f,b); - записать 1 байт seek(f,100); - поставить текущее положение считывания/записи на сотый байт Size(f); - прочитать количество байт в файле. Eof(f); - узнать не являетсмя ли байт последним Все эти функции не работают с файлами большими 2 Gb. После работы файл надо закрыть: CloseFile(f); -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Goph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 9.5.2002 Где: Кривой Рог Репутация: нет Всего: нет |
read(f,b);
write(f,b); seek(f,100); Size(f); Eof(f); CloseFile(f); Єто все фенкции? Но всетаки как найти строчку 0002445A? Спасибо! -------------------- Воображение гораздо важнее знаний! (Эйнштейн) |
|||
|
||||
| Goph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 9.5.2002 Где: Кривой Рог Репутация: нет Всего: нет |
read(f,b); write(f,b); seek(f,100); Size(f); Eof(f); CloseFile(f); Єто все фенкции? Но всетаки как найти строчку 0002445A? Спасибо! -------------------- Воображение гораздо важнее знаний! (Эйнштейн) |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Только перебором. Можно загрузить файл например в массив и искать там чтобы сэкономить время:
var a:array of byte; f:file; assignfile(f,'MyFile'); reset(f); setlength(a,MyFileSize) BlockRead(F, a, MyFileSize); CloseFile(f); Теперь задача чтобы найти нужные байты в массиве а затем заменить их в файле, или в этом же массиве, и тогда с помощью BlockWrite записать их обратно. -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
function Check (var Arr : array of Byte):boolean;
begin if (Arr[0] = $F3) then if (Arr[1] = $F3) then if (Arr[2] = $F3) then if (Arr[3] = $F3) then Result := True else Result := False; end; procedure TForm1.Button1Click(Sender: TObject); var ff : file of Byte; ta : array [0..$3] of Byte; offset : Integer; begin offset := 0; AssignFile (ff, 'c:\roll.exe' Reset (ff); while (FileSize (ff) <> offset+4) do begin Seek (ff, offset); BlockRead (ff, ta, sizeof (ta)); if (Check (ta)) then begin ShowMessage ('Bytes found' Break; end; Inc (offset); end; CloseFile (ff); end; -------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Если надо могу еще и объяснить как заменить байты, но думаю должно быть понятно...Хотя насчет кода выше я не особо уверен...писал навскиду...
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Goph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 9.5.2002 Где: Кривой Рог Репутация: нет Всего: нет |
procedure TForm1.Button1Click(Sender: TObject); var f:file of byte; b:Byte; begin b:=85; AssignFile(f,'c:\jpegopt.exe'); Reset(f); seek(f,002470A1); write(f,b); CloseFile(f); end; end. Мне нужно поменять в программе 1 такой код на если увидел то 84 на 85! Я распаковываю hwiev смотрю это место есть смещение 000266A1 и под таким адресом PE.002470A1 именно на 84 но он пишет в моем коде вверху, что не правильно! как мне заменить 84 на 85 и где у меня ошибка в коде!! СПАСИБО! -------------------- Воображение гораздо важнее знаний! (Эйнштейн) |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
Вместо
seek(f,002470A1); Совершенно очевидно надо seek(f,$002470A1); так как это шестнадцатиричное число -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
| Goph |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 304 Регистрация: 9.5.2002 Где: Кривой Рог Репутация: нет Всего: нет |
Простите, что задолбал, но очень надо! Что я делаю открываю файл с помощью hview ! Делаю представление кода в HEX, нахожу нужную мне строку по смещению 000266A0, нашел далее вижу строку Теперь помогите как поменять OF84B7000000 на 0F85B7000000!!! Денло в том, что Я пишу! procedure TForm1.Button1Click(Sender: TObject); var f:file of byte; b:Byte; begin b:= AssignFile(f,'c:\jpegopt.exe'); Reset(f); seek(f,$004270A1); write(f,b); CloseFile(f); end; end. Помогите как в шестнадцатирично формате представить число 85 и заменить! Посмотрите на мой алгоритм и исправте!! Простите за ошибки! ПОМОГИТЕ ПОЖАЙЛУСТА!! -------------------- Воображение гораздо важнее знаний! (Эйнштейн) |
|||
|
||||
| Baa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2639 Регистрация: 12.4.2002 Где: Москва Репутация: нет Всего: 12 |
Значит так...смещение известно или его надо найти? я тебе дал код как его найти, зная байты
-------------------- "Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande |
|||
|
||||
| Vit |
|
|||
![]() Vitaly Nevzorov ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 10964 Регистрация: 25.3.2002 Где: Chicago Репутация: 48 Всего: 207 |
procedure TForm1.Button1Click(Sender: TObject);
var f:file of byte; b:Byte; begin b:=$85; AssignFile(f,'c:\jpegopt.exe'); Reset(f); seek(f,$004270A1); write(f,b); CloseFile(f); end; -------------------- With the best wishes, Vit I have done so much with so little for so long that I am now qualified to do anything with nothing Самый большой Delphi FAQ на русском языке здесь: www.drkb.ru |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |