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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как изменить код программы, Каким образом... 
:(
    Опции темы
Goph
Дата 29.5.2002, 17:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Здраствуйте!
Подскажите как создать файл в Delphi, чтобы при нажатии на кнопку можно было с винта открыть exe файл а при нажатии на другую кнопку изменить такой код в программе(важно)
:004270A0 0F84B7000000                           je 0042715D
поменять je на jne!!!!!, то есть заменить 84 на 85!!
Желательно asm вставку мне тут ктото писал....
Зарание спасибо!
Vit не надо было так кричать!

:)

--------------------------------------------
Воображение горраздо важнее знаний (Энштейн)


--------------------
Воображение гораздо важнее знаний!
                                (Эйнштейн)
PM MAIL ICQ   Вверх
Baa
Дата 29.5.2002, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Если не секрет, то зачем тут асм вставка? Находишь эти байты ( file of byte )
И меняешь, а потом записываешь...
Например можно так:
Читаешь байты и тут же пишешь...если находишь нужную последовательность ( по смещению так или как еще ) просто меняешь байты в переменной и пишешь дальше, а потом старый файл удаляешь


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Goph
Дата 30.5.2002, 12:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Baa @ 29.5.2002, 19:12)
Если не секрет, то зачем тут асм вставка? Находишь эти байты ( file of byte )
И меняешь, а потом записываешь...
Например можно так:
Читаешь байты и тут же пишешь...если находишь нужную последовательность ( по смещению так или как еще ) просто меняешь байты в переменной и пишешь дальше, а потом старый файл удаляешь

Это все хорошо , но я не разу с этим не сталкивался напиши подробнее!!!
СПАСИБО!!!


--------------------
Воображение гораздо важнее знаний!
                                (Эйнштейн)
PM MAIL ICQ   Вверх
Vit
Дата 30.5.2002, 14:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Goph
Дата 30.5.2002, 17:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vit @ 30.5.2002, 15:09)
Я тут статью начал о файлах:

http://www.forum.vingrad.ru/cgi-bin....;t=1166

Там где описывается запись и чтение байтов из типизированного файла - это как раз то что тебе нужно, читни, если что еще не понятно - пиши.

Я так понял что там описуется открытие и редактирования txt!
По твоему коду он не понимает что за "s" и говорит Incom... type!
Мне нужно только найти :004270A0 0F84B7000000                           je 0042715D
Как осуществить поиск, и вписать вместо OF84B7000000 OF85B7000000 !
Как будет осуществляться поиск по смещению или просто (find)!
Ответь пожайлуста!


--------------------
Воображение гораздо важнее знаний!
                                (Эйнштейн)
PM MAIL ICQ   Вверх
Vit
Дата 30.5.2002, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Vit
Дата 30.5.2002, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Goph
Дата 30.5.2002, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vit @ 30.5.2002, 18:21)
По абсолютному смещению в файле найти очень просто(если это смещение известно), если надо проводить поиск и замену по всему файлу, то прийдется его байт за байтом читать, искать нужную последовательность и менять. Если файл достаточно большой то имеет смысл его прочитать в буффер целиком, там найти и заменить что нужно.

Этот код?
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!


--------------------
Воображение гораздо важнее знаний!
                                (Эйнштейн)
PM MAIL ICQ   Вверх
Vit
Дата 30.5.2002, 18:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Goph
Дата 31.5.2002, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



read(f,b);
write(f,b);
seek(f,100);
Size(f);
Eof(f);
CloseFile(f);
Єто все фенкции?
Но всетаки как найти строчку 0002445A?
Спасибо!


--------------------
Воображение гораздо важнее знаний!
                                (Эйнштейн)
