SHARE
TWEET

Untitled

a guest Jan 23rd, 2011 23,751 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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. }
RAW Paste Data
Top