View difference between Paste ID: D6zqDVgf and Az5jSRii
SHOW: | | - or go back to the newest paste.
1
/*
2
3
DELL service tag: NOSOUP4-3A5B password: zvd97y9h         (md5 de97a8c9794cbac3e5ede9e5bf284553)
4
5
DELL service tag: DELLSUX-1F66 password: qHXaL0ntli6Gu4c0 (md5 60e11d9c76f323979b7512d4c4b3b0b9)
6
DELL service tag: ABCDEFG-1D3B password: xvn0qEeftqyrkG52 (md5 fca82504b3b1be2584c5c1850fbb7f09)
7
DELL service tag: 1DHB1M1-1F5A password: 6sDD9MGlsnIlOzGX
8
DELL service tag: GMYX4Q1-1F5A password: 9231fbq34Awq7Rz0
9
10
HD Code: #**6248F05NS-1D3B password: ID3JQTF7Ja0w92Wq     (md5 cdeb8939ffb1d1230e1f6d0bf89982a7)
11
12
*/
13
14
#include <stdio.h>
15
#include <string.h>
16
#include <time.h>
17
18
#define mystr "My own utility. Copyright (C) 2007-2010 hpgl, Russia"
19
20
#define fSVCTAG 0
21
#define fHDDSN 1
22
#define fHDDold 2
23
#define t595B 0
24
#define tD35B 1
25
#define tA95B 2
26
#define t2A7B 3
27
#define t3A5B 4
28
29
char bSuffix[]="595BD35BA95B2A7B3A5B";
30
31
char scancods[]="\00\0331234567890-=\010\011qwertyuiop[]\015\377asdfghjkl;'`\377\\zxcvbnm,./";
32
char encscans[]={0x05,0x10,0x13,0x09,0x32,0x03,0x25,0x11,0x1F,0x17,0x06,0x15, \
33
                 0x30,0x19,0x26,0x22,0x0A,0x02,0x2C,0x2F,0x16,0x14,0x07,0x18, \
34
                 0x24,0x23,0x31,0x20,0x1E,0x08,0x2D,0x21,0x04,0x0B,0x12,0x2E};
35
36
char chartabl2A7B[72]="012345679abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ0";
37
38
unsigned int MD5magic[64]={
39
0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
40
0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
41
0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
42
0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
43
0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
44
0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
45
0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
46
0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
47
0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
48
0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
49
0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x4881d05,
50
0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
51
0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
52
0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
53
0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
54
0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391};
55
56
unsigned char inData[23],outData[16];
57
char buf1output[32], buf1input[20];
58
char bug4;
59
60
void calcsuffix(char bfunc, char btype, char *outbuf);
61
62
void initData(void) {
63
	*(int *)(&outData[0]) =0x67452301;
64
	*(int *)(&outData[4]) =0xEFCDAB89;
65
	*(int *)(&outData[8]) =0x98BADCFE;
66
	*(int *)(&outData[12])=0x10325476;
67
}
68
69
typedef int (encfuncT1) (int num1, int num2, int num3);
70
typedef int (encfuncT2)(encfuncT1 func, int num1, int num2, int num3, int key);
71
72
int enc0F1(encfuncT1 func, int num1, int num2, int num3, int key) {return func(num1,num2,num3)-key;}
73
int enc1F1(encfuncT1 func, int num1, int num2, int num3, int key) {return func(num1,num2,num3)+key;}
74
75
int enc0F2(int num1, int num2, int num3) {return (((~num3 ^ num2) & num1) ^ ~num3);}
76
int enc1F2(int num1, int num2, int num3) {return ((( num3 ^ num2) & num1) ^ num3);}
77
78
int encF3 (int num1, int num2, int num3) {return ((( num1 ^ num2) & num3) ^ num2);}
79
80
int enc0F4(int num1, int num2, int num3) {return (( ~num2 ^ num1) ^ num3); }
81
int enc1F4(int num1, int num2, int num3) {return (( num2 ^ num1) ^ num3); }
82
83
int enc0F5(int num1, int num2, int num3) {return (( ~num1 | ~num3) ^ num2); }
84
int enc1F5(int num1, int num2, int num3) {return (( num1 | ~num3) ^ num2); }
85
86
unsigned int rol(unsigned int t, int bitsrot) {
87
	return (t >> (32-bitsrot)) | (t << bitsrot);
88
}
89
90
void blockEncodeF(int *outdata, int *encblock, encfuncT2 func1,
91
                  encfuncT1 func2, encfuncT1 func3, encfuncT1 func4, encfuncT1 func5 )