PM MAIL ICQ   Вверх
Goph
Дата 31.5.2002, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vit @ 30.5.2002, 19:35)
Господи! Неужели я настолько непонятно пишу? Это же код для чтения текстового файла (и весь тот ответ посвящен текстовым файлам, надо смотреть дальше), а я тебе еще в самом первом ответе написал что надо посмотреть ту часть где я разбираю работу с типизированными файлами. Неужели совершенно не интересно самому разобраться как ЭТО все работает, а статья просматривается только на предмет найти кусок работающего кода всунуть в свою программу и забыть об этом? Я не буду писать код за вас, особенно настолько простой, могу подсказать как это делать, найти ошибку, объяснить механизм, но специально писать куски кода под чьи-то нужды не хочу. Учитывая, что найти кусок статьи посвященный чтению и записи отдельных байтов в файл в моей статье по совершенно непонятным для меня причинам не возможно я приведу его снова, попробуйте в нем разобраться и напишите если что непонятно, только как и всякая статья, моя была написана из расчета, что чтение какого-либо куска, предполагает знание того что было записано до того:

Теперь разберем типизированные файлы. Типизированный файл - это файл в котором записанны идентичные структуры. Например любой файл можно считать файлом байтов - т.е. можно его читать байт за байтом, можно перейти сразу к любому байту по его номеру, можно сразу узнать сколько байт в файле, можно заменить любой байт на другой не перезаписывая файл. Теперь все это в примерах:
Объявляем файл байтов:
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);

read(f,b);
write(f,b);
seek(f,100);
Size(f);
Eof(f);
CloseFile(f);
Єто все фенкции?
Но всетаки как найти строчку 0002445A?
Спасибо!


--------------------
Воображение гораздо важнее знаний!
                                (Эйнштейн)
PM MAIL ICQ   Вверх
Vit
Дата 31.5.2002, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Baa
Дата 31.5.2002, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 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
PM ICQ   Вверх
Baa
Дата 31.5.2002, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Если надо могу еще и объяснить как заменить байты, но думаю должно быть понятно...Хотя насчет кода выше я не особо уверен...писал навскиду...


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Goph
Дата 31.5.2002, 18:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Baa @ 31.5.2002, 16:19)
Если надо могу еще и объяснить как заменить байты, но думаю должно быть понятно...Хотя насчет кода выше я не особо уверен...писал навскиду...

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 такой код
:004270A0 0F84B7000000                           je 0042715D

на
:004270A0 0F85B7000000                           je 0042715D

если увидел то 84 на 85!
Я распаковываю hwiev смотрю это место есть смещение 000266A1 и под таким адресом PE.002470A1 именно на 84 но он пишет в моем коде вверху, что не правильно!
как мне заменить 84 на 85 и где у меня ошибка в коде!!
СПАСИБО!


--------------------
Воображение гораздо важнее знаний!
                                (Эйнштейн)
PM MAIL ICQ   Вверх
Vit
Дата 31.5.2002, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Goph
Дата 31.5.2002, 20:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Vit @ 31.5.2002, 19:36)
Вместо

seek(f,002470A1);

Совершенно очевидно надо

seek(f,$002470A1);

так как это шестнадцатиричное число

Простите, что задолбал, но очень надо!

Что я делаю открываю файл с помощью hview ! Делаю представление кода в HEX, нахожу нужную мне строку по смещению 000266A0, нашел далее вижу строку
:004270A0 0F84B7000000 je 0042715D
Теперь помогите как поменять OF84B7000000 на 0F85B7000000!!!
Денло в том, что :004270А0 это смещение на всю строку а если шагать в право начиная с OF то через каждых два числа меняется 004270A0 на 004270A1 (именно та строка что мне нужна , в этой строке представлено число 84 которое нужно поменять на 85!!) и так дальше!
Я пишу!
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 и заменить!
Посмотрите на мой алгоритм и исправте!!
Простите за ошибки!
ПОМОГИТЕ ПОЖАЙЛУСТА!!


--------------------
Воображение гораздо важнее знаний!
                                (Эйнштейн)
PM MAIL ICQ   Вверх
Baa
Дата 31.5.2002, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2639
Регистрация: 12.4.2002
Где: Москва

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



Значит так...смещение известно или его надо найти? я тебе дал код как его найти, зная байты


--------------------
"Duty is everything; the greatest of joys, the deepest of sorrows" Aribeth de Tylmarande
PM ICQ   Вверх
Vit
Дата 31.5.2002, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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
PM MAIL WWW ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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