Advertisement
Guest User

Untitled

a guest
Jan 16th, 2019
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.66 KB | None | 0 0
  1. #include<iostream>
  2. #include<fstream>
  3. #include<cstring>
  4. using namespace std;
  5.  
  6. const unsigned char MAGIC[4] = {0x42, 0x47, 0x41, 0x44};
  7. const unsigned char AES_KEY[32] = {0xFB, 0x32, 0x83, 0x3C, 0x8C, 0xC4, 0x03, 0x01, 0x8A, 0xC1, 0xEA, 0xB9, 0x21, 0xF5, 0x6C, 0x26, 0x18, 0xA4, 0xAF, 0x7E, 0x38, 0xCC, 0xC9, 0xCF, 0x52, 0x67, 0xAA, 0x19, 0xFD, 0xBA, 0x32, 0x0C};
  8. const unsigned char AES_RKY[32] = {0x3C, 0x83, 0x32, 0xFB, 0x01, 0x03, 0xC4, 0x8C, 0xB9, 0xEA, 0xC1, 0x8A, 0x26, 0x6C, 0xF5, 0x21, 0x7E, 0xAF, 0xA4, 0x18, 0xCF, 0xC9, 0xCC, 0x38, 0x19, 0xAA, 0x67, 0x52, 0x0C, 0x32, 0xBA, 0xFD};
  9.  
  10. int read_2(unsigned char* data, int offset)
  11. {
  12. int x = 0;
  13. x = (data[offset+1] << 8) | data[offset];
  14.  
  15. return x;
  16. }
  17.  
  18. int read_4(unsigned char* data, int offset)
  19. {
  20. int x = 0;
  21. x = (data[offset+3] << 24) | (data[offset+2] << 16) | (data[offset+1] << 8) | data[offset];
  22.  
  23. return x;
  24. }
  25.  
  26. void AES(unsigned char* data, int data_index, int size, const unsigned char* KEY, int IV_index, bool encrypt)
  27. {
  28. unsigned char IVs[8] = {0x49, 0xD9, 0xC0, 0x62, 0x72, 0x83, 0x15, 0x9B};
  29. for (int i = 0; i < 8; i++)
  30. {
  31. IVs[i] ^= data[IV_index+i];
  32. cout<<hex<<int(IVs[i])<<" ";
  33. }
  34.  
  35. //Do AES using key and IVs
  36.  
  37. }
  38.  
  39. void func_26()
  40. {
  41.  
  42. }
  43.  
  44. void decompress();
  45.  
  46. int main()
  47. {
  48. ifstream fin("tmptest.mp4", ios::ate | ios::binary);
  49. fin>>noskipws;
  50. fin.seekg(0, fin.end);
  51. int fsize = fin.tellg(), ctr = 0, log_modifier = 3, roundedLog;
  52. bool should_ceil = 1; //UNKNOWN YET
  53. fin.seekg(0, fin.beg);
  54. unsigned char* data = new unsigned char[fsize];
  55. while(fin>>data[ctr++]);
  56. //UNKNOWN FUNC LODWORD(v13) = (*(int (__cdecl **)(_DWORD, int *))(*(_DWORD *)*stringFileSize + 8))(*stringFileSize, &magic);
  57. if (strcmp((char*)(data), "BGAD") != 1)
  58. {
  59. cout<<"Not a BGAD file";
  60. return -1;
  61. }
  62.  
  63. if (should_ceil)
  64. {
  65. log_modifier = 4;
  66. }
  67. int compressed_data_size = read_4(data, 16);
  68. unsigned char* decrypted_data = new unsigned char[compressed_data_size];
  69. roundedLog = (compressed_data_size + log_modifier) & 0xFFFFFFFC;
  70. int afterNamePointer = 0x18 + read_2(data, 10);
  71. int IV_index;
  72. int seed = read_2(data, 10);
  73. if (afterNamePointer)
  74. {
  75. //UNKOWN FUNC (*(void (__cdecl **)(_DWORD))(*(_DWORD *)*stringFileSize + 16))(*stringFileSize);
  76. //LODWORD(nameCheck) = (*(int (__cdecl **)(_DWORD, _DWORD *))(*(_DWORD *)*stringFileSize + 8))( *stringFileSize, afterNamePointer);
  77. if (read_2(data, 6) == 4)
  78. {
  79. compressed_data_size -= 8;
  80. IV_index = afterNamePointer + compressed_data_size;
  81. }
  82. switch(read_2(data, 12))
  83. {
  84. case 0:
  85. break;
  86. case 1:
  87. for (int i = 0; i < compressed_data_size; i++)
  88. {
  89. seed = 0x19660D * seed * 0x3C6EF35F;
  90. data[i+afterNamePointer] ^= seed;
  91. }
  92. break;
  93. case 2:
  94. if ((unsigned int)(compressed_data_size + 3) >> 2)
  95. {
  96. for (int i = 0; i < (unsigned int)(compressed_data_size + 3) >> 2; i++)
  97. {
  98. seed = 0x19660D * seed * 0x3C6EF35F;
  99. data[i+afterNamePointer] ^= seed;
  100. }
  101. }
  102. break;
  103. case 3:
  104. AES(data, afterNamePointer, compressed_data_size, AES_KEY, IV_index, 0);
  105. break;
  106. default:
  107. cout<<"Unknown Data Type.";
  108. return -1;
  109. }
  110. if ((unsigned int)read_2(data, 14) - 1 < 2)
  111. {
  112. decompress(); //Never Used
  113. }
  114. }
  115.  
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement