recuperar password wireles de pc local (solo windows7)
Publicado: 07 Sep 2013, 09:12
bueno agradesco a metal y a orlando por ayudarme
este codigo que les dejo debe lanzarse desde un servicio(solo la cuenta system desencrypta la key)
crean el servicio con delphi y agregan el codigo, luego tienen que instalar el
servicio y despues inciarlo)
"hay muchos manuales en delphi para programar servicios".
intente con inyeccion en system pero no pude , mejor me quede con el servicio.
la unica cosa extraña es que en ves de dejarme el wkey.txt (es donde almaceno la key) en c:\user\appdata\local\temp, donde le indico , me lo deja en c:\windows\temp y ese era mi error que me tenia de los pelos , generaba el log donde yo no lo encontraba y pense que era problema de mal programacion del servicio, pero no funciona de 10 .
cuando termine otros codigos voy a dejar en nuestros programas el ejecutable final full.
este es el codigo final para recuperar la clave wireles de tu pc
bueno me canse de programar nos vemos
este codigo que les dejo debe lanzarse desde un servicio(solo la cuenta system desencrypta la key)
crean el servicio con delphi y agregan el codigo, luego tienen que instalar el
servicio y despues inciarlo)
"hay muchos manuales en delphi para programar servicios".
intente con inyeccion en system pero no pude , mejor me quede con el servicio.
la unica cosa extraña es que en ves de dejarme el wkey.txt (es donde almaceno la key) en c:\user\appdata\local\temp, donde le indico , me lo deja en c:\windows\temp y ese era mi error que me tenia de los pelos , generaba el log donde yo no lo encontraba y pense que era problema de mal programacion del servicio, pero no funciona de 10 .
cuando termine otros codigos voy a dejar en nuestros programas el ejecutable final full.
este es el codigo final para recuperar la clave wireles de tu pc
Código: Seleccionar todo
program Project1;
{$APPTYPE CONSOLE}
uses
windows,
sysutils,
classes,
dialogs;
CONST
CRYPT_STRING_HEX=4;
type
TDATA_BLOB = record
cbData: DWORD;
pbData: PByte;
end;
PDATA_BLOB = ^TDATA_BLOB;
TCRYPTPROTECT_PROMPTSTRUCT = record
cbSize: DWORD;
dwPromptFlags: DWORD;
hwndApp: HWND;
szPrompt: PWChar;
end;
PCRYPTPROTECT_PROMPTSTRUCT = ^TCRYPTPROTECT_PROMPTSTRUCT;
function Pars(T_, ForS, _T: string): string;
var
a, b: integer;
begin
Result := '';
if (T_ = '') or (ForS = '') or (_T = '') then
Exit;
a := Pos(T_, ForS);
if a = 0 then
Exit
else
a := a + Length(T_);
ForS := Copy(ForS, a, Length(ForS) - a + 1);
b := Pos(_T, ForS);
if b > 0 then
Result := Copy(ForS, 1, b - 1);
end;
procedure FindFiles(StartDir, FileMask: string;
recursively: boolean;var FilesList: TStringList);
const
MASK_ALL_FILES = '*.*';
CHAR_POINT = '.';
var
sRec: TSearchRec;
// SR: TSearchRec;
DirList: TStringList;
IsFound: Boolean;
i: integer;
begin
if (StartDir[length(StartDir)] <> '\') then begin
StartDir := StartDir + '\';
end;
// Crear la lista de ficheos en el dir. StartDir (no directorios!)
IsFound := FindFirst(StartDir + FileMask,
faAnyFile - faDirectory, sRec) = 0;
// MIentras encuentre
while IsFound do begin
FilesList.Add(StartDir + sRec.Name);
IsFound := FindNext(sRec) = 0;
end;
FindClose(sRec);
// Recursivo?
if (recursively) then begin
// Build a list of subdirectories
DirList := TStringList.Create;
// proteccion
try
IsFound := FindFirst(StartDir + MASK_ALL_FILES,
faAnyFile, sRec) = 0;
while IsFound do begin
if ((sRec.Attr and faDirectory) <> 0) and
(sRec.Name[1] <> CHAR_POINT) then begin
DirList.Add(StartDir + sRec.Name);
end;
IsFound := FindNext(sRec) = 0;
// end; // if
end; // while
FindClose(sRec);
// Scan the list of subdirectories
for i := 0 to DirList.Count - 1 do begin
FindFiles(DirList[i], FileMask, recursively, FilesList);
end;
finally
DirList.Free;
end;
end;
end;
const
// flag el dato lo puede descifrar cualquier usuario
CRYPTPROTECT_LOCAL_MACHINE = 4;
var
size :dword = 1024;
byteKey: array[0..1024] of pbyte;
FilesList,datos: TStringList;
s2:wideString;
Src, Dst: TDATA_BLOB;
i:integer;
s,t1,t2:string;
f:textfile;
resp:bool;
function CryptUnprotectData(pDataIn: PDATA_BLOB; szDataDescr: PWChar;
pOptionalEntropy: PDATA_BLOB; pvReserved: Pointer;
pPromptStruct: PCRYPTPROTECT_PROMPTSTRUCT; dwFlags: DWORD; pDataOut: PDATA_BLOB
): BOOL; stdcall; external 'Crypt32.dll';
function CryptStringToBinary(pszString: PwideChar; cchString: DWORD; dwFlags: DWORD;
pbBinary: pbyte; var pcbBinary: dword; pdwSkip: PDWORD;
pdwFlags: PDWORD): BOOL; stdcall;
external 'Crypt32.dll' name 'CryptStringToBinaryW';
//CryptStringToBinaryW (Unicode) d2010 and CryptStringToBinaryA (ANSI) d7
begin
try
begin
datos := TStringList.Create;
FilesList := TStringList.Create;
findfiles('C:\ProgramData\Microsoft\Wlansvc\Profiles\','*.xml',true,FilesList) ; //true recursividad es si busca en subcarpetas
for i:=0 to FilesList .Count -1 do begin
datos.loadfromfile(fileslist[i]);
s:=datos.text;
t1:= (pars('<name>',s,'</name>'));
//essid
t2:= (pars('<authentication>',s,'</authentication>'));//cifrado wep o wpa
s2:= (pars('<keyMaterial>',s,'</keyMaterial>')); //clave wireles
fileslist.SaveToFile((GetEnvironmentVariable('TEMP') +'\info redes.txt'));
// convertir a byte array
resp:= CryptStringToBinary (pwidechar(S2),length(S2),CRYPT_STRING_HEX, @byteKey,size,nil, nil);
if resp =true then
begin
AssignFile(f,( GetEnvironmentVariable('TEMP') +'\wkey.txt'));
if FileExists(( GetEnvironmentVariable('TEMP') +'\wkey.txt')) then
append(f)
else
rewrite(f);
try
dst.cbData:= (size);
Dst.pbdata :=(@bytekey[0]);
showmessage( pchar(@bytekey[0]));
writeln(f,'essid: '+t1);
writeln(f,'------------------');
writeln(f,'tipo de encriptacion: '+t2);
writeln(f,'------------------');
if CryptUnProtectData(@Dst,nil,nil,nil,nil,CRYPTPROTECT_LOCAL_MACHINE,@Src) then
begin
writeln(f,('password is: '+pansichar(Src.pbData)));
CloseFile(f);
end
else begin
writeln(SysErrorMessage(GetLastError));
writeln('presione enter para saliir');
readln;
end;
finally
end;
end;
end;
datos.free;
FilesList.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.