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