Advertisement
Guest User

DB_SG_Backup_v3

a guest
Feb 8th, 2018
388
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 8.33 KB | None | 0 0
  1. #include "ps4.h"
  2.  
  3.  
  4. unsigned int long long __readmsr(unsigned long __register) {
  5.     unsigned long __edx;
  6.     unsigned long __eax;
  7.     __asm__ ("rdmsr" : "=d"(__edx), "=a"(__eax) : "c"(__register));
  8.     return (((unsigned int long long)__edx) << 32) | (unsigned int long long)__eax;
  9. }
  10.  
  11. #define X86_CR0_WP (1 << 16)
  12.  
  13. static inline __attribute__((always_inline)) uint64_t readCr0(void) {
  14.     uint64_t cr0;
  15.    
  16.     asm volatile (
  17.         "movq %0, %%cr0"
  18.         : "=r" (cr0)
  19.         : : "memory"
  20.     );
  21.    
  22.     return cr0;
  23. }
  24.  
  25. static inline __attribute__((always_inline)) void writeCr0(uint64_t cr0) {
  26.     asm volatile (
  27.         "movq %%cr0, %0"
  28.         : : "r" (cr0)
  29.         : "memory"
  30.     );
  31. }
  32.  
  33. struct auditinfo_addr {
  34.     char useless[184];
  35. };
  36.  
  37. struct ucred {
  38.     uint32_t useless1;
  39.     uint32_t cr_uid;     // effective user id
  40.     uint32_t cr_ruid;    // real user id
  41.     uint32_t useless2;
  42.         uint32_t useless3;
  43.         uint32_t cr_rgid;    // real group id
  44.         uint32_t useless4;
  45.         void *useless5;
  46.         void *useless6;
  47.         void *cr_prison;     // jail(2)
  48.         void *useless7;
  49.         uint32_t useless8;
  50.         void *useless9[2];
  51.         void *useless10;
  52.         struct auditinfo_addr useless11;
  53.         uint32_t *cr_groups; // groups
  54.         uint32_t useless12;
  55. };
  56.  
  57. struct filedesc {
  58.     void *useless1[3];
  59.         void *fd_rdir;
  60.         void *fd_jdir;
  61. };
  62.  
  63. struct proc {
  64.         char useless[64];
  65.         struct ucred *p_ucred;
  66.         struct filedesc *p_fd;
  67. };
  68.  
  69. struct thread {
  70.         void *useless;
  71.         struct proc *td_proc;
  72. };
  73.  
  74.  
  75. int kpayload(struct thread *td){
  76.  
  77.     struct ucred* cred;
  78.     struct filedesc* fd;
  79.  
  80.     fd = td->td_proc->p_fd;
  81.     cred = td->td_proc->p_ucred;
  82.  
  83.     void* kernel_base = &((uint8_t*)__readmsr(0xC0000082))[-0x30EB30];
  84.     uint8_t* kernel_ptr = (uint8_t*)kernel_base;
  85.     void** got_prison0 =   (void**)&kernel_ptr[0xF26010];
  86.     void** got_rootvnode = (void**)&kernel_ptr[0x206D250];
  87.  
  88.     cred->cr_uid = 0;
  89.     cred->cr_ruid = 0;
  90.     cred->cr_rgid = 0;
  91.     cred->cr_groups[0] = 0;
  92.  
  93.     cred->cr_prison = *got_prison0;
  94.     fd->fd_rdir = fd->fd_jdir = *got_rootvnode;
  95.  
  96.     // escalate ucred privs, needed for access to the filesystem ie* mounting & decrypting files
  97.     void *td_ucred = *(void **)(((char *)td) + 304); // p_ucred == td_ucred
  98.    
  99.     // sceSblACMgrIsSystemUcred
  100.     uint64_t *sonyCred = (uint64_t *)(((char *)td_ucred) + 96);
  101.     *sonyCred = 0xffffffffffffffff;
  102.    
  103.     // sceSblACMgrGetDeviceAccessType
  104.     uint64_t *sceProcType = (uint64_t *)(((char *)td_ucred) + 88);
  105.     *sceProcType = 0x3801000000000013; // Max access
  106.    
  107.     // sceSblACMgrHasSceProcessCapability
  108.     uint64_t *sceProcCap = (uint64_t *)(((char *)td_ucred) + 104);
  109.     *sceProcCap = 0xffffffffffffffff; // Sce Process
  110.  
  111.     // Disable write protection
  112.     uint64_t cr0 = readCr0();
  113.     writeCr0(cr0 & ~X86_CR0_WP);
  114.  
  115.     // specters debug settings patchs
  116.     *(char *)(kernel_base + 0x2001516) |= 0x14;
  117.     *(char *)(kernel_base + 0x2001539) |= 3;
  118.     *(char *)(kernel_base + 0x200153A) |= 1;
  119.     *(char *)(kernel_base + 0x2001558) |= 1;   
  120.  
  121.     // debug menu full patches thanks to sealab
  122.     *(uint32_t *)(kernel_base + 0x4CECB7) = 0;
  123.     *(uint32_t *)(kernel_base + 0x4CFB9B) = 0;
  124.  
  125.     // Target ID Patches :)
  126.     *(uint16_t *)(kernel_base + 0x1FE59E4) = 0x8101;
  127.     *(uint16_t *)(kernel_base + 0X1FE5A2C) = 0x8101;
  128.     *(uint16_t *)(kernel_base + 0x200151C) = 0x8101;
  129.  
  130.     // enable mmap of all SELF ???
  131.     *(uint8_t*)(kernel_base + 0x31EE40) = 0x90;
  132.     *(uint8_t*)(kernel_base + 0x31EE41) = 0xE9;
  133.     *(uint8_t*)(kernel_base + 0x31EF98) = 0x90;
  134.     *(uint8_t*)(kernel_base + 0x31EF99) = 0x90;
  135.  
  136.     // Restore write protection
  137.     writeCr0(cr0);
  138.  
  139.     return 0;
  140. }
  141.  
  142. double(*ceil)(double x);
  143. int(*sceSysUtilSendSystemNotificationWithText)(int messageType, char* message);
  144.  
  145. void systemMessage(char* msg) {
  146.     sceSysUtilSendSystemNotificationWithText(222, msg);
  147. }
  148.  
  149.  
  150. void copyFile(char *sourcefile, char* destfile)
  151. {
  152.     FILE *src = fopen(sourcefile, "rb");
  153.     if (src)
  154.     {
  155.         FILE *out = fopen(destfile,"wb");
  156.         if (out)
  157.         {
  158.             size_t bytes;
  159.             char *buffer = malloc(65536);
  160.             if (buffer != NULL)
  161.             {
  162.                 while (0 < (bytes = fread(buffer, 1, 65536, src)))
  163.                     fwrite(buffer, 1, bytes, out);
  164.                     free(buffer);
  165.             }
  166.             fclose(out);
  167.         }
  168.         else {
  169.         }
  170.         fclose(src);
  171.     }
  172.     else {
  173.     }
  174. }
  175.  
  176.  
  177.  
  178. void copyDir(char *sourcedir, char* destdir)
  179. {
  180.     DIR *dir;
  181.     struct dirent *dp;
  182.     struct stat info;
  183.     char src_path[1024], dst_path[1024];
  184.  
  185.     dir = opendir(sourcedir);
  186.     if (!dir)
  187.         return;
  188.         mkdir(destdir, 0777);
  189.     while ((dp = readdir(dir)) != NULL)
  190.     {
  191.         if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, ".."))
  192.         {}
  193.         else
  194.         {
  195.             sprintf(src_path, "%s/%s", sourcedir, dp->d_name);
  196.             sprintf(dst_path, "%s/%s", destdir  , dp->d_name);
  197.  
  198.             if (!stat(src_path, &info))
  199.             {
  200.                 if (S_ISDIR(info.st_mode))
  201.                 {
  202.                   copyDir(src_path, dst_path);
  203.                 }
  204.                 else
  205.                 if (S_ISREG(info.st_mode))
  206.                 {
  207.                   copyFile(src_path, dst_path);
  208.                 }
  209.             }
  210.         }
  211.     }
  212.     closedir(dir);
  213. }
  214.  
  215.  
  216.  
  217.  
  218.  
  219. int _main(struct thread *td) {
  220.     initKernel();
  221.     initLibc();
  222.  
  223.     DIR *dir;
  224.     dir = opendir("/system_data/savedata");
  225.     if (!dir)
  226.     {
  227.        syscall(11,kpayload,td);
  228.     }
  229.     else
  230.     {
  231.        closedir(dir);
  232.     }
  233.  
  234.         int sysUtil = sceKernelLoadStartModule("/system/common/lib/libSceSysUtil.sprx", 0, NULL, 0, 0, 0);
  235.         RESOLVE(sysUtil, sceSysUtilSendSystemNotificationWithText);
  236.  
  237.         FILE *usbdir = fopen("/mnt/usb0/.dirtest", "wb");
  238.    
  239.          if (!usbdir)
  240.             {
  241.                 usbdir = fopen("/mnt/usb1/.dirtest", "wb");
  242.                 if (!usbdir)
  243.                 {
  244.                         copyFile("/system_data/priv/mms/app.db", "/system_data/priv/mms/app.db_backup");
  245.                         copyFile("/system_data/priv/mms/addcont.db", "/system_data/priv/mms/addcont.db_backup");
  246.                         systemMessage("Internal backup complete.\nThis was only a database backup use a usb drive for full backup.");
  247.                         return 0;
  248.                 }
  249.                 else
  250.                 {
  251.                         fclose(usbdir);
  252.                         systemMessage("Backing up to USB1");
  253.                         unlink("/mnt/usb1/.dirtest");
  254.                         mkdir("/mnt/usb1/DB_Dackup/", 0777);
  255.                         copyFile("/system_data/priv/mms/app.db", "/mnt/usb1/DB_Dackup/app.db");
  256.                         copyFile("/system_data/priv/mms/addcont.db", "/mnt/usb1/DB_Dackup/addcont.db");
  257.                         mkdir("/mnt/usb1/GameSaves/", 0777);
  258.                         mkdir("/mnt/usb1/GameSaves/system_data/", 0777);
  259.                         mkdir("/mnt/usb1/GameSaves/system_data/savedata", 0777);
  260.                         mkdir("/mnt/usb1/GameSaves/user/", 0777);
  261.                         mkdir("/mnt/usb1/GameSaves/user/home/", 0777);
  262.                         copyDir("/system_data/savedata","/mnt/usb1/GameSaves/system_data/savedata");
  263.                         copyDir("/user/home", "/mnt/usb1/GameSaves/user/home");
  264.                         systemMessage("USB Backup Complete.");
  265.  
  266.                 }
  267.             }
  268.             else
  269.             {
  270.                         fclose(usbdir);
  271.                         systemMessage("Backing up to USB0");
  272.                         unlink("/mnt/usb0/.dirtest");
  273.                         mkdir("/mnt/usb0/DB_Dackup/", 0777);
  274.                         copyFile("/system_data/priv/mms/app.db", "/mnt/usb0/DB_Dackup/app.db");
  275.                         copyFile("/system_data/priv/mms/addcont.db", "/mnt/usb0/DB_Dackup/addcont.db");
  276.                         mkdir("/mnt/usb0/GameSaves/", 0777);
  277.                         mkdir("/mnt/usb0/GameSaves/system_data/", 0777);
  278.                         mkdir("/mnt/usb0/GameSaves/system_data/savedata", 0777);
  279.                         mkdir("/mnt/usb0/GameSaves/user/", 0777);
  280.                         mkdir("/mnt/usb0/GameSaves/user/home/", 0777);
  281.                         copyDir("/system_data/savedata","/mnt/usb0/GameSaves/system_data/savedata");
  282.                         copyDir("/user/home", "/mnt/usb0/GameSaves/user/home");
  283.                         systemMessage("USB Backup Complete.");
  284.             }
  285.  
  286.     return 0;
  287. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement