コード例 #1
0
ErrorStack SequentialMetadataSerializer::load(tinyxml2::XMLElement* element) {
  CHECK_ERROR(load_base(element));
  return kRetOk;
}
コード例 #2
0
ファイル: fake_np.c プロジェクト: ErikPshat/kirk_engine
int main(int argc, char *argv[])
{
	NPBASE *np_base;
	MAC_KEY mkey;
	CIPHER_KEY ckey;
	FILE *iso_fp, *pbp_fp;
	char *npb_name, *iso_name, *pbp_name;
	int i, ap, do_comp, do_crypt, do_save_base, builtin_base;
	int total_block, block_size;
	int iso_size, iso_offset, iso_block;
	int table_offset, table_size;
	u8 *iso_buf, *lzrc_buf, *table_buf;

	ap = 1;
	npb_name = NULL;
	iso_name = NULL;
	pbp_name = NULL;
	do_comp = 0;
	do_crypt = 1;
	do_save_base = 0;
	builtin_base = 1;
	np_base = NULL;

	// parameter process
	while(ap<argc){
		if(argv[ap][0]=='-'){
			if(argv[ap][1]=='b'){
				if(ap+1==argc)
					goto _help;
				npb_name = argv[ap+1];
				builtin_base = 0;
				ap += 1;
			}else if(argv[ap][1]=='c'){
				do_comp = 1;
			}else if(argv[ap][1]=='w'){
				do_save_base = 1;
			}else if(argv[ap][1]=='e'){
				do_crypt = 1;
			}else{
				printf(" unkonw param: %s\n", argv[ap]);
				goto _help;
			}
		}else{
			if(iso_name==NULL){
				iso_name = argv[ap];
			}else if(pbp_name==NULL){
				pbp_name = argv[ap];
			}
		}

		ap += 1;
	}

	if(iso_name==NULL)
		iso_name = "NP.ISO";
	if(pbp_name==NULL)
		pbp_name = "EBOOT.PBP";

	if(builtin_base==0){
		np_base = load_base(npb_name);
		if(np_base==NULL){
			printf("Load base %s faield!\n", npb_name);
			goto _help;
		}
		show_npinfo(np_base);
		if(do_save_base==1){
			save_base(np_base);
		}
	}

	iso_fp = open_file(iso_name, &iso_size);
	if(iso_fp==NULL){
		printf("Open file %s faield!\n", iso_name);
		goto _help;
	}

	if(builtin_base==1){
		np_base = find_base(iso_size);
		show_npinfo(np_base);
	}

	if(iso_size>np_base->max_size){
		printf("ISO is too big to fake! %d>%d\n", iso_size, np_base->max_size);
		goto _help;
	}

	// ready to fake!

	total_block = np_base->total_block;
	block_size  = np_base->block_size;
	iso_block = (iso_size+block_size-1)/block_size;

	show_isoinfo(iso_name, iso_block, iso_size);


	printf("Output: %s\n", pbp_name);
	
	// create PBP file
	pbp_fp = fopen(pbp_name, "wb");
	if(pbp_fp==NULL){
		printf("Create %s failed!\n", pbp_name);
		exit(-1);
	}


	// write pbp header and icon file
	table_offset = write_pbp_part1(np_base, pbp_fp, iso_name);

	// write empty table first.
	table_size = total_block*0x20;
	table_buf = malloc(table_size);
	memset(table_buf, 0, table_size);
	fwrite(table_buf, table_size, 1, pbp_fp);

	iso_offset = 256+table_size;

	iso_buf = malloc(block_size*2);
	lzrc_buf = malloc(block_size*2);

	printf("  write iso block ...\n");
	// process iso block
	for(i=0; i<iso_block; i++){
		u8 *tb = table_buf+i*0x20;
		u8 *wbuf;
		int wsize, lzrc_size, ratio;

		fread(iso_buf, block_size, 1, iso_fp);

		wbuf = iso_buf;
		wsize = block_size;

		if(do_comp==1){
			lzrc_size = lzrc_compress(lzrc_buf, block_size*2, iso_buf, block_size);
			memset(lzrc_buf+lzrc_size, 0, 16);
			ratio = (lzrc_size*100)/block_size;
			if(ratio<RATIO_LIMIT){
				wbuf = lzrc_buf;
				wsize = (lzrc_size+15)&~15;
			}
		}

		*(u32*)(tb+0x10) = iso_offset;
		*(u32*)(tb+0x14) = wsize;
		*(u32*)(tb+0x18) = 0;   // bit0=1: skip MAC check.
								// bit2=1: skip CIPHER encrypt
		*(u32*)(tb+0x1c) = 0;

		// encrypt block
		if(do_crypt==1){
			sceDrmBBCipherInit(&ckey, 1, 2, np_base->np_header+0xa0, np_base->key, iso_offset>>4);
			sceDrmBBCipherUpdate(&ckey, wbuf, wsize);
			sceDrmBBCipherFinal(&ckey);
		}

		// generic MAC
		sceDrmBBMacInit(&mkey, 3);
		sceDrmBBMacUpdate(&mkey, wbuf, wsize);
		sceDrmBBMacFinal(&mkey, tb, np_base->key);
		bbmac_build_final2(3, tb);

		encrypt_table(tb);

		// write iso data
		wsize = (wsize+15)&~15;
		fwrite(wbuf, wsize, 1, pbp_fp);

		// update offset
		iso_offset += wsize;
		printf("\r    %02d%%    ", i*100/iso_block);
	}