コード例 #1
0
ファイル: main.cpp プロジェクト: lavanoid/CIAngel
Result ProcessCIA(std::string dir, std::string titleName)
{
    FILE *tik = fopen((dir + "/ticket").c_str(), "rb");
    if (!tik) 
    {
        return -1;
    }
    TIK_CONTEXT tik_context = process_tik(tik);

    FILE *tmd = fopen((dir + "/tmd").c_str(),"rb");
    if (!tmd) 
    {
        fclose(tik);
        return -1;
    }
    TMD_CONTEXT tmd_context = process_tmd(tmd);

    if(tik_context.result != 0 || tmd_context.result != 0){
        printf("[!] Input files could not be processed successfully\n");
        free(tmd_context.content_struct);
        fclose(tik);
        fclose(tmd);
        return -1;
    }

    int result;
    if (config.GetMode() == CConfig::Mode::INSTALL_CIA)
    {
        result = install_cia(tmd_context, tik_context);
    }
    else
    {
        FILE *output = fopen((dir + "/" + titleName + ".cia").c_str(),"wb");
        if (!output) 
        {
            result = -2;
        }
        else
        {
            result = generate_cia(tmd_context, tik_context, output);
            if(result != 0)
            {
                remove((dir + "/" + titleName + ".cia").c_str());
            }
        }
    }

    // free allocated memory/handles
    free(tmd_context.content_struct);
    fclose(tik);
    fclose(tmd);

    // Clean up temp files
    remove((dir + "/ticket").c_str());
    remove((dir + "/tmd").c_str());
    return result;
}
コード例 #2
0
ファイル: main.c プロジェクト: Smeat/FunKeyCIA
int main(int argc, char *argv[])
{
	app_title();
	
	//Argument Checks
	if(argc < 3){
		printf("[!] Not Enough Arguments\n");
		help(argv[0]);
		return 1;
	}
	if(argc > 3){
		printf("[!] Too Many Arguments\n");
		help(argv[0]);
		return 1;
	}
	
	//Storing Current Working Directory
	char cwd[1024];
	if (getcwdir(cwd, sizeof(cwd)) == NULL){
		printf("[!] Could not store Current Working Directory\n");
		return IO_FAIL;
	}
	
	//Changing to CDN Content Directory
	chdir(argv[1]);
	
	//Processing TIK
	FILE *tik = fopen("cetk","rb");
	if(tik == NULL){
		printf("[!] Could not open 'tik'\n");
		return IO_FAIL;
	}
	TIK_CONTEXT tik_context = process_tik(tik);
	
	//Processing TMD
	FILE *tmd = fopen("tmd","rb");
	if(tmd == NULL){
		printf("[!] Could not open 'tmd'\n");
		return IO_FAIL;
	}
	TMD_CONTEXT tmd_context = process_tmd(tmd);
	
	//Error Checking
	if(tik_context.result != 0 || tmd_context.result != 0){
		printf("[!] Input files could not be processed successfully\n");
		free(tmd_context.content_struct);
		free(tmd_context.content);
		fclose(tik);
		fclose(tmd);
		return FILE_PROCESS_FAIL;
	}
	//TID comparison check
	if(check_tid(tik_context.title_id,tmd_context.title_id) != TRUE){
		printf("[!] Caution, Ticket and TMD Title IDs do not match\n");
		printf("[!] CETK Title ID:  "); u8_hex_print_be(tik_context.title_id,0x8); printf("\n");
		printf("[!] TMD Title ID:   "); u8_hex_print_be(tmd_context.title_id,0x8); printf("\n");
	}
	//Title Version comparison
	if(tik_context.title_version != tmd_context.title_version){
		printf("[!] Caution, Ticket and TMD Title Versions do not match\n");
		printf("[!] CETK Title Ver: %d\n",tik_context.title_version);
		printf("[!] TMD Title Ver:  %d\n",tmd_context.title_version);
	}
	
	//Returning to Original Working Directory
	chdir(cwd);
	
	//Opening Output file
	FILE *output = fopen(argv[2],"wb");
	if(output == NULL){
		printf("[!] Could not create '%s'\n",argv[2]);
		return IO_FAIL;
	}
	
	int result = generate_cia(tmd_context,tik_context,output);
	if(result != 0){
		printf("[!] Failed to Generate %s\n",argv[2]);
		remove(argv[2]);
	}
	else
		printf("[*] %s Generated Sucessfully\n",argv[2]);
	
	return 0;
}