Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<fstream>
- #include<cstring>
- using namespace std;
- const unsigned char MAGIC[4] = {0x42, 0x47, 0x41, 0x44};
- 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};
- 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};
- int read_2(unsigned char* data, int offset)
- {
- int x = 0;
- x = (data[offset+1] << 8) | data[offset];
- return x;
- }
- int read_4(unsigned char* data, int offset)
- {
- int x = 0;
- x = (data[offset+3] << 24) | (data[offset+2] << 16) | (data[offset+1] << 8) | data[offset];
- return x;
- }
- void AES(unsigned char* data, int data_index, int size, const unsigned char* KEY, int IV_index, bool encrypt)
- {
- unsigned char IVs[8] = {0x49, 0xD9, 0xC0, 0x62, 0x72, 0x83, 0x15, 0x9B};
- for (int i = 0; i < 8; i++)
- {
- IVs[i] ^= data[IV_index+i];
- cout<<hex<<int(IVs[i])<<" ";
- }
- //Do AES using key and IVs
- }
- void func_26()
- {
- }
- void decompress();
- int main()
- {
- ifstream fin("tmptest.mp4", ios::ate | ios::binary);
- fin>>noskipws;
- fin.seekg(0, fin.end);
- int fsize = fin.tellg(), ctr = 0, log_modifier = 3, roundedLog;
- bool should_ceil = 1; //UNKNOWN YET
- fin.seekg(0, fin.beg);
- unsigned char* data = new unsigned char[fsize];
- while(fin>>data[ctr++]);
- //UNKNOWN FUNC LODWORD(v13) = (*(int (__cdecl **)(_DWORD, int *))(*(_DWORD *)*stringFileSize + 8))(*stringFileSize, &magic);
- if (strcmp((char*)(data), "BGAD") != 1)
- {
- cout<<"Not a BGAD file";
- return -1;
- }
- if (should_ceil)
- {
- log_modifier = 4;
- }
- int compressed_data_size = read_4(data, 16);
- unsigned char* decrypted_data = new unsigned char[compressed_data_size];
- roundedLog = (compressed_data_size + log_modifier) & 0xFFFFFFFC;
- int afterNamePointer = 0x18 + read_2(data, 10);
- int IV_index;
- int seed = read_2(data, 10);
- if (afterNamePointer)
- {
- //UNKOWN FUNC (*(void (__cdecl **)(_DWORD))(*(_DWORD *)*stringFileSize + 16))(*stringFileSize);
- //LODWORD(nameCheck) = (*(int (__cdecl **)(_DWORD, _DWORD *))(*(_DWORD *)*stringFileSize + 8))( *stringFileSize, afterNamePointer);
- if (read_2(data, 6) == 4)
- {
- compressed_data_size -= 8;
- IV_index = afterNamePointer + compressed_data_size;
- }
- switch(read_2(data, 12))
- {
- case 0:
- break;
- case 1:
- for (int i = 0; i < compressed_data_size; i++)
- {
- seed = 0x19660D * seed * 0x3C6EF35F;
- data[i+afterNamePointer] ^= seed;
- }
- break;
- case 2:
- if ((unsigned int)(compressed_data_size + 3) >> 2)
- {
- for (int i = 0; i < (unsigned int)(compressed_data_size + 3) >> 2; i++)
- {
- seed = 0x19660D * seed * 0x3C6EF35F;
- data[i+afterNamePointer] ^= seed;
- }
- }
- break;
- case 3:
- AES(data, afterNamePointer, compressed_data_size, AES_KEY, IV_index, 0);
- break;
- default:
- cout<<"Unknown Data Type.";
- return -1;
- }
- if ((unsigned int)read_2(data, 14) - 1 < 2)
- {
- decompress(); //Never Used
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement