diff --git a/ErrorResolver.c b/ErrorResolver.c new file mode 100644 index 0000000..992c35d --- /dev/null +++ b/ErrorResolver.c @@ -0,0 +1,283 @@ +//ErrorResolver.c - Resolves PSVita Error Codes! + +#include +#include + +unsigned int facility_group_num; +unsigned int error_table_num; + +int read_error_table(const char *path, void *buf) +{ + + + FILE *f = fopen(path, "rb"); + if (f) + { + if (fread(buf, 1, 8, f) == 8) + { + facility_group_num = *((short *)buf + 2); + if (facility_group_num <= 0x21) + { + if (fread(*((int *)buf + 2), 1, 8 * facility_group_num, f) == 8 * facility_group_num + && fread((char *)buf + 12, 1, 4, f) == 4) + { + error_table_num = *((short *)buf + 7); + if (error_table_num <= 0x4e21) + { + if (fread(*((int *)buf + 4), 1, 4 * error_table_num, f) == 4 * error_table_num) + { + fclose(f); + return 0; + } + } + else + { + fprintf(stderr, "[SceError] error_table_num = %d\n", error_table_num); + } + } + } + else + { + fprintf(stderr, "[SceError] facility_group_num = %d\n", facility_group_num); + } + } + fclose(f); + } + else + { + printf("Failed to open error_table.bin\n"); + } + *(int *)buf = 0; + *((int *)buf + 1) = 0; + *((int *)buf + 2) = 0; + *((int *)buf + 3) = 0; + *((int *)buf + 4) = 0; + *((int *)buf + 5) = 0; + return -1; +} + +int error_code_to_string(int error_table, char *output_buffer, unsigned int Error_Code) +{ + unsigned int *error_list; // r5 + int i; // r4 + int ii; // r6 + int Shifted; // r3 + char *facility; // r3 + int *error_table_32; // r2 + int error_table_16; // r6 + int error_init; // r4 + int Devider; // r2 + int Remainder; // r0 + int lastBit; // r7 + + if (!output_buffer) + return 0; + error_list = *(unsigned int **)(error_table + 0x10); + if (!*(short *)(error_table + 0xE)) + { + NOT_IN_DB: + snprintf(output_buffer, 0x10, "E-%08x", Error_Code); + return 0; + } + if (*error_list != Error_Code) + { + i = 0; + while (++i < *(unsigned __int16 *)(error_table + 0xE)) + { + if (error_list[1] == Error_Code) + { + if (*(unsigned __int16 *)(error_table + 6) >= i) + goto CALC_FACILITY; + snprintf(output_buffer, 0x10, "*-%08x"); + return 0; + } + ++error_list; + } + goto NOT_IN_DB; + } + i = 0; +CALC_FACILITY: + Shifted = (Error_Code >> 16) & 0xFFF; + if ((unsigned int)(Shifted - 0x200) > 0xFF) + { + if (*(short *)(error_table + 4)) + { + error_table_32 = (int *)(*(int *)(error_table + 8) + 8); + ii = 0; + while (1) + { + error_table_16 = *((unsigned __int16 *)error_table_32 - 4); + ++ii; + if (Shifted >= error_table_16 && Shifted < error_table_16 + *((unsigned __int16 *)error_table_32 - 3)) + break; + error_table_32 += 2; + if (ii >= *(unsigned __int16 *)(error_table + 4)) + goto Facility_Found; + } + facility = (char *)(error_table_32 - 1); + } + else + { + Facility_Found: + facility = (char *)error_table; + } + } + else + { + facility = "NS"; + } + error_init = *(unsigned __int16 *)(error_table + 12) + i; + if (error_init) + { + Devider = error_init; + ii = 0; + do + { + Remainder = Devider % 10; + Devider /= 10; + ii += Remainder; + } while (Devider); + lastBit = ii % 10; + } + else + { + lastBit = 0; + } + snprintf(output_buffer, 16, "%s-%d-%1d", facility, error_init, lastBit); + return 0; +} + + + +int main(int argc, char *argv[]) +{ + char error_code[0x10]; + int hex_error; + + if (argc == 1) + { + printf("ErrorResolver by Silica (with help from Princess Of Sleeping)\n"); + printf("Reading error_table.bin\n"); + } + + int *error_table = calloc(1, 1024 * 1024); + error_table[2] = calloc(1, 1024 * 1024); + error_table[4] = calloc(1, 1024 * 1024); + + int res = read_error_table("error_table.bin", error_table); + if (res != 0) + { + return res; + } + + if (argc == 1) + { + + printf("%d facility groups found in error_table.bin\n", facility_group_num); + printf("%d errors found in error_table.bin\n", error_table_num); + printf("Done!\n"); + + printf("\nArguments: \n"); + printf("\tModes:\n\t-d Decode hex to shortcode\n"); + printf("\t-b Bruteforce hex from shortcode\n"); + printf("No arguments = interactive\n\n\n"); + + + printf("--Interactive Mode!\n"); + printf("Resolve hex to shortcode = 1\n"); + printf("Bruteforce shortcode to hex = 2\n"); + printf("\nEnter choice: "); + int choice = 0; + scanf("%i", &choice); + if (choice == 1) + { + while (1) + { + printf("Enter Hex Code: "); + scanf("%x", &hex_error); + + error_code_to_string(error_table, error_code, hex_error); + printf("Short Code: %s\n", error_code); + } + + } + else if(choice == 2) + { + while (1) + { + int found = 0; + char target_error_code[0x10]; + + printf("Enter Short Code: "); + scanf("%16s",&target_error_code); + + unsigned int* possible_options = (unsigned int*)error_table[4]; + for (int i = 0; i < error_table_num; i++) + { + hex_error = possible_options[i]; + error_code_to_string(error_table, error_code, hex_error); + + if (strcmp(error_code, target_error_code) == 0) + { + printf("Hex Code: %x\n", hex_error); + found = 1; + break; + } + } + if (found == 0) + { + printf("%s Was not found in error_table.bin (perhaps its E- facility?)\n",target_error_code); + } + + } + + } + + + } + else if (argc == 3) + { + char *mode = argv[1]; + if (strcmp(mode, "-d") == 0) + { + sscanf(argv[2],"%x", &hex_error); + error_code_to_string(error_table, error_code, hex_error); + printf("%s\n", error_code); + } + else if (strcmp(mode, "-b") == 0) + { + char target_error_code[0x10]; + strncpy(target_error_code, argv[2], 0x10); + + unsigned int* possible_options = (unsigned int*)error_table[4]; + for (int i = 0; i < error_table_num; i++) + { + hex_error = possible_options[i]; + error_code_to_string(error_table, error_code, hex_error); + + if (strcmp(error_code, target_error_code) == 0) + { + printf("%x\n", hex_error); + return 0; + } + } + printf("%s Was not found in error_table.bin (perhaps its E- facility?)\n", target_error_code); + return -1; + + + } + else + { + printf("Invalid arguments!\n"); + } + } + else + { + printf("Invalid arguments!\n"); + } + + + + return 0; +} + diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..02504a2 --- /dev/null +++ b/Makefile @@ -0,0 +1,27 @@ +TARGET = ErrorResolver + +OBJS = ErrorResolver.o + +LIBS = + +CFLAGS = -s -static -Wall -Wextra -std=c99 +all: $(TARGET) + +$(TARGET): $(OBJS) + @echo "Creating binary $(TARGET)" + $(CXX) $(OBJS) -o $@ $(LIBS) -static -static-libgcc + +%.o: %.cpp + @echo "Compiling $^" + $(CXX) $(CFLAGS) -c $^ -o $@ -static -static-libgcc + +clean: + @echo "Removing all the .o files" + @$(RM) $(OBJS) + +mrproper: clean + @echo "Removing binary" + @$(RM) $(TARGET) + +install: all + @cp $(TARGET) ../bin