Заменяем текст в откомпилированном фаиле (ПАТЧЕР)

Сегодня наша статья будет посвящена работе с фаилами а точнее с их содержимым.
Я покажу вам как написать програмулину которая заменяет текстовые данные в ехе
фаиле причем без потери работоспособности! Подобным образом работают некоторые русификаторы
используется такой метод и при настройке троянов
(конфигуратор прописывает в фаиле сервера нужный вам мэил адрес)

для лучшего понимания кода расскажу алгоритм работы:
программа находит указатель (у меня это ":)") начала
строки (кстати указатель нужен для быстрого поиска строки в фаиле)далее переписывает старый текст (без проверки)
сама текстовая строка в фаиле должна быть фиксированной длины символов
можно и больше и меньше смысл переписи меньшей строки на большую
символ 0 значит пустая ячейка и если новая будет больше то кол-во нулей
просто уменьшаем а длина строки остается одинаковой(!) и наооборот
пример:
:)FUCK0000000000 заменяем на
:)SUCKER00000000 длина строки как и была
а что делать с нулями в тексте спросите вы ? да мы просто при использовании
строки в фаиле поставим функцию которая обрезает лишнее и выдет из
:)SUCKER00000000 строку SUCKER все просто!!!

для работы с филами нам понадобится TmemoryStream
на мой взгляд самый удобный класс.

вот код

procedure TForm1.Button1Click(Sender: TObject);
var
myfile:tmemorystream; //потоковый класс для работы с фаилом
buf:array of char; //сюда будем считывать
filebuf:byte;
name,text,oldtext:string;
i,k:integer;
begin
name:='file.exe';//фаил для открытия
text:='FUCK0000000000'; //новая строка
//oldtext:='SUCKER00000000';//старая строка
myfile:=tmemorystream.Create;
myfile.LoadFromFile(name); //открываем
SetLength(buf,myfile.size); //делаем массив
for i:=0 to myfile.size do
begin
myfile.Seek(i,sofrombeginning);//поехали по фаилу
myfile.Read(filebuf,1); //читаем
buf[i]:=char(filebuf);
if i>10 then if buf[i-1]+buf[i]=':)' then //если символ начала строки то...
begin
for k:=1+i to length(text)+i do //далее переписываем на новую!
begin
myfile.Seek(k,sofrombeginning);
myfile.Write(text[k-i],1);
end;
showmessage('PATCHED SUCKCESS!!!'); //:) ну вот и все а ты боялся...
myfile.SaveToFile(extractfilepath(name)+'CRAKED_'+extractfilename(name));
//сохраняем переписанный поток в новый фаил с пометкой CRAKED_
break;//дальше смотреть я не буду: только одна замена!
end;

end;

end;

а вот и функция обрезания лишнего

function Tform1.realstr(text:string):string;//вход и выход строка
var
i:integer;
newline:String;//переменная для новой строки
begin
i:=3;//начинаем сразу после начала :) это 2 символа
newline:='';
while text[i]<>'0' do//пока не начались нули
begin
newline:=newline+text[i];//забиваем новую строку
inc(i);
end;
result:=newline;//результат передаем обратно
end;

ну и все на сегодня. Скажу сразу, что это не идеальный вариант кода и лучше его доделать вот простой список апгрейда кода: проверять старую строку на идентичность а не слепо писать, добавить структуру из нескольких меток к примеру у меня :) а лучше если несколько меток то приписывать номер :1) , :2)...,поиск строки по определенному адресу(запомнить смещение в фаиле и работать без цикла),ну много чего еще можно придумать все в ваших силах!

 
Хостинг от uCoz