All pastes #1816340 Raw Edit

LoveMHz

public cpp v1 · immutable
#1816340 ·published 2010-03-01 01:29 UTC
rendered paste body
// SCOR.cpp : Defines the entry point for the console application.//#include "stdafx.h"#ifndef CRYPTOPP_DLL_ONLY#define CRYPTOPP_DEFAULT_NO_DLL#endif#include "dll.h"#include <string>#include <windows.h>#include <fstream>#include <iostream>typedef struct SCO_Header {     int Identifier;    int Code_Size;    int Global_Var_Count;    int Public_Var_Count;    int Script_Flags;    int Signature;} sco_header;using namespace std; USING_NAMESPACE(CryptoPP)int DecryptSCO(char* Input){	byte GTAKey[32] = {0x1A, 0xB5, 0x6F, 0xED, 0x7E, 0xC3, 0xFF, 0x01, 0x22, 0x7B, 0x69, 0x15, 0x33, 0x97, 0x5D, 0xCE, 0x47, 0xD7, 0x69, 0x65, 0x3F, 0xF7, 0x75, 0x42, 0x6A, 0x96, 0xCD,0x6D, 0x53,0x07, 0x56, 0x5D};	SCO_Header Header;	char* SCO_Data = NULL;	char* SCO_Global = NULL;	char* SCO_Public = NULL;	int FileSize;	// Load SCO File	ifstream File(Input, ios::in | ios::binary);    File.exceptions(ifstream::eofbit | ifstream::failbit | ifstream::badbit);    if(!File) {        printf("Cannot open input file.\n");        return 0;    }     	// Load the Header Data and get the file size.    try {		File.seekg(0, ios::end);		FileSize = File.tellg();		File.seekg(0, ios::beg);        File.read((char *)&Header, sizeof(Header));    } catch (ifstream::failure e) {		printf("Error reading file. \n");        return 0;    }		// Setup sizes for Global and Public Segment Sizes	int Code_Segment_Size = Header.Code_Size & ~0x0F;	int Global_Segment_Size = (Header.Global_Var_Count * 4) & ~0x0F;	int Public_Segment_Size = (Header.Public_Var_Count * 4) & ~0x0F;	// Set sizes to hold the data	SCO_Data = new char[Header.Code_Size];	SCO_Global = new char[Header.Global_Var_Count * 4];	SCO_Public = new char[Header.Public_Var_Count * 4];	// Read the segments into each array	File.read(SCO_Data, Header.Code_Size);	if(Global_Segment_Size > 0)		File.read(SCO_Global, (Header.Global_Var_Count * 4));	if(Public_Segment_Size > 0)		File.read(SCO_Public, (Header.Public_Var_Count * 4));		// Decrpyt each segment    if(Code_Segment_Size > 0) {        for (int i = 0; i < 16; i++) {			ECB_Mode<AES>::Decryption ecbDecryption(GTAKey, 32);			ecbDecryption.ProcessData((byte*)SCO_Data, (byte*)SCO_Data, Code_Segment_Size);         }    }    if(Global_Segment_Size > 0) {        for (int i = 0; i < 16; i++) {			ECB_Mode<AES>::Decryption ecbDecryption(GTAKey, 32);			ecbDecryption.ProcessData((byte*)SCO_Global, (byte*)SCO_Global, Global_Segment_Size);         }    }    if(Public_Segment_Size > 0) {        for (int i = 0; i < 16; i++) {			ECB_Mode<AES>::Decryption ecbDecryption(GTAKey, 32);			ecbDecryption.ProcessData((byte*)SCO_Public, (byte*)SCO_Public, Public_Segment_Size);         }    }	// Write everything to a new file	ofstream OutFile("out.sco", ios_base::binary);	if(OutFile.is_open()) {		// Write File Header to OutFile		Header.Identifier = 0xD524353;		OutFile.write(reinterpret_cast<const char*>(&Header), sizeof(Header));		// Write Unencrypted data to OutFile		OutFile.write(SCO_Data, Header.Code_Size);		// Write Global and Public data to OutFile		OutFile.write((char *)SCO_Global, Header.Global_Var_Count * 4);		OutFile.write((char *)SCO_Public, Header.Public_Var_Count * 4);		OutFile.close();	} else {		printf("Unable to open output file for writing.");		return 0;	}	// Clear out the segment arrays	delete [] SCO_Data;	delete [] SCO_Global;	delete [] SCO_Public;	printf("Identifier: 0x%08X \nCode Size: %d \nGlobal Varible Count: %d \nPublic Varible Count: %d \nScript Flags: 0x%08X \nSignature: 0x%08X \nCode_Segment_Size: %d\n",           Header.Identifier, Header.Code_Size, Header.Global_Var_Count, Header.Public_Var_Count, Header.Script_Flags, Header.Signature, Code_Segment_Size);	system("PAUSE");	return 1;}int _tmain(int argc, _TCHAR* argv[]){	DecryptSCO((char *)argv[1]);	return 0;}