Advertisement
xerpi

vita-nid-finder by TheFloW

Feb 8th, 2017
359
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.57 KB | None | 0 0
  1. // vita-nid-finder by TheFloW
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <string.h>
  6. #include <stdint.h>
  7. #include <unistd.h>
  8. #include <ctype.h>
  9. #include <dirent.h>
  10. #include <errno.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <fcntl.h>
  14.  
  15. typedef struct {
  16.     uint16_t attr;
  17.     uint16_t ver;
  18.     char name[27];
  19.     uint8_t type;
  20.     uint32_t gp;
  21.     uint32_t expTop;
  22.     uint32_t expBtm;
  23.     uint32_t impTop;
  24.     uint32_t impBtm;
  25.     uint32_t nid;
  26.     uint32_t unk[3];
  27.     uint32_t start;
  28.     uint32_t stop;
  29.     uint32_t exidxTop;
  30.     uint32_t exidxBtm;
  31.     uint32_t extabTop;
  32.     uint32_t extabBtm;
  33. } __attribute__((packed)) SceModuleInfo;
  34.  
  35. typedef struct {
  36.     uint16_t size;
  37.     uint8_t lib_version[2];
  38.     uint16_t attribute;
  39.     uint16_t num_functions;
  40.     uint32_t num_vars;
  41.     uint32_t num_tls_vars;
  42.     uint32_t module_nid;
  43.     uint32_t lib_name;
  44.     uint32_t nid_table;
  45.     uint32_t entry_table;
  46. } __attribute__((packed)) SceExportsTable;
  47.  
  48. typedef struct {
  49.     uint16_t size;
  50.     uint16_t lib_version;
  51.     uint16_t attribute;
  52.     uint16_t num_functions;
  53.     uint16_t num_vars;
  54.     uint16_t num_tls_vars;
  55.     uint32_t reserved1;
  56.     uint32_t module_nid;
  57.     uint32_t lib_name;
  58.     uint32_t reserved2;
  59.     uint32_t func_nid_table;
  60.     uint32_t func_entry_table;
  61.     uint32_t var_nid_table;
  62.     uint32_t var_entry_table;
  63.     uint32_t tls_nid_table;
  64.     uint32_t tls_entry_table;
  65. } __attribute__((packed)) SceImportsTable2xx;
  66.  
  67. typedef struct {
  68.     uint16_t size;
  69.     uint16_t lib_version;
  70.     uint16_t attribute;
  71.     uint16_t num_functions;
  72.     uint16_t num_vars;
  73.     uint16_t unknown1;
  74.     uint32_t module_nid;
  75.     uint32_t lib_name;
  76.     uint32_t func_nid_table;
  77.     uint32_t func_entry_table;
  78.     uint32_t var_nid_table;
  79.     uint32_t var_entry_table;
  80. } __attribute__((packed)) SceImportsTable3xx;
  81.  
  82. static void convertToImportsTable3xx(SceImportsTable2xx *import_2xx, SceImportsTable3xx *import_3xx)
  83. {
  84.     memset(import_3xx, 0, sizeof(SceImportsTable3xx));
  85.  
  86.     if (import_2xx->size == sizeof(SceImportsTable2xx)) {
  87.         import_3xx->size = import_2xx->size;
  88.         import_3xx->lib_version = import_2xx->lib_version;
  89.         import_3xx->attribute = import_2xx->attribute;
  90.         import_3xx->num_functions = import_2xx->num_functions;
  91.         import_3xx->num_vars = import_2xx->num_vars;
  92.         import_3xx->module_nid = import_2xx->module_nid;
  93.         import_3xx->lib_name = import_2xx->lib_name;
  94.         import_3xx->func_nid_table = import_2xx->func_nid_table;
  95.         import_3xx->func_entry_table = import_2xx->func_entry_table;
  96.         import_3xx->var_nid_table = import_2xx->var_nid_table;
  97.         import_3xx->var_entry_table = import_2xx->var_entry_table;
  98.     } else if (import_2xx->size == sizeof(SceImportsTable3xx)) {
  99.         memcpy(import_3xx, import_2xx, sizeof(SceImportsTable3xx));
  100.     }
  101. }
  102.  
  103. int ReadFile(char *file, void *buf, int size) {
  104.     FILE *f = fopen(file, "rb");
  105.  
  106.     if (!f) {
  107.         fprintf(stderr, "Error opening: %s\n", file);
  108.         return -1;
  109.     }
  110.  
  111.     int rd = fread(buf, 1, size, f);
  112.     fclose(f);
  113.  
  114.     return rd;
  115. }
  116.  
  117. int WriteFile(char *file, void *buf, int size) {
  118.     FILE *f = fopen(file, "wb");
  119.  
  120.     if (!f) {
  121.         fprintf(stderr, "Error opening: %s for write\n", file);
  122.         return -1;
  123.     }
  124.  
  125.     int wt = fwrite(buf, 1, size, f);
  126.     fclose(f);
  127.  
  128.     return wt;
  129. }
  130.  
  131. int main(int argc, char *argv[])
  132. {
  133.     int count = 0;
  134.  
  135.     static char text_buf[64 * 1024 * 1024];
  136.  
  137.     if (argc < 4) {
  138.         fprintf(stderr, "Usage:\n\t%s seg.bin module_name text_addr\n\n", argv[0]);
  139.         return 1;
  140.     }
  141.  
  142.     int size = ReadFile(argv[1], text_buf, sizeof(text_buf));
  143.  
  144.     uint32_t sce_module_info_offset = 0;
  145.  
  146.     // Get sce_module_info offset
  147.     int i;
  148.     for (i = 0; i < size; i++) {
  149.         if (strcmp((char *)text_buf + i, argv[2]) == 0) {
  150.             sce_module_info_offset = i - 0x4;
  151.             break;
  152.         }
  153.     }
  154.  
  155.     if (sce_module_info_offset == 0)
  156.         return 1;
  157.  
  158.     uint32_t text_addr = strtoul(argv[3], NULL, 16);
  159.  
  160.     SceModuleInfo *mod_info = (SceModuleInfo *)(text_buf + sce_module_info_offset);
  161.  
  162.     printf("- MODULE -\n");
  163.     printf("NAME: %s\n", argv[2]);
  164.     printf("NID: 0x%08X\n", mod_info->nid);
  165.     printf("TEXT_ADDR: 0x%08X\n", text_addr);
  166.     printf("\n\n");
  167.  
  168.     printf("- EXPORTS -\n");
  169.  
  170.     count = 0;
  171.  
  172.     i = mod_info->expTop;
  173.     while (i < mod_info->expBtm) {
  174.         SceExportsTable *export = (SceExportsTable *)(text_buf + i);
  175.  
  176.         if (export->lib_name) {
  177.             char *lib_name = (char *)((uintptr_t)text_buf + (export->lib_name - text_addr));
  178.             uint32_t *nid_table = (uint32_t *)((uintptr_t)text_buf + (export->nid_table - text_addr));
  179.             uint32_t *entry_table = (uint32_t *)((uintptr_t)text_buf + (export->entry_table - text_addr));
  180.  
  181.             printf("    LIBRARY %d:\n", count);
  182.             printf("    NAME: %s\n", lib_name);
  183.             printf("    NID: 0x%08X\n", export->module_nid);
  184.  
  185.             printf("\n");
  186.  
  187.             int j;
  188.             for (j = 0; j < export->num_functions; j++) {
  189.                 printf("      NID %d: 0x%08X\n", j, nid_table[j]);
  190.             }
  191.  
  192.             printf("\n");
  193.  
  194.             count++;
  195.         }
  196.  
  197.         i += export->size;
  198.     }
  199.  
  200.     printf("\n\n");
  201.  
  202.     printf("- IMPORTS -\n");
  203.  
  204.     i = mod_info->impTop;
  205.     while (i < mod_info->impBtm) {
  206.         SceImportsTable3xx import;
  207.         convertToImportsTable3xx((void *)text_buf + i, &import);
  208.  
  209.         if (import.lib_name) {
  210.             char *lib_name = (char *)((uintptr_t)text_buf + (import.lib_name - text_addr));
  211.             uint32_t *nid_table = (uint32_t *)((uintptr_t)text_buf + (import.func_nid_table - text_addr));
  212.             uint32_t *entry_table = (uint32_t *)((uintptr_t)text_buf + (import.func_entry_table - text_addr));
  213.  
  214.             printf("  LIBRARY %d:\n", count);
  215.             printf("    NAME: %s\n", lib_name);
  216.             printf("    NID: 0x%08X\n", import.module_nid);
  217.  
  218.             printf("\n");
  219.  
  220.             int j;
  221.             for (j = 0; j < import.num_functions; j++) {
  222.                 printf("      NID %d: 0x%08X\n", j, nid_table[j]);
  223.             }
  224.  
  225.             printf("\n");
  226.  
  227.             count++;
  228.         }
  229.  
  230.         i += import.size;
  231.     }
  232.  
  233.     return 0;
  234. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement