dsi/exploits/footercrypt/main.c
2016-10-29 00:13:54 -04:00

126 lines
2.1 KiB
C

#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include "dsi.h"
//modified version of neimod's taddy app.
void save(const char* path, const unsigned char* buffer, unsigned int size)
{
FILE* f = fopen(path, "wb");
if (f)
{
fwrite(buffer, 1, size, f);
fclose(f);
}
}
int main(int argc, char* argv[])
{
FILE* f = 0;
int result = -1;
dsi_es_context ctx;
unsigned char metablock[0x20];
unsigned char footer[0x440];
unsigned char key[16];
int reencrypt = 0;
fprintf(stdout, "footercrypt, modified version of neimod's taddy app.\n");
if (argc < 5)
{
fprintf(stderr, "Usage: <in.bin> <key.bin> <out.bin> <options>\n");
fprintf(stderr, "Options:\n--crypt=<en/de> Decrypt when --crypt=de is used, encrypt when --crypt=en.\n");
return result;
}
if(strcmp(argv[4], "--crypt=en")==0)
{
reencrypt = 1;
}
else if(strcmp(argv[4], "--crypt=de")==0)
{
reencrypt = 0;
}
else
{
fprintf(stderr, "Unknown option %s\n", argv[3]);
goto clean;
}
// Read key from file
f = fopen(argv[2], "rb");
if (f == 0)
{
fprintf(stderr, "Could not open key file\n");
goto clean;
}
if (16 != fread(key, 1, 16, f))
{
fprintf(stderr, "Error reading key\n");
goto clean;
}
dsi_es_init(&ctx, key);
// Read and decrypt header
f = fopen(argv[1], "rb+");
if (f == 0)
goto clean;
result = 0;
fseek(f, 0x0, SEEK_SET);
if (0x440 != fread(footer, 1, 0x440, f))
{
fprintf(stderr, "Error reading footer.\n");
goto clean;
}
if(!reencrypt)
{
if (0x20 != fread(metablock, 1, 0x20, f))
{
fprintf(stderr, "Error reading footer metablock.\n");
goto clean;
}
}
if (reencrypt)
{
dsi_es_encrypt(&ctx, footer, metablock, sizeof(footer));
}
else
{
if (dsi_es_decrypt(&ctx, footer, metablock, sizeof(footer)) < 0)
{
fprintf(stderr, "Error decrypting footer.\n");
goto clean;
}
save(argv[3], footer, sizeof(footer));
}
if (reencrypt)
{
fclose(f);
f = fopen(argv[3], "wb");
fseek(f, 0x0, SEEK_SET);
fwrite(footer, 1, sizeof(footer), f);
fwrite(metablock, 1, sizeof(metablock), f);
}
fprintf(stdout, "Done - Have a nice day.\n");
clean:
if (f)
fclose(f);
return result;
}