yifanlu

Gateway 3DS patcher - psudocode

Aug 8th, 2013
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.18 KB | None | 0 0
  1. // Read/write from DS serial SPI
  2. extern void read_firmware(void *dest, uint32_t start, size_t size);
  3. extern void write_firmware(void *src, uint32_t start, size_t size);
  4.  
  5. // CRC16 and related hash functions
  6. extern uint16_t do_hash1(const char *firm, size_t size);
  7. extern uint16_t do_hash2(const char *firm, size_t size);
  8. extern uint32_t do_hash3(const char *firm, size_t size);
  9. extern uint16_t do_hash4(const char *firm, size_t size);
  10.  
  11. const char patch1[] = {0xB9, 0xF2, 0x10, 0x00, 0xAE, 0x2B, 0x27, 0x00, 0xED, 0x0D, 0xDC, 0xBA, 0x9C, 0xF1, 0x18, 0x00, 0x90, 0xB6, 0x10, 0x00, 0x00, 0xB0, 0xFA, 0x00, 0x00, 0x02, 0x20, 0x00, 0xB9, 0xF2, 0x10, 0x00, 0x00, 0x90, 0x27, 0x00, 0x01, 0x00, 0x00, 0x00, 0xE1, 0x49, 0x15, 0x00, 0x38, 0x6F, 0x27, 0x00, 0xAC, 0x82, 0x1B, 0x00, 0xDC, 0xD5, 0x18, 0x00, 0x40, 0x83, 0x27, 0x00, 0x00, 0x02, 0x10, 0x00, 0xCC, 0x48, 0x00, 0x00, 0x60, 0x3D, 0x14, 0x00, 0xB9, 0xF2, 0x10, 0x00, 0x00, 0x90, 0x27, 0x00, 0x00, 0x00, 0x2B, 0x00, 0xF9, 0x02, 0x10, 0x00, 0xF9, 0x02, 0x10, 0x00, 0xF9, 0x02, 0x10, 0x00, 0xF9, 0x02, 0x10, 0x00, 0xF9, 0x02, 0x10, 0x00, 0xF9, 0x02, 0x10, 0x00, 0xE1, 0x49, 0x15, 0x00, 0x51, 0x00, 0xCD, 0xC2, 0xE1, 0x49, 0x15, 0x00, 0x20, 0x90, 0x27, 0x00, 0x8C, 0x53, 0x10, 0x00, 0x00, 0x90, 0x00, 0x00, 0x58, 0x39, 0x1B, 0x00, 0xE5, 0x04, 0x21, 0x00, 0x00, 0xDA, 0x19, 0x00, 0x00, 0x75, 0x01, 0x00, 0x86, 0xDF, 0x21, 0x00, 0x00, 0xC1, 0x1A, 0x00, 0x22, 0xDA, 0x1D, 0x00, 0x91, 0xFE, 0x16, 0x00, 0x00, 0x01, 0x10, 0x00, 0xBC, 0x4C, 0x14, 0x00, 0x00, 0x00, 0x2B, 0x00, 0x00, 0x90, 0x00, 0x00, 0xE1, 0x49, 0x15, 0x00, 0xAC, 0xEF, 0x22, 0x00, 0x88, 0x5C, 0x10, 0x00, 0x00, 0x00, 0x0E, 0x00, 0x90, 0x03, 0x25, 0x00, 0xC0, 0xFA, 0x1E, 0x00, 0x91, 0xFE, 0x16, 0x00, 0x8C, 0x53, 0x10, 0x00, 0x24, 0x6B, 0x03, 0x00, 0x60, 0x3D, 0x14, 0x00};
  12.  
  13. const char patch2[] = {0xB9, 0xF2, 0x10, 0x00, 0x00, 0xFE, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00, 0xE1, 0x49, 0x15, 0x00, 0x00, 0x94, 0x27, 0x00, 0xFC, 0x34, 0x13, 0x00, 0xD0, 0x8C, 0x1E, 0x00, 0x8C, 0x53, 0x10, 0x00, 0x9C, 0x94, 0x27, 0xF0, 0x60, 0x3D, 0x14, 0x00};
  14.  
  15. void do_patches(char *firm)
  16. {
  17.     memcpy(firm+0x1FE00, patch1, sizeof(patch1));
  18.     memcpy(firm+0x1FFB4, patch2, sizeof(patch2));
  19.     *(uint16_t)(firm+0x1FEFE) = do_hash1(firm, 0x1FFFF);
  20.     *(uint16_t)(firm+0x1FF50) = do_hash2(firm, 0x1FFFF);
  21.     *(uint32_t)(firm+0x1FF70) = do_hash3(firm, 0x1FFFF);
  22.     *(uint16_t)(firm+0x1FFFE) = do_hash4(firm, 0x1FFFF);
  23. }
  24.  
  25. void program()
  26. {
  27.     char *firm = malloc(0x1FFFF);
  28.     char data[0x1D];
  29.     uint16_t unk1;
  30.  
  31.     // Read first 0x0001FFFF bytes of firmware
  32.     read_firmware(firm, 0x0, 0x1FFFF);
  33.     do_patches(firm);
  34.  
  35.     // Writes first 0x300 bytes back (same data)
  36.     write_firmware(firm, 0x0, 0x300);
  37.  
  38.     // Gets a pointer of uint16_t at 0x300
  39.     unk1 = *(uint16_t*)(firm+0x300);
  40.  
  41.     // Read 0x1D bytes at that location
  42.     read_firmware(data, unk1, 0x1D);
  43.  
  44.     // Writes 0x300 - 0x9FF bytes back (same data)
  45.     write_firmware(firm+0x300, 0x300, 0x6FF);
  46.  
  47.     // Writes the 0x1D bytes of data from 0xA00 at #3's location
  48.     write_firmware(data, unk1, 0x1D);
  49.  
  50.     // Writes 0xA00 - 0x1FFF, mostly same data except 6 patches
  51.     write_firmware(firm+0xA00, 0xA00, 0x15FF);
  52. }
  53.  
  54. void verify()
  55. {
  56.     // not much, just read back all 0x1FFFF bytes again and compare it with patched data
  57. }
Advertisement
Add Comment
Please, Sign In to add comment