litianp
哥,你是我的神。 [em_5] 还有 srt 字幕文件可以处理一下吗? 貌似方法不一样的。
// YoudaDecrypt.cpp
//
#pragma warning(disable:4996)
#include <stdio.h>
#include<fstream>
const char YoudaFSstr[] = "YoudaFS";
const char UnityFSstr[] = "UnityFS";
const char YoudaSRTstr[] = "\x04\x41";
using namespace std;
int verifyYouda(FILE* file) {
fseek(file, 0, SEEK_SET);
char buffer[10] = "";
fread(buffer, 7, 1, file);
if (strcmp(buffer, YoudaFSstr) == 0)return 1;
if (strcmp(buffer, UnityFSstr) == 0)return 2;
memset(buffer, 0, 10);
fseek(file, 0, SEEK_SET);
fread(buffer, 2, 1, file);
if (strcmp(buffer, YoudaSRTstr) == 0)return 3;
return 0;
}
void decryptYoudaFS(FILE* file) {
fseek(file, 0, SEEK_SET);
fwrite(UnityFSstr, 7, 1, file);
char buffer[10] = "";
for (int i = 7; i < 37; i++) {
fseek(file, i, SEEK_SET);
fread(buffer, 1, 1, file);
fseek(file, i, SEEK_SET);
buffer[0] ^= 9;
fwrite(buffer, 1, 1, file);
}
}
void encryptYoudaFS(FILE* file) {
fseek(file, 0, SEEK_SET);
fwrite(YoudaFSstr, 7, 1, file);
char buffer[10] = "";
for (int i = 7; i < 37; i++) {
fseek(file, i, SEEK_SET);
fread(buffer, 1, 1, file);
fseek(file, i, SEEK_SET);
buffer[0] ^= 9;
fwrite(buffer, 1, 1, file);
}
}
void writebyte(FILE* file, char byte, int location) {
int origpos = ftell(file);
fseek(file, location, SEEK_SET);
fwrite(&byte, 1, 1, file);
fseek(file, origpos, SEEK_SET);
}
char readbyte(FILE* file, int location) {
int origpos = ftell(file);
char buffer[1] = "";
fseek(file, location, SEEK_SET);
fread(&buffer, 1, 1, file);
fseek(file, origpos, SEEK_SET);
return buffer[0];
}
void decryptYoudaSRT(FILE* file) {
fseek(file, 0, SEEK_END);
unsigned long long filesize = ftell(file);
writebyte(file, 0xA, 0);
writebyte(file, 0xA, 1);
fseek(file, 2, SEEK_SET);
int pos = 2;
while (pos < filesize) {
writebyte(file, readbyte(file, pos) ^ 9, pos);
writebyte(file, readbyte(file, pos++) , pos-2);
}
writebyte(file, 0xA, filesize);
writebyte(file, 0xA, filesize - 2);
writebyte(file, 0xA, filesize - 1);
}
int main(int argc,char** argv)
{
const char* filename = argv[1];
FILE* file = fopen(filename, "rb+");
int isYoudafile = verifyYouda(file);
if (!isYoudafile) {
printf("The file \"%s\" is not Youda encrypted file or UnityFS file\n",filename);
fclose(file);
return -1;
}
else if (isYoudafile == 1) {
decryptYoudaFS(file);
printf("Youda encrypted file \"%s\" decrypted\n", filename);
}
else if (isYoudafile == 2) {
encryptYoudaFS(file);
printf("UnityFS file \"%s\" encrypted\n", filename);
}
else if (isYoudafile == 3) {
decryptYoudaSRT(file);
printf("Youda encrypted SRT file \"%s\" decrypted\n", filename);
}
fclose(file);
}