Guest User

Untitled

a guest
Oct 4th, 2015
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
Add Comment
Please, Sign In to add comment