Advertisement
2002C Registry #15893

Windows Screen Saver Password Decoder

Tells you the Windows screen saver password

AI

AI Summary: This codebase represents a historical implementation of the logic described in the metadata. Our preservation engine analyzes the structure to provide context for modern developers.

Source Code
original-source
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
unsigned char matrix[256+2];
unsigned char matgut[256+2];
unsigned char mystery[4]={ 0xb2, 0xdc, 0x90, 0x8f };
unsigned char h1;
unsigned char pa[79], passwd[80];
unsigned char tofind[30];
int h2=4;
unsigned int lentofind;
int len;
void fixmatrix()
{
	 unsigned char orig, mys, help1, last;
  int i,j, help2;
	 for(i=0; i<256; i++)
		 matrix[i]=i;
	 matrix[256]=0; matrix[256+1]=0;
	 h1=0; last=0;
	 for(j=0;j<256;j++) {
		 orig=matrix[j];
		 mys=mystery[h1];
		 help2=(mys+last+matrix[j]) & 0xff;
		 help1=matrix[help2];
		 matrix[j]=help1;
		 matrix[help2]=orig;
		 last=help2;
		 h1++; h1=h1%4;
	 }
	 memcpy(matgut, matrix, sizeof(matrix));
}
void check(char *test)
{
	 unsigned char help1, oldh2;
	 int i;
	 strcpy(passwd, test);
	 strcpy(pa, passwd);
	 len=strlen(pa);
	 memcpy(matrix, matgut, sizeof(matrix));
	 h1=0; h2=0;
	 for(i=0;i<len;i++)
	 {
		 h1++; h1=h1&0xff;
		 oldh2=matrix[h1];
		 h2=(h2+matrix[h1]) & 0xff;
		 help1=matrix[h1];
		 matrix[h1]=matrix[h2];
		 matrix[h2]=help1;
		 help1=(matrix[h1]+oldh2) & 0xff;
		 help1=matrix[help1];
		 pa[i]^=help1;
	 }
}
int is_ok(char a)
{
	 if ((a<='9') && (a>='0'))
		 return 1;
	 else if ((a<='F') && (a>='A'))
		 return 1;
	 else
		 return 0;
}
int nibble(char c)
{
	 if((c>='A') && (c<='F'))
		 return (10+c-'A');
	 else if((c>='0') && (c<='9'))
		 return (c-'0');
}
void parse(char *inpt)
{
	 char *tok;
	 char num[2];
	 lentofind=0;
	 tok=strtok(inpt, "\t ,\n");
	 while(tok!=NULL) {
		 num[0]=tok[0]; num[1]=tok[1];
		 if ((!is_ok(num[0])) || (!is_ok(num[1])))
		 {
				puts("Please input strings like: b2,a1,03");
				exit(0);
		 }
		 tofind[lentofind++]=16*nibble(num[0])+nibble(num[1]);
		 tok=strtok(NULL, "\t ,\n");
	 }
	 tofind[lentofind]=0;
}
int hex(char *str)
{
	return (str[0]-'0')*16+(str[1]-'0');
}
void main()
{
	 unsigned int i;
	 int j,n=0,odd=0;
	 unsigned char tst[80];
	 char inpt[120];
	 char ascii[120];
	 char temp[3];
	 char ans;
	 fixmatrix();
	 printf("All ascii codes are from der RegEdit and hex codes are from ein text editor\n\n");
	 do
	 {
		 printf("Are der codes hex or ascii [h/a]?");
		 ans = getchar();
		 getchar();
	 } while(tolower(ans) != 'h' && tolower(ans) != 'a');
	 tolower(ans) == 'a';
	 if(tolower(ans) == 'a')
	 {
		 printf("Give me the codes, separated by commas (in ascii):\n >");
		 gets(ascii);
    i=0;
    do
    {
			 temp[0]=ascii[i];
     temp[1]=ascii[i+1];
     temp[2]=NULL;
     inpt[n]=hex(temp);
			 n++;
     odd++;
     if(odd % 2 == 0 && i+3<=strlen(ascii))
     {
				 inpt[n]=',';
       n++;
     }
     i+=3;
		 }while(i<=strlen(ascii));
    inpt[n]=NULL;
		 printf("Der hex codes fur der password are: %s\n", inpt);
	 }
	 else
	 {
		 printf("What are der codes, separated by commas, in hex?:\n >");
		 gets(inpt);
	 }
	 for(i=0;i<strlen(inpt);i++)
		 inpt[i]=toupper(inpt[i]);
	 parse(inpt);
	 for(i=0; i<lentofind; i++)
		 tst[i]='A';
	 tst[lentofind]=0;
	 for(i=0; i<lentofind; i++)
	 {
		 for(j=' '; j<='Z'; j++)
		 {
				tst[i]=j;
				check(tst);
				if(pa[i]==tofind[i])
					 break;
		 }
	 }
	 printf("Password is: %s\n", tst);
	 exit(0);
	 }
Original Comments (3)
Recovered from Wayback Machine