diff --git a/include/bls.h b/include/bls.h index b42d1e4..dc66cfa 100644 --- a/include/bls.h +++ b/include/bls.h @@ -1,8 +1,8 @@ -#ifndef __BLSHEADER_H__ -#define __BLSHEADER_H__ +#pragma once +#include +#include -typedef struct _bls_entry -{ +typedef struct _bls_entry { uint32_t block_offset; uint32_t size; uint8_t reserved[8]; @@ -10,8 +10,7 @@ typedef struct _bls_entry } bls_entry; -typedef struct _bls_header -{ +typedef struct _bls_header { uint32_t magic; uint32_t version; uint32_t flags; @@ -21,5 +20,3 @@ typedef struct _bls_header struct _bls_entry entry_list[0]; } bls_header; - -#endif diff --git a/include/debug.h b/include/debug.h deleted file mode 100644 index 84dbddc..0000000 --- a/include/debug.h +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef __DEBUG_H__ -#define __DEBUG_H__ - -#ifdef DEBUG_SOCKET - #define printfsocket(format, ...)\ - do {\ - char __printfsocket_buffer[512];\ - int __printfsocket_size = sprintf(__printfsocket_buffer, format, ##__VA_ARGS__);\ - sceNetSend(sock, __printfsocket_buffer, __printfsocket_size, 0);\ - } while(0) -#endif - -void notify(char* message); -uint8_t GetElapsed(uint64_t ResetInterval); - -extern int sock; -extern time_t prevtime; - -#define SSIZET_FMT "%zd" - -#endif diff --git a/include/decrypt.h b/include/decrypt.h new file mode 100644 index 0000000..160b345 --- /dev/null +++ b/include/decrypt.h @@ -0,0 +1,3 @@ +#pragma once + +void decrypt_pups(const char *InputPath, const char *OutputPath); \ No newline at end of file diff --git a/include/decryptio.h b/include/decryptio.h index 04e57c7..ccf98bb 100644 --- a/include/decryptio.h +++ b/include/decryptio.h @@ -1,26 +1,22 @@ -#ifndef __DECRYPTIO_H__ -#define __DECRYPTIO_H__ +#include -#include "ps4.h" - -typedef struct _decrypt_state -{ - char * input_path; +typedef struct _decrypt_state { + char *input_path; ssize_t input_base_offset; int input_file; - char * output_path; + char *output_path; ssize_t output_base_offset; int output_file; int device_fd; - char * entryname; + char *entryname; int entryid; int totalentries; int pup_type; - char * notifystr; + char *notifystr; } decrypt_state; @@ -28,7 +24,5 @@ decrypt_state; #define DIO_RESET -1 #define DIO_BASEOFFSET -2 -ssize_t readbytes(const decrypt_state* state, size_t offset, size_t bytes, void* buffer, size_t buffersize); -ssize_t writebytes(const decrypt_state* state, size_t offset, size_t bytes, void* buffer, size_t buffersize); - -#endif +ssize_t readbytes(const decrypt_state *state, size_t offset, size_t bytes, void *buffer, size_t buffersize); +ssize_t writebytes(const decrypt_state *state, size_t offset, size_t bytes, void *buffer, size_t buffersize); diff --git a/include/defines.h b/include/defines.h index 4dd005a..399bccf 100644 --- a/include/defines.h +++ b/include/defines.h @@ -1,11 +1,4 @@ -#ifndef __DEFINES_H__ -#define __DEFINES_H__ +#pragma once #define OUTPUTPATH "/mnt/usb0/%s.dec" -#define INPUTPATH "/mnt/usb0/safe.PS4UPDATE.PUP" - -#define DEBUG_SOCKET -#define DEBUG_ADDR IP(192,168,1,100); -#define DEBUG_PORT 9023 - -#endif \ No newline at end of file +#define INPUTPATH "/mnt/usb0/safe.PS4UPDATE.PUP" \ No newline at end of file diff --git a/include/encryptsrv.h b/include/encryptsrv.h index 211ce9e..b559fa1 100644 --- a/include/encryptsrv.h +++ b/include/encryptsrv.h @@ -1,15 +1,12 @@ -#ifndef __ENCRYPTSERVICE_H__ -#define __ENCRYPTSERVICE_H__ +#pragma once -int encsrv_verify_blsheader(int fd, void* buffer, size_t length, int type); +int encsrv_verify_blsheader(int fd, void *buffer, uint64_t length, uint64_t unknown); -int encsrv_decrypt_header(int fd, void* buffer, size_t length, int type); +int encsrv_decrypt_header(int fd, void *buffer, size_t length, int type); -int encsrv_verify_segment(int fd, uint16_t index, void* buffer, size_t length, int additional); +int encsrv_verify_segment(int fd, uint16_t index, void *buffer, size_t length, int additional); -int encsrv_decrypt_segment(int fd, uint16_t index, void* buffer, size_t length); +int encsrv_decrypt_segment(int fd, uint16_t index, void *buffer, size_t length); -int encsrv_decrypt_segment_block(int fd, uint16_t entry_index, uint16_t block_index, void* block_buffer, - size_t block_length, void* table_buffer, size_t table_length); - -#endif +int encsrv_decrypt_segment_block(int fd, uint16_t entry_index, uint16_t block_index, void *block_buffer, + size_t block_length, void *table_buffer, size_t table_length); diff --git a/include/encryptsrv_args.h b/include/encryptsrv_args.h index 6860d53..4118b30 100644 --- a/include/encryptsrv_args.h +++ b/include/encryptsrv_args.h @@ -1,48 +1,41 @@ -#ifndef __ENCRYPTSERVICEARGS_H__ -#define __ENCRYPTSERVICEARGS_H__ +#pragma once +#include +#include -typedef struct _verify_blsheader_args -{ - void* buffer; //rbx (rsi) - uint64_t length; //r14 (rdx) - uint64_t unknown; //rax +typedef struct _verify_blsheader_args { + void *buffer; // rbx (rsi) + uint64_t length; // r14 (rdx) + uint64_t unknown; // rax } verify_blsheader_args; -typedef struct _decrypt_header_args -{ - void* buffer; +typedef struct _decrypt_header_args { + void *buffer; size_t length; int type; } decrypt_header_args; - -typedef struct _verify_segment_args -{ +typedef struct _verify_segment_args { uint16_t index; - void* buffer; + void *buffer; size_t length; } verify_segment_args; -typedef struct _decrypt_segment_args -{ +typedef struct _decrypt_segment_args { uint16_t index; - void* buffer; + void *buffer; size_t length; } decrypt_segment_args; -typedef struct _decrypt_segment_block_args -{ +typedef struct _decrypt_segment_block_args { uint16_t entry_index; uint16_t block_index; - void* block_buffer; + void *block_buffer; size_t block_length; - void* table_buffer; + void *table_buffer; size_t table_length; } -decrypt_segment_block_args; - -#endif +decrypt_segment_block_args; \ No newline at end of file diff --git a/include/fw_defines.h b/include/fw_defines.h deleted file mode 100644 index 9b68454..0000000 --- a/include/fw_defines.h +++ /dev/null @@ -1,232 +0,0 @@ -#ifndef FW_DEFINES_H -#define FW_DEFINES_H - -#define K300_XFAST_SYSCALL 0x0 -#define K310_XFAST_SYSCALL 0x0 -#define K311_XFAST_SYSCALL 0x0 -#define K315_XFAST_SYSCALL 0x0 -#define K350_XFAST_SYSCALL 0x003A1AD0 -#define K355_XFAST_SYSCALL 0x003A1F10 -#define K370_XFAST_SYSCALL 0x003A2000 -#define K400_XFAST_SYSCALL 0x0030EA00 -#define K401_XFAST_SYSCALL 0x0030EA00 -#define K405_XFAST_SYSCALL 0x0030EB30 -#define K406_XFAST_SYSCALL 0x0030EB40 -#define K407_XFAST_SYSCALL 0x0030EB40 -#define K450_XFAST_SYSCALL 0x003095D0 -#define K455_XFAST_SYSCALL 0x003095D0 -#define K470_XFAST_SYSCALL 0x0030B840 -#define K471_XFAST_SYSCALL 0x0030B7D0 -#define K472_XFAST_SYSCALL 0x0030B7D0 -#define K473_XFAST_SYSCALL 0x0030B7D0 -#define K474_XFAST_SYSCALL 0x0030B7D0 -#define K500_XFAST_SYSCALL 0x000001C0 -#define K501_XFAST_SYSCALL 0x000001C0 -#define K503_XFAST_SYSCALL 0x000001C0 -#define K505_XFAST_SYSCALL 0x000001C0 -#define K507_XFAST_SYSCALL 0x000001C0 -#define K550_XFAST_SYSCALL 0x000001C0 -#define K553_XFAST_SYSCALL 0x000001C0 -#define K555_XFAST_SYSCALL 0x000001C0 -#define K556_XFAST_SYSCALL 0x000001C0 -#define K600_XFAST_SYSCALL 0x000001C0 -#define K602_XFAST_SYSCALL 0x000001C0 -#define K620_XFAST_SYSCALL 0x000001C0 -#define K650_XFAST_SYSCALL 0x000001C0 -#define K651_XFAST_SYSCALL 0x000001C0 -#define K670_XFAST_SYSCALL 0x000001C0 -#define K671_XFAST_SYSCALL 0x000001C0 -#define K672_XFAST_SYSCALL 0x000001C0 -#define K700_XFAST_SYSCALL 0x000001C0 - -#define K300_PRISON_0 0x0 -#define K310_PRISON_0 0x0 -#define K311_PRISON_0 0x0 -#define K315_PRISON_0 0x0 -#define K350_PRISON_0 0x00EF5A00 -#define K355_PRISON_0 0x00EF5A00 -#define K370_PRISON_0 0x00EFEF10 -#define K400_PRISON_0 0x00F26010 -#define K401_PRISON_0 0x00F26010 -#define K405_PRISON_0 0x00F26010 -#define K406_PRISON_0 0x00F26010 -#define K407_PRISON_0 0x00F2A010 -#define K450_PRISON_0 0x010399B0 -#define K455_PRISON_0 0x010399B0 -#define K470_PRISON_0 0x01042AB0 -#define K471_PRISON_0 0x01042AB0 -#define K472_PRISON_0 0x01042AB0 -#define K473_PRISON_0 0x01042AB0 -#define K474_PRISON_0 0x01042AB0 -#define K500_PRISON_0 0x010986A0 -#define K501_PRISON_0 0x010986A0 -#define K503_PRISON_0 0x010986A0 -#define K505_PRISON_0 0x010986A0 -#define K507_PRISON_0 0x010986A0 -#define K550_PRISON_0 0x01134180 -#define K553_PRISON_0 0x01134180 -#define K555_PRISON_0 0x01139180 -#define K556_PRISON_0 0x01139180 -#define K600_PRISON_0 0x01139458 -#define K602_PRISON_0 0x01139458 -#define K620_PRISON_0 0x0113D458 -#define K650_PRISON_0 0x0113D4F8 -#define K651_PRISON_0 0x0113D4F8 -#define K670_PRISON_0 0x0113E518 -#define K671_PRISON_0 0x0113E518 -#define K672_PRISON_0 0x0113E518 -#define K700_PRISON_0 0x0113E398 - -#define K300_ROOTVNODE 0x0 -#define K310_ROOTVNODE 0x0 -#define K311_ROOTVNODE 0x0 -#define K315_ROOTVNODE 0x0 -#define K350_ROOTVNODE 0x01963000 -#define K355_ROOTVNODE 0x01963040 -#define K370_ROOTVNODE 0x0196F040 -#define K400_ROOTVNODE 0x0206D250 -#define K401_ROOTVNODE 0x0206D250 -#define K405_ROOTVNODE 0x0206D250 -#define K406_ROOTVNODE 0x0206D250 -#define K407_ROOTVNODE 0x02071250 -#define K450_ROOTVNODE 0x021AFA30 -#define K455_ROOTVNODE 0x021AFA30 -#define K470_ROOTVNODE 0x021B89E0 -#define K471_ROOTVNODE 0x021B89E0 -#define K472_ROOTVNODE 0x021B89E0 -#define K473_ROOTVNODE 0x021B89E0 -#define K474_ROOTVNODE 0x021B89E0 -#define K500_ROOTVNODE 0x022C19F0 -#define K501_ROOTVNODE 0x022C19F0 -#define K503_ROOTVNODE 0x022C1A70 -#define K505_ROOTVNODE 0x022C1A70 -#define K507_ROOTVNODE 0x022C1A70 -#define K550_ROOTVNODE 0x022EF570 -#define K553_ROOTVNODE 0x022EF570 -#define K555_ROOTVNODE 0x022F3570 -#define K556_ROOTVNODE 0x022F3570 -#define K600_ROOTVNODE 0x021BFAC0 -#define K602_ROOTVNODE 0x021BFAC0 -#define K620_ROOTVNODE 0x021C3AC0 -#define K650_ROOTVNODE 0x02300320 -#define K651_ROOTVNODE 0x02300320 -#define K670_ROOTVNODE 0x02300320 -#define K671_ROOTVNODE 0x02300320 -#define K672_ROOTVNODE 0x02300320 -#define K700_ROOTVNODE 0x022C5750 - -#define K300_PRINTF 0x0 -#define K310_PRINTF 0x0 -#define K311_PRINTF 0x0 -#define K315_PRINTF 0x0029FA50 -#define K350_PRINTF 0x001DF410 -#define K355_PRINTF 0x001DF550 -#define K370_PRINTF 0x001DF620 -#define K400_PRINTF 0x00347450 -#define K401_PRINTF 0x00347450 -#define K405_PRINTF 0x00347580 -#define K406_PRINTF 0x00347590 -#define K407_PRINTF 0x00347590 -#define K450_PRINTF 0x00017F30 -#define K455_PRINTF 0x00017F30 -#define K470_PRINTF 0x00017F30 -#define K471_PRINTF 0x00017F30 -#define K472_PRINTF 0x00017F30 -#define K473_PRINTF 0x00017F30 -#define K474_PRINTF 0x00017F30 -#define K500_PRINTF 0x00435C70 -#define K501_PRINTF 0x00435C70 -#define K503_PRINTF 0x00436000 -#define K505_PRINTF 0x00436040 -#define K507_PRINTF 0x00436040 -#define K550_PRINTF 0x0011AE10 -#define K553_PRINTF 0x0011ADE0 -#define K555_PRINTF 0x0011B150 -#define K556_PRINTF 0x0011B150 -#define K600_PRINTF 0x00307DF0 -#define K602_PRINTF 0x00307DF0 -#define K620_PRINTF 0x00307E10 -#define K650_PRINTF 0x00122ED0 -#define K651_PRINTF 0x00122ED0 -#define K670_PRINTF 0x00123280 -#define K671_PRINTF 0x00123280 -#define K672_PRINTF 0x00123280 -#define K700_PRINTF 0x000BC730 - -#define K300_COPYIN 0x0 -#define K310_COPYIN 0x0 -#define K311_COPYIN 0x0 -#define K315_COPYIN 0x00480C30 -#define K350_COPYIN 0x003B92A0 -#define K355_COPYIN 0x003B96E0 -#define K370_COPYIN 0x003B97D0 -#define K400_COPYIN 0x00286CC0 -#define K401_COPYIN 0x00286CC0 -#define K405_COPYIN 0x00286DF0 -#define K406_COPYIN 0x00286DF0 -#define K407_COPYIN 0x00286DF0 -#define K450_COPYIN 0x0014A890 -#define K455_COPYIN 0x0014A890 -#define K470_COPYIN 0x00149F20 -#define K471_COPYIN 0x00149F20 -#define K472_COPYIN 0x00149F20 -#define K473_COPYIN 0x00149F20 -#define K474_COPYIN 0x00149F20 -#define K500_COPYIN 0x001EA600 -#define K501_COPYIN 0x001EA600 -#define K503_COPYIN 0x001EA710 -#define K505_COPYIN 0x001EA710 -#define K507_COPYIN 0x001EA710 -#define K550_COPYIN 0x00405BB0 -#define K553_COPYIN 0x00405AB0 -#define K555_COPYIN 0x00405E70 -#define K556_COPYIN 0x00405E70 -#define K600_COPYIN 0x001148F0 -#define K602_COPYIN 0x001148F0 -#define K620_COPYIN 0x001148F0 -#define K650_COPYIN 0x003C13F0 -#define K651_COPYIN 0x003C13F0 -#define K670_COPYIN 0x003C17A0 -#define K671_COPYIN 0x003C17A0 -#define K672_COPYIN 0x003C17A0 -#define K700_COPYIN 0x0002F230 - -#define K300_COPYOUT 0x0 -#define K310_COPYOUT 0x0 -#define K311_COPYOUT 0x0 -#define K315_COPYOUT 0x00480BB0 -#define K350_COPYOUT 0x003B9220 -#define K355_COPYOUT 0x003B9660 -#define K370_COPYOUT 0x003B9750 -#define K400_COPYOUT 0x00286C40 -#define K401_COPYOUT 0x00286C40 -#define K405_COPYOUT 0x00286D70 -#define K406_COPYOUT 0x00286D70 -#define K407_COPYOUT 0x00286D70 -#define K450_COPYOUT 0x0014A7B0 -#define K455_COPYOUT 0x0014A7B0 -#define K470_COPYOUT 0x00149E40 -#define K471_COPYOUT 0x00149E40 -#define K472_COPYOUT 0x00149E40 -#define K473_COPYOUT 0x00149E40 -#define K474_COPYOUT 0x00149E40 -#define K500_COPYOUT 0x001EA520 -#define K501_COPYOUT 0x001EA520 -#define K503_COPYOUT 0x001EA630 -#define K505_COPYOUT 0x001EA630 -#define K507_COPYOUT 0x001EA630 -#define K550_COPYOUT 0x00405AC0 -#define K553_COPYOUT 0x004059C0 -#define K555_COPYOUT 0x00405D80 -#define K556_COPYOUT 0x00405D80 -#define K600_COPYOUT 0x00114800 -#define K602_COPYOUT 0x00114800 -#define K620_COPYOUT 0x00114800 -#define K650_COPYOUT 0x003C1300 -#define K651_COPYOUT 0x003C1300 -#define K670_COPYOUT 0x003C16B0 -#define K671_COPYOUT 0x003C16B0 -#define K672_COPYOUT 0x003C16B0 -#define K700_COPYOUT 0x0002F140 - -#endif diff --git a/include/kernel_utils.h b/include/kernel_utils.h deleted file mode 100644 index 4065cac..0000000 --- a/include/kernel_utils.h +++ /dev/null @@ -1,100 +0,0 @@ -#ifndef KERNEL_UTILS_H -#define KERNEL_UTILS_H - -#include "fw_defines.h" -#include "ps4.h" - -#define printf_notification(...) \ - do { \ - char message[256]; \ - snprintf(message, sizeof(message), ##__VA_ARGS__); \ - systemMessage(message); \ - } while (0) - -struct auditinfo_addr { - char useless[184]; -}; - -struct ucred { - uint32_t useless1; - uint32_t cr_uid; - uint32_t cr_ruid; - uint32_t useless2; - uint32_t useless3; - uint32_t cr_rgid; - uint32_t useless4; - void *useless5; - void *useless6; - void *cr_prison; - void *useless7; - uint32_t useless8; - void *useless9[2]; - void *useless10; - struct auditinfo_addr useless11; - uint32_t *cr_groups; - uint32_t useless12; -}; - -struct filedesc { - void *useless1[3]; - void *fd_rdir; - void *fd_jdir; -}; - -struct proc { - char useless[64]; - struct ucred *p_ucred; - struct filedesc *p_fd; -}; - -struct thread { - void *useless; - struct proc *td_proc; -}; - -struct kpayload_get_fw_version_info { - uint64_t uaddr; -}; - -struct kpayload_get_fw_version_args { - void *syscall_handler; - struct kpayload_get_fw_version_info *kpayload_get_fw_version_info; -}; - -struct kpayload_jailbreak_info { - uint64_t fw_version; -}; - -struct kpayload_jailbreak_args { - void *syscall_handler; - struct kpayload_jailbreak_info *kpayload_jailbreak_info; -}; - -struct kpayload_get_kbase_info { - uint64_t fw_version; - uint64_t uaddr; -}; - -struct kpayload_get_kbase_args { - void *syscall_handler; - struct kpayload_get_kbase_info *kpayload_get_kbase_info; -}; - -struct kpayload_kernel_dumper_info { - uint64_t fw_version; - uint64_t uaddr; - uint64_t kaddr; - size_t size; -}; - -struct kpayload_kernel_dumper_args { - void *syscall_handler; - struct kpayload_kernel_dumper_info *kpayload_kernel_dumper_info; -}; - -uint64_t get_fw_version(void); -int jailbreak(uint64_t fw_version); -uint64_t get_kernel_base(uint64_t fw_version); -int dump_kernel(uint64_t fw_version, uint64_t kaddr, uint64_t *dump, size_t size); - -#endif diff --git a/include/pup.h b/include/pup.h index e7f7942..49dd03e 100644 --- a/include/pup.h +++ b/include/pup.h @@ -1,5 +1,4 @@ -#ifndef __PUP_H__ -#define __PUP_H__ +#pragma once typedef struct _pup_file_header { @@ -38,5 +37,3 @@ typedef struct _pup_block_info uint32_t size; } pup_block_info; - -#endif diff --git a/include/time_utils.h b/include/time_utils.h new file mode 100644 index 0000000..10e81cb --- /dev/null +++ b/include/time_utils.h @@ -0,0 +1,5 @@ +#pragma once + +#include + +uint8_t GetElapsed(uint64_t ResetInterval); diff --git a/source/checkheaders.c b/source/checkheaders.c index d511127..5f25bea 100644 --- a/source/checkheaders.c +++ b/source/checkheaders.c @@ -1,11 +1,10 @@ -#include "ps4.h" - -#include -#define CHECK_SIZE(x, y) static_assert(sizeof(x) == y, #x) - +#include "bls.h" #include "encryptsrv_args.h" #include "pup.h" -#include "bls.h" +#include +#include + +#define CHECK_SIZE(x, y) static_assert(sizeof(x) == y, #x) //Check Bls related headers. CHECK_SIZE(bls_header, 32); diff --git a/source/decrypt.c b/source/decrypt.c index 86452fb..ef0e71e 100644 --- a/source/decrypt.c +++ b/source/decrypt.c @@ -1,11 +1,10 @@ -#include "ps4.h" -#include "pup.h" #include "bls.h" #include "decryptio.h" -#include "encryptsrv.h" #include "defines.h" -#include "debug.h" -#include "kernel_utils.h" +#include "encryptsrv.h" +#include "pup.h" +#include "time_utils.h" +#include int verify_segment(const decrypt_state* state, int index, pup_segment* segment, int additional) { @@ -16,7 +15,7 @@ int verify_segment(const decrypt_state* state, int index, pup_segment* segment, ssize_t bytesread = readbytes(state, segment->offset, segment->compressed_size, buffer, segment->compressed_size); if (bytesread != segment->compressed_size) { - printfsocket("Failed to read segment #%d for verification!\n", index); + printf_debug("Failed to read segment #%d for verification!\n", index); result = -1; goto end; } @@ -24,7 +23,7 @@ int verify_segment(const decrypt_state* state, int index, pup_segment* segment, result = encsrv_verify_segment(state->device_fd, index, buffer, segment->compressed_size, additional); if (result != 0) { - printfsocket("Failed to verify segment #%d! %d\n", index, errno); + printf_debug("Failed to verify segment #%d! %d\n", index, errno); goto end; } @@ -46,7 +45,7 @@ int verify_segments(const decrypt_state* state, pup_segment* segments, int segme pup_segment* segment = &segments[i]; if ((segment->flags & 0xF0000000) == 0xE0000000) { - printfsocket("Verifying segment #%d (%d)... [1]\n", i, segment->flags >> 20); + printf_debug("Verifying segment #%d (%d)... [1]\n", i, segment->flags >> 20); result = verify_segment(state, i, segment, 1); if (result < 0) { @@ -60,7 +59,7 @@ int verify_segments(const decrypt_state* state, pup_segment* segments, int segme pup_segment* segment = &segments[i]; if ((segment->flags & 0xF0000000) == 0xF0000000) { - printfsocket("Verifying segment #%d (%d)... [0]\n", i, segment->flags >> 20); + printf_debug("Verifying segment #%d (%d)... [0]\n", i, segment->flags >> 20); result = verify_segment(state, i, segment, 0); if (result < 0) { @@ -100,7 +99,7 @@ int decrypt_segment(const decrypt_state* state, uint16_t index, pup_segment* seg ssize_t bytesread = readbytes(state, segment->offset, encrypted_size, buffer, segment->compressed_size); if (bytesread != encrypted_size) { - printfsocket("Failed to read segment #%d!\n", index); + printf_debug("Failed to read segment #%d!\n", index); result = -1; goto end; } @@ -109,7 +108,7 @@ int decrypt_segment(const decrypt_state* state, uint16_t index, pup_segment* seg if (result != 0) { int errcode = errno; - printfsocket("Failed to decrypt segment #%d! - Error: %d (%s)\n", index, errcode, strerror(errcode)); + printf_debug("Failed to decrypt segment #%d! - Error: %d (%s)\n", index, errcode, strerror(errcode)); goto end; } @@ -121,7 +120,7 @@ int decrypt_segment(const decrypt_state* state, uint16_t index, pup_segment* seg ssize_t byteswritten = writebytes(state, segment->offset, unencrypted_size, buffer, segment->compressed_size); if (byteswritten != unencrypted_size) { - printfsocket("Failed to write segment #%d!\n", index); + printf_debug("Failed to write segment #%d!\n", index); result = -1; goto end; } @@ -149,18 +148,18 @@ int decrypt_segment_blocks(const decrypt_state * state, uint16_t index, pup_segm ssize_t bytesread = readbytes(state, table_segment->offset, table_length, table_buffer, table_length); if (bytesread != table_length) { - printfsocket(" Failed to read table for segment #%d!\n", index); + printf_debug(" Failed to read table for segment #%d!\n", index); result = -1; goto end; } - printfsocket(" Decrypting table #%d for segment #%d\n", table_index, index); + printf_debug(" Decrypting table #%d for segment #%d\n", table_index, index); result = encsrv_decrypt_segment(state->device_fd, table_index, table_buffer, table_length); if (result != 0) { int errcode = errno; - printfsocket(" Failed to decrypt table for segment #%d! Error: %d (%s)\n", index, errcode, strerror(errcode)); + printf_debug(" Failed to decrypt table for segment #%d! Error: %d (%s)\n", index, errcode, strerror(errcode)); goto end; } @@ -181,7 +180,7 @@ int decrypt_segment_blocks(const decrypt_state * state, uint16_t index, pup_segm size_t valid_table_length = block_count * (32 + sizeof(pup_block_info)); if (valid_table_length != table_length) { - printfsocket(" Strange segment #%d table: %llu vs %llu\n", + printf_debug(" Strange segment #%d table: %llu vs %llu\n", index, valid_table_length, table_length); } block_info = (pup_block_info*)&table_buffer[32 * block_count]; @@ -189,7 +188,7 @@ int decrypt_segment_blocks(const decrypt_state * state, uint16_t index, pup_segm block_buffer = memalign(0x4000, block_size); - printfsocket(" Decrypting %d blocks...\n ", block_count); + printf_debug(" Decrypting %d blocks...\n ", block_count); int Seeked = 0; GetElapsed(0); @@ -198,7 +197,7 @@ int decrypt_segment_blocks(const decrypt_state * state, uint16_t index, pup_segm int last_index = block_count - 1; for (int i = 0; i < block_count; i++) { - printfsocket(" Decrypting block %d/%d...\n", i, block_count); + printf_debug(" Decrypting block %d/%d...\n", i, block_count); if ((block_count > 50) && (i % 5 == 0) && (GetElapsed(15) == 1)) { uint32_t percentage = (uint32_t)(((float)i / (float)block_count) * 100.0f); @@ -249,7 +248,7 @@ int decrypt_segment_blocks(const decrypt_state * state, uint16_t index, pup_segm ssize_t bytesread = readbytes(state, SeekTo, read_size, block_buffer, block_size); if (bytesread != read_size) { - printfsocket(" Failed to read block %d for segment #%d! %d\n", i, index, bytesread); + printf_debug(" Failed to read block %d for segment #%d! %d\n", i, index, bytesread); goto end; } @@ -258,14 +257,14 @@ int decrypt_segment_blocks(const decrypt_state * state, uint16_t index, pup_segm if (result < 0) { int errcode = errno; - printfsocket(" Failed to decrypt block for segment #%d! Error: %d (%s)\n", index, errcode, strerror(errcode)); + printf_debug(" Failed to decrypt block for segment #%d! Error: %d (%s)\n", index, errcode, strerror(errcode)); goto end; } ssize_t byteswritten = writebytes(state, SeekTo, read_size, block_buffer, block_size); if (byteswritten != read_size) { - printfsocket(" Failed to write block %d for segment #%d!\n", i, index); + printf_debug(" Failed to write block %d for segment #%d!\n", i, index); goto end; } @@ -292,7 +291,7 @@ int find_table_segment(int index, pup_segment* segments, int segment_count, { if (((index | 0x100) & 0xF00) == 0xF00) { - printfsocket("Can't do table for segment #%d\n", index); + printf_debug("Can't do table for segment #%d\n", index); *table_index = -1; return -1; } @@ -323,13 +322,13 @@ int decrypt_pup_data(const decrypt_state * state) bytesread = readbytes(state, DIO_BASEOFFSET, sizeof(file_header), &file_header, sizeof(file_header)); if (bytesread != sizeof(file_header)) { - printfsocket("Failed to read PUP entry header!\n"); + printf_debug("Failed to read PUP entry header!\n"); goto end; } if (file_header.magic != 0x1D3D154F) { - printfsocket("PUP header magic is invalid!\n"); + printf_debug("PUP header magic is invalid!\n"); goto end; } @@ -342,25 +341,25 @@ int decrypt_pup_data(const decrypt_state * state) bytesread = readbytes(state, DIO_NOSEEK, tsize, &header_data[sizeof(file_header)], header_size); if (bytesread != tsize) { - printfsocket("Failed to read PUP entry header!\n"); + printf_debug("Failed to read PUP entry header!\n"); goto end; } if ((file_header.flags & 1) == 0) { - printfsocket("Decrypting header...\n"); + printf_debug("Decrypting header...\n"); result = encsrv_decrypt_header(state->device_fd, header_data, header_size, state->pup_type); if (result != 0) { int errcode = errno; - printfsocket("Failed to decrypt header! Error: %d (%s)\n", errcode, strerror(errcode)); + printf_debug("Failed to decrypt header! Error: %d (%s)\n", errcode, strerror(errcode)); goto end; } } else { - printfsocket("Can't decrypt network pup!\n"); + printf_debug("Can't decrypt network pup!\n"); goto end; } @@ -369,15 +368,15 @@ int decrypt_pup_data(const decrypt_state * state) ssize_t byteswritten = writebytes(state, DIO_BASEOFFSET, header_size, header_data, header_size); if (byteswritten != header_size) { - printfsocket("Failed to write PUP entry header!\n"); + printf_debug("Failed to write PUP entry header!\n"); goto end; } - printfsocket("Verifying segments...\n"); + printf_debug("Verifying segments...\n"); result = verify_segments(state, segments, header->segment_count); if (result < 0) { - printfsocket("Failed to verify segments!\n"); + printf_debug("Failed to verify segments!\n"); goto end; } @@ -385,7 +384,7 @@ int decrypt_pup_data(const decrypt_state * state) /*for (int i = 0; i < header->segment_count; i++) { pup_segment* segment = &segments[i]; - printfsocket("%4d i=%4u b=%u c=%u t=%u r=%05X\n", + printf_debug("%4d i=%4u b=%u c=%u t=%u r=%05X\n", i, segment->flags >> 20, (segment->flags & 0x800) != 0, (segment->flags & 0x8) != 0, @@ -394,7 +393,7 @@ int decrypt_pup_data(const decrypt_state * state) }*/ - printfsocket("Decrypting %d segments...\n", header->segment_count); + printf_debug("Decrypting %d segments...\n", header->segment_count); for (int i = 0; i < header->segment_count; i++) { pup_segment* segment = &segments[i]; @@ -402,16 +401,16 @@ int decrypt_pup_data(const decrypt_state * state) uint32_t special = segment->flags & 0xF0000000; if (special == 0xE0000000) { - printfsocket("Skipping additional signature segment #%d!\n", i); + printf_debug("Skipping additional signature segment #%d!\n", i); continue; } else if (special == 0xF0000000) { - printfsocket("Skipping watermark segment #%d!\n", i); + printf_debug("Skipping watermark segment #%d!\n", i); continue; } - printfsocket("Decrypting segment %d/%d...\n", + printf_debug("Decrypting segment %d/%d...\n", 1 + i, header->segment_count); if ((segment->flags & 0x800) != 0) @@ -420,7 +419,7 @@ int decrypt_pup_data(const decrypt_state * state) result = find_table_segment(i, segments, header->segment_count, &table_index); if (result < 0) { - printfsocket("Failed to find table for segment #%d!\n", i); + printf_debug("Failed to find table for segment #%d!\n", i); continue; } @@ -458,12 +457,12 @@ void decrypt_pup(decrypt_state * state, const char * OutputPath) sprintf(state->output_path, OUTPUTPATH, state->entryname); } - printfsocket("Creating %s...\n", state->output_path); + printf_debug("Creating %s...\n", state->output_path); state->output_file = open(state->output_path, O_WRONLY | O_CREAT | O_TRUNC, 0777); if (state->output_file == -1) { - printfsocket("Failed to open %s!\n", state->output_path); + printf_debug("Failed to open %s!\n", state->output_path); goto end; } @@ -478,7 +477,7 @@ void decrypt_pup(decrypt_state * state, const char * OutputPath) if (state->pup_type < 0) { - printfsocket("Don't know the type for %s!\n", state->output_path); + printf_debug("Don't know the type for %s!\n", state->output_path); goto end; } @@ -510,36 +509,36 @@ void decrypt_pups(const char * InputPath, const char * OutputPath) sprintf(state.input_path, "%s", (InputPath != NULL) ? InputPath : INPUTPATH); - printfsocket("Opening %s...\n", state.input_path); + printf_debug("Opening %s...\n", state.input_path); state.input_file = open(state.input_path, O_RDONLY, 0); if (state.input_file == -1) { - printfsocket("Failed to open %s!\n", state.input_path); + printf_debug("Failed to open %s!\n", state.input_path); goto end; } header_data = memalign(0x4000, blsinitial); if (header_data == NULL) { - printfsocket("Failed to allocate memory!\n"); + printf_debug("Failed to allocate memory!\n"); } ssize_t bytesread = readbytes(&state, DIO_RESET, blsinitial, header_data, blsinitial); if (bytesread < blsinitial) { - printfsocket("Failed to read BLS header or BLS header too small!!\n"); + printf_debug("Failed to read BLS header or BLS header too small!!\n"); goto end; } bls_header * header = (bls_header*)header_data; if (header->magic != 0x32424C53) { - printfsocket("Invalid BLS Header!\n"); + printf_debug("Invalid BLS Header!\n"); goto end; } if ((header->file_count < 1) || (header->file_count > 10)) { - printfsocket("Invalid PUP entry count!\n"); + printf_debug("Invalid PUP entry count!\n"); goto end; } @@ -550,16 +549,16 @@ void decrypt_pups(const char * InputPath, const char * OutputPath) state.device_fd = open("/dev/pup_update0", O_RDWR, 0); if (state.device_fd < 0) { - printfsocket("Failed to open /dev/pup_update0!\n"); + printf_debug("Failed to open /dev/pup_update0!\n"); goto end; } - printfsocket("Verifying Bls Header...\n"); + printf_debug("Verifying Bls Header...\n"); int result = encsrv_verify_blsheader(state.device_fd, header_data, blsinitial, 0); if (result != 0) { int errcode = errno; - printfsocket("Failed while verifying Bls Header! Error: %d (%s)\n", errcode, strerror(errcode)); + printf_debug("Failed while verifying Bls Header! Error: %d (%s)\n", errcode, strerror(errcode)); goto end; } diff --git a/source/decryptio.c b/source/decryptio.c index 96a6bc7..926c8f7 100644 --- a/source/decryptio.c +++ b/source/decryptio.c @@ -1,13 +1,11 @@ #include "decryptio.h" -#include "defines.h" -#include "debug.h" #define chunksize 2097152 ssize_t readbytes(const decrypt_state * state, size_t offset, size_t bytes, void * buffer, size_t buffersize) { if (bytes > buffersize) { - printfsocket("ReadBytes failed! - Error: Buffer is too small!\n"); + printf_debug("ReadBytes failed! - Error: Buffer is too small!\n"); return -1; } @@ -29,11 +27,11 @@ ssize_t readbytes(const decrypt_state * state, size_t offset, size_t bytes, void if (result == -1) { int errcode = errno; - printfsocket("ReadBytes seek_set failed! - Error: %d (%s)\n", errcode, strerror(errcode)); + printf_debug("ReadBytes seek_set failed! - Error: %d (%s)\n", errcode, strerror(errcode)); return -1; } - printfsocket("Seeked to position " SSIZET_FMT " in input file.\n", result); + printf_debug("Seeked to position %zd in input file.\n", result); } size_t rchunksize = (bytes >= chunksize) ? chunksize : bytes; @@ -54,23 +52,22 @@ ssize_t readbytes(const decrypt_state * state, size_t offset, size_t bytes, void if ((result == -1) || (bytesread != bytes)) { int errcode = errno; - printfsocket("Read failed; Read " SSIZET_FMT " of " SSIZET_FMT "bytes - Result: %d (%s)\n", bytesread, bytes, + printf_debug("Read failed; Read %zd of %zd bytes - Result: %d (%s)\n", bytesread, bytes, errcode, strerror(errcode)); return -1; } -// printfsocket("Read " SSIZET_FMT " of " SSIZET_FMT " bytes to from input file.\n", bytesread, byte); +// printf_debug("Read %zd of %zd bytes to from input file.\n", bytesread, byte); return bytesread; } - ssize_t writebytes(const decrypt_state * state, size_t offset, size_t bytes, void * buffer, size_t buffersize) { if (bytes > buffersize) { - printfsocket("WriteBytes failed! - Error: Buffer is too small!\n"); + printf_debug("WriteBytes failed! - Error: Buffer is too small!\n"); return -1; } @@ -92,11 +89,11 @@ ssize_t writebytes(const decrypt_state * state, size_t offset, size_t bytes, voi if (result == -1) { int errcode = errno; - printfsocket("WriteBytes seek_set failed! - Error: %d (%s)\n", errcode, strerror(errcode)); + printf_debug("WriteBytes seek_set failed! - Error: %d (%s)\n", errcode, strerror(errcode)); return -1; } - printfsocket("Seeked to position " SSIZET_FMT " in output file.\n", result); + printf_debug("Seeked to position %zd in output file.\n", result); } size_t wchunksize = (bytes >= chunksize) ? chunksize : bytes; @@ -117,13 +114,13 @@ ssize_t writebytes(const decrypt_state * state, size_t offset, size_t bytes, voi if ((result == -1) || (byteswritten != bytes)) { int errcode = errno; - printfsocket("Write failed; Write " SSIZET_FMT " of " SSIZET_FMT "bytes - Result: %d (%s)\n", byteswritten, + printf_debug("Write failed; Write %zd of %zd bytes - Result: %d (%s)\n", byteswritten, bytes, errcode, strerror(errcode)); return -1; } -// printfsocket("Write " SSIZET_FMT " of " SSIZET_FMT " bytes to output file.\n", byteswritten, bytes); +// printf_debug("Write %zd of %zd bytes to output file.\n", byteswritten, bytes); return byteswritten; diff --git a/source/encryptsrv.c b/source/encryptsrv.c index 5878ec5..a4884e6 100644 --- a/source/encryptsrv.c +++ b/source/encryptsrv.c @@ -1,6 +1,5 @@ -#include "ps4.h" #include "encryptsrv_args.h" - +#include int translate_type(int type) { diff --git a/source/kernel_utils.c b/source/kernel_utils.c deleted file mode 100644 index 8c07ded..0000000 --- a/source/kernel_utils.c +++ /dev/null @@ -1,510 +0,0 @@ -#include "kernel_utils.h" - -#define X86_CR0_WP (1 << 16) - -static inline __attribute__((always_inline)) uint64_t __readmsr(unsigned long __register) { - unsigned long __edx; - unsigned long __eax; - __asm__("rdmsr" - : "=d"(__edx), "=a"(__eax) - : "c"(__register)); - return (((uint64_t)__edx) << 32) | (uint64_t)__eax; -} - -static inline __attribute__((always_inline)) uint64_t readCr0(void) { - uint64_t cr0; - __asm__ volatile("movq %0, %%cr0" - : "=r"(cr0) - : - : "memory"); - return cr0; -} - -static inline __attribute__((always_inline)) void writeCr0(uint64_t cr0) { - __asm__ volatile("movq %%cr0, %0" - : - : "r"(cr0) - : "memory"); -} - -int kpayload_get_fw_version(struct thread *td, struct kpayload_get_fw_version_args *args) { - void *kernel_base = 0; - int (*copyout)(const void *kaddr, void *uaddr, size_t len) = 0; - - uint64_t fw_version = 0x666; - - if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K700_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K700_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K700_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x700; // 7.00, 7.01, 7.02 - copyout = (void *)(kernel_base + K700_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K670_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x670; // 6.70, 6.71, and 6.72 - copyout = (void *)(kernel_base + K670_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K650_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x650; // 6.50 and 6.51 - copyout = (void *)(kernel_base + K650_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K620_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x620; // 6.20 - copyout = (void *)(kernel_base + K620_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K600_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x600; // 6.00 and 6.02 - copyout = (void *)(kernel_base + K600_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K555_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x555; // 5.55 and 5.56 - copyout = (void *)(kernel_base + K555_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K553_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x553; // 5.53 - copyout = (void *)(kernel_base + K553_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K550_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x550; // 5.50 - copyout = (void *)(kernel_base + K550_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K505_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x505; // 5.05 and 5.07 - copyout = (void *)(kernel_base + K505_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K503_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x503; // 5.03 - copyout = (void *)(kernel_base + K503_COPYOUT); - } else if (!memcmp((char *)(kernel_base + K500_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x500; // 5.00 and 5.01 - copyout = (void *)(kernel_base + K500_COPYOUT); - } - } else if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K470_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K470_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K470_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x470; // 4.70 - copyout = (void *)(kernel_base + K470_COPYOUT); - } - } else if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K471_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K471_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K471_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x471; // 4.71, 4.72, 4.73, and 4.74 - copyout = (void *)(kernel_base + K471_COPYOUT); - } - } else if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K450_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K450_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K450_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x450; // 4.50 and 4.55 - copyout = (void *)(kernel_base + K450_COPYOUT); - } - } else if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K406_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K406_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K406_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - // TODO: 4.06 and 4.07 overlap here even though other offsets to not - fw_version = 0x406; // 4.06 and 4.07 - copyout = (void *)(kernel_base + K406_COPYOUT); - } - } else if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K405_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K405_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K405_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x405; // 4.05 - copyout = (void *)(kernel_base + K405_COPYOUT); - } - } else if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K400_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K400_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K400_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x400; // 4.00 and 4.01 - copyout = (void *)(kernel_base + K400_COPYOUT); - } - } else if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K370_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K370_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K370_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x370; // 3.70 - copyout = (void *)(kernel_base + K370_COPYOUT); - } - } else if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K355_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K355_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K355_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x355; // 3.55 - copyout = (void *)(kernel_base + K355_COPYOUT); - } - } else if (!memcmp((char *)(&((uint8_t *)__readmsr(0xC0000082))[-K350_XFAST_SYSCALL]), (char[4]){0x7F, 0x45, 0x4C, 0x46}, 4)) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K350_XFAST_SYSCALL]; - if (!memcmp((char *)(kernel_base + K350_PRINTF), (char[12]){0x55, 0x48, 0x89, 0xE5, 0x53, 0x48, 0x83, 0xEC, 0x58, 0x48, 0x8D, 0x1D}, 12)) { - fw_version = 0x350; // 3.50 - copyout = (void *)(kernel_base + K350_COPYOUT); - } - } else { - return -1; - } - - uint64_t uaddr = args->kpayload_get_fw_version_info->uaddr; - copyout(&fw_version, (uint64_t *)uaddr, 8); - - return 0; -} - -int kpayload_jailbreak(struct thread *td, struct kpayload_jailbreak_args *args) { - struct filedesc *fd; - struct ucred *cred; - fd = td->td_proc->p_fd; - cred = td->td_proc->p_ucred; - - void *kernel_base; - uint8_t *kernel_ptr; - void **got_prison0; - void **got_rootvnode; - - uint64_t fw_version = args->kpayload_jailbreak_info->fw_version; - - - if (fw_version == 0x350) { - // 3.50 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K350_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K350_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K350_ROOTVNODE]; - } else if (fw_version == 0x355) { - // 3.55 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K355_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K355_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K355_ROOTVNODE]; - } else if (fw_version == 0x370) { - // 3.70 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K370_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K370_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K370_ROOTVNODE]; - } else if (fw_version == 0x400) { - // 4.00 and 4.01 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K400_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K400_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K400_ROOTVNODE]; - } else if (fw_version == 0x405) { - // 4.05 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K405_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K405_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K405_ROOTVNODE]; - } else if (fw_version == 0x406) { - // 4.06 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K406_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K406_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K406_ROOTVNODE]; - } else if (fw_version == 0x407) { - // 4.07 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K407_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K407_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K407_ROOTVNODE]; - } else if (fw_version == 0x450) { - // 4.50 and 4.55 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K450_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K450_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K450_ROOTVNODE]; - } else if (fw_version == 0x470) { - // 4.70 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K470_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K470_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K470_ROOTVNODE]; - } else if (fw_version == 0x471) { - // 4.71, 4.72, 4.73, and 4.74 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K471_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K471_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K471_ROOTVNODE]; - } else if (fw_version == 0x500) { - // 5.00 and 5.01 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K501_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K500_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K500_ROOTVNODE]; - } else if (fw_version == 0x503) { - // 5.03 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K503_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K503_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K503_ROOTVNODE]; - } else if (fw_version == 0x505) { - // 5.05 and 5.07 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K505_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K505_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K505_ROOTVNODE]; - } else if (fw_version == 0x550) { - // 5.50 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K550_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K550_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K550_ROOTVNODE]; - } else if (fw_version == 0x553) { - // 5.53 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K553_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K553_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K553_ROOTVNODE]; - } else if (fw_version == 0x555) { - // 5.55 and 5.56 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K555_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K555_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K555_ROOTVNODE]; - } else if (fw_version == 0x600) { - // 6.00 and 6.02 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K600_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K600_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K600_ROOTVNODE]; - } else if (fw_version == 0x620) { - // 6.20 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K620_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K620_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K620_ROOTVNODE]; - } else if (fw_version == 0x650) { - // 6.50 and 6.51 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K650_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K650_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K650_ROOTVNODE]; - } else if (fw_version == 0x670) { - // 6.70, 6.71, and 6.72 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K670_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K670_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K670_ROOTVNODE]; - } else if (fw_version == 0x700) { - // 7.00, 7.01, 7.02 - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K700_XFAST_SYSCALL]; - kernel_ptr = (uint8_t *)kernel_base; - got_prison0 = (void **)&kernel_ptr[K700_PRISON_0]; - got_rootvnode = (void **)&kernel_ptr[K700_ROOTVNODE]; - } else { - return -1; - } - - cred->cr_uid = 0; - cred->cr_ruid = 0; - cred->cr_rgid = 0; - cred->cr_groups[0] = 0; - - cred->cr_prison = *got_prison0; - fd->fd_rdir = fd->fd_jdir = *got_rootvnode; - - void *td_ucred = *(void **)(((char *)td) + 304); - - uint64_t *sonyCred = (uint64_t *)(((char *)td_ucred) + 96); - *sonyCred = 0xffffffffffffffff; - - uint64_t *sceProcessAuthorityId = (uint64_t *)(((char *)td_ucred) + 88); - *sceProcessAuthorityId = 0x3801000000000013; - - uint64_t *sceProcCap = (uint64_t *)(((char *)td_ucred) + 104); - *sceProcCap = 0xffffffffffffffff; - - return 0; -} - -int kpayload_get_kbase(struct thread *td, struct kpayload_get_kbase_args *args) { - void *kernel_base; - int (*copyout)(const void *kaddr, void *uaddr, size_t len); - - uint64_t fw_version = args->kpayload_get_kbase_info->fw_version; - - if (fw_version == 0x350) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K350_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K350_COPYOUT); - } else if (fw_version == 0x355) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K355_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K355_COPYOUT); - } else if (fw_version == 0x370) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K370_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K370_COPYOUT); - } else if (fw_version == 0x400 || 0x401) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K400_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K400_COPYOUT); - } else if (fw_version == 0x405) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K405_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K405_COPYOUT); - } else if (fw_version == 0x406) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K406_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K406_COPYOUT); - } else if (fw_version == 0x407) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K407_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K407_COPYOUT); - } else if (fw_version == 0x450 || fw_version == 0x455) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K450_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K450_COPYOUT); - } else if (fw_version == 0x470) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K470_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K470_COPYOUT); - } else if (fw_version == 0x471 || fw_version == 0x472 || fw_version == 0x473 || fw_version == 0x474) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K471_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K471_COPYOUT); - } else if (fw_version == 0x500 || fw_version == 0x501) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K500_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K500_COPYOUT); - } else if (fw_version == 0x503) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K503_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K503_COPYOUT); - } else if (fw_version == 0x505 || fw_version == 0x507) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K505_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K505_COPYOUT); - } else if (fw_version == 0x550) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K550_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K550_COPYOUT); - } else if (fw_version == 0x553) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K553_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K553_COPYOUT); - } else if (fw_version == 0x555 || fw_version == 0x556) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K555_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K555_COPYOUT); - } else if (fw_version == 0x600 || fw_version == 0x602) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K600_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K600_COPYOUT); - } else if (fw_version == 0x620) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K620_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K620_COPYOUT); - } else if (fw_version == 0x650 || fw_version == 0x651) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K650_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K650_COPYOUT); - } else if (fw_version == 0x670 || fw_version == 0x671 || fw_version == 0x672) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K670_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K670_COPYOUT); - } else if (fw_version == 0x700 || fw_version == 0x701 || fw_version == 0x702) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K700_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K700_COPYOUT); - } else { - return -1; - } - - uint64_t uaddr = args->kpayload_get_kbase_info->uaddr; - copyout(&kernel_base, (uint64_t *)uaddr, 8); - - return 0; -} - -int kpayload_kernel_dumper(struct thread *td, struct kpayload_kernel_dumper_args *args) { - void *kernel_base; - int (*copyout)(const void *kaddr, void *uaddr, size_t len); - - uint64_t fw_version = args->kpayload_kernel_dumper_info->fw_version; - - if (fw_version == 0x350) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K350_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K350_COPYOUT); - } else if (fw_version == 0x355) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K355_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K355_COPYOUT); - } else if (fw_version == 0x370) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K370_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K370_COPYOUT); - } else if (fw_version == 0x400 || 0x401) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K400_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K400_COPYOUT); - } else if (fw_version == 0x405) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K405_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K405_COPYOUT); - } else if (fw_version == 0x406) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K406_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K406_COPYOUT); - } else if (fw_version == 0x407) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K407_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K407_COPYOUT); - } else if (fw_version == 0x450 || fw_version == 0x455) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K450_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K450_COPYOUT); - } else if (fw_version == 0x470) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K470_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K470_COPYOUT); - } else if (fw_version == 0x471 || fw_version == 0x472 || fw_version == 0x473 || fw_version == 0x474) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K471_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K471_COPYOUT); - } else if (fw_version == 0x500 || fw_version == 0x501) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K500_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K500_COPYOUT); - } else if (fw_version == 0x503) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K503_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K503_COPYOUT); - } else if (fw_version == 0x505 || fw_version == 0x507) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K505_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K505_COPYOUT); - } else if (fw_version == 0x550) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K550_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K550_COPYOUT); - } else if (fw_version == 0x553) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K553_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K553_COPYOUT); - } else if (fw_version == 0x555 || fw_version == 0x556) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K555_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K555_COPYOUT); - } else if (fw_version == 0x600 || fw_version == 0x602) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K600_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K600_COPYOUT); - } else if (fw_version == 0x620) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K620_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K620_COPYOUT); - } else if (fw_version == 0x650 || fw_version == 0x651) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K650_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K650_COPYOUT); - } else if (fw_version == 0x670 || fw_version == 0x671 || fw_version == 0x672) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K670_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K670_COPYOUT); - } else if (fw_version == 0x700 || fw_version == 0x701 || fw_version == 0x702) { - kernel_base = &((uint8_t *)__readmsr(0xC0000082))[-K700_XFAST_SYSCALL]; - copyout = (void *)(kernel_base + K700_COPYOUT); - } else { - return -1; - } - - uint64_t kaddr = args->kpayload_kernel_dumper_info->kaddr; - uint64_t uaddr = args->kpayload_kernel_dumper_info->uaddr; - size_t size = args->kpayload_kernel_dumper_info->size; - - int cpRet = copyout((uint64_t *)kaddr, (uint64_t *)uaddr, size); - - if (cpRet == -1) { - memset((uint64_t *)uaddr, 0, size); - } - - return cpRet; -} - -uint64_t get_fw_version(void) { - uint64_t fw_version = 0x666; - uint64_t *fw_version_ptr = mmap(NULL, 8, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - struct kpayload_get_fw_version_info kpayload_get_fw_version_info; - kpayload_get_fw_version_info.uaddr = (uint64_t)fw_version_ptr; - kexec(&kpayload_get_fw_version, &kpayload_get_fw_version_info); - memcpy(&fw_version, fw_version_ptr, 8); - munmap(fw_version_ptr, 8); - - return fw_version; -} - -int jailbreak(uint64_t fw_version) { - struct kpayload_jailbreak_info kpayload_jailbreak_info; - kpayload_jailbreak_info.fw_version = fw_version; - kexec(&kpayload_jailbreak, &kpayload_jailbreak_info); - - return 0; -} - -uint64_t get_kernel_base(uint64_t fw_version) { - uint64_t kernel_base = -1; - uint64_t *kernel_base_ptr = mmap(NULL, 8, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); - struct kpayload_get_kbase_info kpayload_get_kbase_info; - kpayload_get_kbase_info.fw_version = fw_version; - kpayload_get_kbase_info.uaddr = (uint64_t)kernel_base_ptr; - kexec(&kpayload_get_kbase, &kpayload_get_kbase_info); - memcpy(&kernel_base, kernel_base_ptr, 8); - munmap(kernel_base_ptr, 8); - - return kernel_base; -} - -int dump_kernel(uint64_t fw_version, uint64_t kaddr, uint64_t *dump, size_t size) { - struct kpayload_kernel_dumper_info kpayload_kernel_dumper_info; - kpayload_kernel_dumper_info.fw_version = fw_version; - kpayload_kernel_dumper_info.kaddr = kaddr; - kpayload_kernel_dumper_info.uaddr = (uint64_t)dump; - kpayload_kernel_dumper_info.size = size; - kexec(&kpayload_kernel_dumper, &kpayload_kernel_dumper_info); - - return 0; -} diff --git a/source/main.c b/source/main.c index 2313456..d013bf5 100644 --- a/source/main.c +++ b/source/main.c @@ -1,57 +1,39 @@ -#include "kernel_utils.h" +#include +#include "decrypt.h" -#define KERNEL_CHUNK_SIZE 0x1000 -#define KERNEL_CHUNK_NUMBER 0x69B8 +//#define DEBUG_SOCKET +#define DEBUG_IP "192.168.2.2" +#define DEBUG_PORT 9023 -int sock; +extern int DEBUG_SOCK; time_t prevtime; -uint8_t GetElapsed(uint64_t ResetInterval) { - - time_t currenttime = time(0); - uint64_t elapsed = currenttime - prevtime; - - if ((ResetInterval == 0) || (elapsed >= ResetInterval)) { - prevtime = currenttime; - return 1; - } - - return 0; -} - int _main(struct thread* td) { initKernel(); initLibc(); - initPthread(); initNetwork(); -#ifdef DEBUG_SOCKET - struct sockaddr_in server; - - server.sin_len = sizeof(server); - server.sin_family = AF_INET; - server.sin_addr.s_addr = DEBUG_ADDR; //in defines.h - server.sin_port = sceNetHtons(DEBUG_PORT); //in defines.h - memset(server.sin_zero, 0, sizeof(server.sin_zero)); - sock = sceNetSocket("debug", AF_INET, SOCK_STREAM, 0); - sceNetConnect(sock, (struct sockaddr *)&server, sizeof(server)); - - int flag = 1; - sceNetSetsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&flag, sizeof(int)); -#endif + char fw_version[6] = {0}; - uint64_t fw_version = get_fw_version(); - jailbreak(fw_version); - + get_firmware_string(fw_version); - initSysUtil(); + printf_notification("Running PS4 PUP Decrypter\nPS4 Firmware %s", fw_version); - GetElapsed(0); +#ifdef DEBUG_SOCKET + initNetwork(); + DEBUG_SOCK = SckConnect(DEBUG_IP, DEBUG_PORT); +#endif + + jailbreak(); - printf_notification("Running PS4 PUP Decrypter"); decrypt_pups("/mnt/usb0/safe.PS4UPDATE.PUP", "/mnt/usb0/%s.dec"); printf_notification("Finished PS4 PUP Decrypter"); +#ifdef DEBUG_SOCKET + printf_debug("Closing socket...\n"); + SckClose(DEBUG_SOCK); +#endif + return 0; } diff --git a/source/time_utils.c b/source/time_utils.c new file mode 100644 index 0000000..1a550fa --- /dev/null +++ b/source/time_utils.c @@ -0,0 +1,15 @@ +#include "time_utils.h" + +extern time_t prevtime; + +uint8_t GetElapsed(uint64_t ResetInterval) { + time_t currenttime = time(0); + uint64_t elapsed = currenttime - prevtime; + + if ((ResetInterval == 0) || (elapsed >= ResetInterval)) { + prevtime = currenttime; + return 1; + } + + return 0; +} \ No newline at end of file