92
{
93
	char S[4][4] = {{ 7, 12, 17, 22 },{ 5, 9, 14, 20 },{ 4, 11, 16, 23 },{ 6, 10, 15, 21 }};
94
	int A,B,C,D,t,i;
95
96
	A=outdata[0];
97
	B=outdata[1];
98
	C=outdata[2];
99
	D=outdata[3];
100
101
	for (i=0;i<64;i++) {
102
		t=MD5magic[i];
103
		switch (i>>4) {
104
			case 0: t=A+func1(func2,B,C,D, t+encblock[(i) & 15]); break;
105
			case 1: t=A+func1(func3,B,C,D, t+encblock[(i*5+1) & 15]); break;
106
			case 2: t=A+func1(func4,B,C,D, t+encblock[(i*3+5) & 15]); break;
107
			case 3: t=A+func1(func5,B,C,D, t+encblock[(i*7) & 15]); break;
108
		}
109
		A=D; D=C; C=B; B+=rol(t,S[i>>4][i&3]);
110
	};
111
112
	outdata[0]+=A;
113
	outdata[1]+=B;
114
	outdata[2]+=C;
115
	outdata[3]+=D;
116
}
117
118
void blockEncode(char *outdata, int *encblock, char btype) {
119
	if (btype==tD35B)
120
		blockEncodeF((int *)outdata,encblock,enc1F1,enc1F2,encF3,enc1F4,enc1F5);
121
	else
122
		blockEncodeF((int *)outdata,encblock,enc0F1,enc0F2,encF3,enc0F4,enc0F5);
123
}
124
125
void encode(char *inbuf,int cnt,char btype) {
126
	int encBlock[16];
127
	char *ptr;
128
	initData();
129
	memcpy(encBlock,inbuf,cnt);
130
	ptr=&((char *)encBlock)[cnt];
131
	*ptr++=0x80;
132
	memset(ptr,0,64-1-cnt);
133
	encBlock[16-2]=((unsigned int)cnt << 3);
134
	blockEncode(outData,encBlock,btype);
135
}
136
137
void psw(char bfunc, char btype, char *outbuf) {
138
	int cnt,i,lenpsw,r;
139
	if (bfunc==fHDDold) {
140
		memcpy(inData,buf1input,11);
141
//		calcsuffix(bfunc,btype,outbuf);
142
		for (cnt=0;cnt<8;cnt++)
143
			outbuf[cnt]= scancods[ outbuf[cnt] ];
144
	} else {
145
		memset(inData,0,sizeof(inData));
146
		if (bfunc==fSVCTAG)
147
			cnt=7;
148
		else
149
			cnt=11;
150
151
		if ((bfunc==fHDDSN) && (btype==tA95B))
152
			memcpy(inData,&buf1input[3],cnt-3);
153
		else
154
			memcpy(inData,buf1input,cnt);
155
156
		switch (btype){
157
			case t595B:	memcpy(&inData[cnt],&bSuffix[0],4); break;
158
			case tD35B: memcpy(&inData[cnt],&bSuffix[4],4); break;
159
			case tA95B: memcpy(&inData[cnt],&bSuffix[0],4); break;
160
			case t2A7B: memcpy(&inData[cnt],&bSuffix[12],4); break;
161
			case t3A5B: memcpy(&inData[cnt],&bSuffix[16],4); break;
162
		}
163
		cnt += 4;
164
		inData[cnt] = inData[4] & 0x1F;
165
		inData[cnt+1] = ((inData[4] >> 5) | (((inData[3] >> 5) | (inData[3] << 3)) & 0xF1) & 0x1F);
166
		inData[cnt+2] = ((inData[3] >> 2) & 0x1F);
167
		inData[cnt+3] = (inData[3] >> 7) | ((inData[2] << 1) & 0x1F);
168
		inData[cnt+4] = (inData[2] >> 4) | ((inData[1] << 4) & 0x1F);
169
		inData[cnt+5] = (inData[1] >> 1) & 0x1F;
170
		inData[cnt+6] = (inData[1] >> 6) | ((inData[0] << 2) & 0x1F);
171
		inData[cnt+7] = (inData[0] >> 3) & 0x1F;
172
		for (i=cnt;i<8+cnt;i++) {
173
			r = 0xAA;
174
			if (inData[i] & 1)
175
				r ^= inData[4];
176
			if (inData[i] & 2)
177
				r ^= inData[3];
178
			if (inData[i] & 4)
179
				r ^= inData[2];
180
			if (inData[i] & 8)
181
				r ^= inData[1];
182
			if (inData[i] & 16)
183
				r ^= inData[0];
184
			inData[i] = encscans[r % sizeof(encscans)];
185
		}
186
		cnt = 23;
187
		encode(inData,cnt,btype);
188
		r = outData[0] % 9;
189
		lenpsw = 0;
190
		for (cnt=0;cnt<16;cnt++) {
191
			if ((r <= cnt) && (lenpsw<8)) {
192
				buf1output[lenpsw++] = scancods[encscans[outData[cnt] % sizeof(encscans)]];
193
			}
194
		}
195
	}
196
}
197
198
199
int main(int argc, char *argv[]) {
200
	unsigned char len,len1,bfunc,eol=1,echo=0, *minus,s2[20];
201
	signed char btype; int argn=0;
202
	if (argc>1)	echo=1;
203
204
	if (!echo)
205
		fputs("" mystr "\n" \
206
		  "Short service tag should be right padded with '*' up to length 7 chars\n" \
207
		  "HDD serial number is right 11 chars from real HDDSerNum left padded with '*'\n" \
208
		  "Some BIOSes has left pad HDD serial number with spaces instead '*'\n",stdout);
209
210
	while (!feof(stdin)) {
211
		if ((argc<=1) && argn) break;
212
		fputs("Input: #",stdout);
213
		if (argc>1) {
214
			strncpy(buf1input,argv[++argn],sizeof(buf1input)); argc--;
215
		} else {
216
			if (!eol)
217
				while (!feof(stdin) && (fgetc(stdin)!='\n')); eol=0;
218
					if (fgets(buf1input,16+1+1,stdin)==NULL) {
219
						if (echo) fputs("\n",stdout); break;
220
					}
221
		}
222
		len=strlen(buf1input);
223
		if (len && (buf1input[len-1]=='\n')) {len--;eol=1;buf1input[len]=0;}
224
		if (echo) {fputs(buf1input,stdout);fputs("\n",stdout);}
225
		minus=strchr(buf1input,'-');
226
		if (len==11) {
227
			if (minus!=NULL) {
228
				fputs("- Incorrect input\n",stdout);
229
				continue;
230
			}
231
			bfunc=fHDDold;
232
			fputs("By HDD serial number for older BIOS: ",stdout);
233
		} else {
234
			if (len==0) break;
235
			if (minus==NULL) {
236
				fputs("- No BIOS type found in input string, must be followed by -595B and other registered\n",stdout);
237
				continue;
238
			}
239
			len1=minus-(unsigned char*)buf1input;
240
241
			btype=-1;
242
			if (strncmp(&buf1input[len1+1],&bSuffix[0],4)==0) btype=t595B;
243
			else
244
			if (strncmp(&buf1input[len1+1],&bSuffix[4],4)==0) btype=tD35B;
245
			else
246
			if (strncmp(&buf1input[len1+1],&bSuffix[8],4)==0) btype=tA95B;
247
			else
248
			if (strncmp(&buf1input[len1+1],&bSuffix[12],4)==0) btype=t2A7B;
249
			else
250
			if (strncmp(&buf1input[len1+1],&bSuffix[16],4)==0) btype=t3A5B;
251
252
			if (btype<0) {
253
				fputs("- Invalid service tag in input string, allowed only -D35B and other registered\n",stdout);
254
				continue;
255
			}
256
			struct tm *time1; time_t timer1=time(NULL);
257
			time1=gmtime(&timer1);
258
			strftime(s2,sizeof(s2),"%d.%m.%Y %H:%M",time1);
259
			fputs(s2,stdout);
260
			fputs(" DELL ",stdout);
261
262
			if (len1==7) {
263
				bfunc=fSVCTAG;
264
				fputs("service tag: ",stdout);
265
				fputs(buf1input,stdout);
266
			} else
267
			if (len1==11) {
268
				bfunc=fHDDSN;
269
				fputs("HDD serial number: ",stdout);
270
				fputs(buf1input,stdout);
271
			}
272
			else {
273
				fputs("- Incorrect input, must be 7 chars service tag or 11 chars HDD serial number\n",stdout);
274
				continue;
275
			}
276
		}
277
		psw(bfunc,btype,buf1output);
278
		fputs(" password: ",stdout);
279
		fputs(buf1output,stdout);
280
		if (bug4) fputs(" !bug4 warning - password may not work!",stdout);
281
282
		if (btype==t595B) if (bfunc==fSVCTAG) { //to check if A95B bug
283
			char mpw1[20];
284
			strcpy(mpw1,buf1output);
285
			psw(bfunc,tA95B,buf1output);
286
			if (strcmp(mpw1,buf1output)!=0) {
287
				fputs(" passwordA95B: ",stdout);
288
				fputs(buf1output,stdout);
289
			}
290
		}
291
		fputs("\n",stdout);
292
	}
293
	return 0;
294
}