Advertisement
Guest User

LV0

a guest
Jul 10th, 2013
112
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.31 KB | None | 0 0
  1. /*
  2.  * LV0 Loader (Extractor/Injector) - By : TheUnkn0wn
  3.  */
  4.  
  5. #include <Windows.h>
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8.  
  9. DWORD LoadFile(char* FilePath, char** Output){
  10. DWORD Size = -1;
  11.     FILE* pFile = fopen(FilePath,"rb");
  12.         if(pFile){
  13.             fseek(pFile,0,SEEK_END);Size = ftell(pFile);rewind(pFile);*Output = (char*)malloc(Size);
  14.             fread(*Output,1,Size,pFile);
  15.             fclose(pFile);
  16.         }
  17. return Size;
  18. }
  19.  
  20. void SaveFile(char* FileName, void* Data, DWORD Size){
  21.     FILE* pFile = fopen(FileName,"wb");
  22.         fwrite(Data,1,Size,pFile);
  23.     fclose(pFile);
  24. }
  25.  
  26. DWORD FindSignature(BYTE* Data,DWORD DataLen,BYTE* Signature,DWORD SignatureLen){
  27.     for(DWORD Start=0;Start<DataLen;Start++){
  28.         for(DWORD i=0;i<SignatureLen;i++){
  29.             if(Signature[i] != 0xEE){
  30.                 if(Data[Start+i] == Signature[i]){
  31.                     if(i==SignatureLen-1)return Start;
  32.                 }else{
  33.                     break;
  34.                 }
  35.             }
  36.         }
  37.     }
  38. return 0;
  39. }
  40.  
  41. unsigned char* LV0;
  42. DWORD LV0_SIZE;
  43.  
  44. //LV1LDR = SIGNATURE + 0x0C
  45. BYTE lv1ldr_signature[] = {0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
  46.  
  47. //LV2LDR = SIGNATURE - 0x70
  48. BYTE lv2ldr_signature[] = {0x1F, 0xF0, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01};
  49.  
  50. //ISOLDR = SIGNATURE - 0x70
  51. BYTE isoldr_signature[] = {0x1F, 0xF0, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x01};
  52.  
  53. //APPLDR = SIGNATURE - 0x70
  54. BYTE appldr_signature[] = {0x1F, 0xF0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x01};
  55.  
  56. //SCE
  57. BYTE SCE_signature[] = {0x53, 0x43, 0x45, 0x00};
  58.  
  59. struct LOADER_INFO {
  60.     unsigned char* Address;
  61.     DWORD Size;
  62. };
  63.  
  64. LOADER_INFO GetLoader(int ldr){
  65.  
  66.     LOADER_INFO ret;
  67.  
  68.     //Initialize
  69.     ret.Address = 0;
  70.     ret.Size = 0;
  71.  
  72.         //LV1LDR
  73.         if(ldr == 0){
  74.             DWORD Signature = FindSignature(LV0, LV0_SIZE, lv1ldr_signature, sizeof(lv1ldr_signature));
  75.                 if(Signature > 0){
  76.                     ret.Address = (unsigned char*)(Signature + 0x0C);
  77.                     ret.Size = FindSignature((LV0 + (DWORD)ret.Address) + 1, (LV0_SIZE - (DWORD)ret.Address) - 1, SCE_signature, sizeof(SCE_signature)) + 1;
  78.                 }else{
  79.                     printf("Error : Could not find LV1LDR!\n");
  80.                     return ret;
  81.                 }
  82.  
  83.         //LV2LDR
  84.         }else if(ldr == 1){
  85.             DWORD Signature = FindSignature(LV0, LV0_SIZE, lv2ldr_signature, sizeof(lv2ldr_signature));
  86.                 if(Signature > 0){
  87.                     ret.Address = (unsigned char*)(Signature - 0x70);
  88.                     ret.Size = FindSignature((LV0 + (DWORD)ret.Address + 1), (LV0_SIZE - (DWORD)ret.Address - 1), SCE_signature, sizeof(SCE_signature)) + 1;
  89.                 }else{
  90.                     printf("Error : Could not find LV2LDR!\n");
  91.                     return ret;
  92.                 }
  93.  
  94.         //ISOLDR
  95.         }else if(ldr == 2){
  96.             DWORD Signature = FindSignature(LV0, LV0_SIZE, isoldr_signature, sizeof(isoldr_signature));
  97.                 if(Signature > 0){
  98.                     ret.Address = (unsigned char*)(Signature - 0x70);
  99.                     ret.Size = FindSignature((LV0 + (DWORD)ret.Address + 1), (LV0_SIZE - (DWORD)ret.Address - 1), SCE_signature, sizeof(SCE_signature)) + 1;
  100.                 }else{
  101.                     printf("Error : Could not find ISOLDR!\n");
  102.                     return ret;
  103.                 }
  104.  
  105.         //APPLDR
  106.         }else if(ldr == 3){
  107.             DWORD Signature = FindSignature(LV0, LV0_SIZE, appldr_signature, sizeof(appldr_signature));
  108.                 if(Signature > 0){
  109.                     ret.Address = (unsigned char*)(Signature - 0x70);
  110.                     ret.Size = FindSignature((LV0 + (DWORD)ret.Address + 1), (LV0_SIZE - (DWORD)ret.Address - 1), SCE_signature, sizeof(SCE_signature)) + 1;
  111.                 }else{
  112.                     printf("Error : Could not find APPLDR!\n");
  113.                     return ret;
  114.                 }
  115.         }
  116.  
  117.     return ret;
  118. }
  119.  
  120. void main(int argc, char *argv[]){
  121.  
  122.     printf("LV0 Loader (Extractor/Injector) v1.0\nBy : TheUnkn0wn\n\n");
  123.  
  124.     //Extract
  125.     if(argc == 4 && !strcmp(argv[1], "-x")){
  126.  
  127.         if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv1") || !strcmp(argv[2], "lv2") || !strcmp(argv[2], "iso") || !strcmp(argv[2], "app")){
  128.  
  129.             printf("Loading %s...\n\n", argv[3]);
  130.             LV0_SIZE = LoadFile(argv[3], (char**)&LV0);
  131.                 if(LV0[0] != 0x7F){
  132.                     printf("Error : LV0 MUST be decrypted first!\n\n");
  133.                     goto EXIT;
  134.                 }
  135.  
  136.             if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv1")){
  137.                 LOADER_INFO lv1ldr = GetLoader(0);
  138.                     if(lv1ldr.Size > 0){
  139.                         printf("LV1LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv1ldr.Address, lv1ldr.Size);
  140.                             if(LV0[(DWORD)lv1ldr.Address] == 0x53){
  141.                                 SaveFile("lv1ldr.self", LV0+((DWORD)lv1ldr.Address), lv1ldr.Size);
  142.                             }else{
  143.                                 SaveFile("lv1ldr-enc", LV0+((DWORD)lv1ldr.Address), lv1ldr.Size);
  144.                             }
  145.                     }
  146.             }
  147.  
  148.             if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv2")){
  149.                 LOADER_INFO lv2ldr = GetLoader(1);
  150.                     if(lv2ldr.Size > 0){
  151.                         printf("LV2LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv2ldr.Address, lv2ldr.Size);
  152.                         SaveFile("lv2ldr.self", LV0+((DWORD)lv2ldr.Address), lv2ldr.Size);
  153.                     }
  154.             }
  155.  
  156.             if(!strcmp(argv[2], "all") || !strcmp(argv[2], "iso")){
  157.                 LOADER_INFO isoldr = GetLoader(2);
  158.                     if(isoldr.Size > 0){
  159.                         printf("ISOLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",isoldr.Address, isoldr.Size);
  160.                         SaveFile("isoldr.self", LV0+((DWORD)isoldr.Address), isoldr.Size);
  161.                     }
  162.             }
  163.  
  164.             if(!strcmp(argv[2], "all") || !strcmp(argv[2], "app")){
  165.                 LOADER_INFO appldr = GetLoader(3);
  166.                     if(appldr.Size > 0){
  167.                         printf("APPLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",appldr.Address, appldr.Size);
  168.                         SaveFile("appldr.self", LV0+((DWORD)appldr.Address), appldr.Size);
  169.                     }
  170.             }
  171.  
  172.             if(LV0)free(LV0);
  173.  
  174.         }
  175.  
  176.     //Inject
  177.     }else if(argc == 5 && !strcmp(argv[1], "-i")){
  178.  
  179.         if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv1") || !strcmp(argv[2], "lv2") || !strcmp(argv[2], "iso") || !strcmp(argv[2], "app")){
  180.  
  181.             printf("Loading %s...\n\n", argv[3]);
  182.             LV0_SIZE = LoadFile(argv[3], (char**)&LV0);
  183.                 if(LV0[0] != 0x7F){
  184.                     printf("Error : LV0 MUST be decrypted first!\n\n");
  185.                     goto EXIT;
  186.                 }
  187.  
  188.                 if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv1")){
  189.                     LOADER_INFO lv1ldr = GetLoader(0);
  190.                         if(lv1ldr.Size > 0){
  191.                             printf("LV1LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv1ldr.Address, lv1ldr.Size);
  192.  
  193.                             unsigned char* LV1LDR;
  194.                             DWORD LV1LDR_SIZE = LoadFile("lv1ldr-enc", (char**)&LV1LDR);
  195.  
  196.                                 if(LV1LDR_SIZE <= lv1ldr.Size){
  197.                                     printf("Injecting LV1LDR...\n");
  198.                                     memset(LV0+((DWORD)lv1ldr.Address), 0x00, lv1ldr.Size);
  199.                                     memcpy(LV0+((DWORD)lv1ldr.Address), LV1LDR, LV1LDR_SIZE);
  200.                                 }else{
  201.                                     printf("Error : LV1LDR too big!\n\n");
  202.                                 }
  203.                         }
  204.                 }
  205.  
  206.                 if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv2")){
  207.                     LOADER_INFO lv2ldr = GetLoader(1);
  208.                         if(lv2ldr.Size > 0){
  209.                             printf("LV2LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv2ldr.Address, lv2ldr.Size);
  210.                            
  211.                             unsigned char* LV2LDR;
  212.                             DWORD LV2LDR_SIZE = LoadFile("lv2ldr.self", (char**)&LV2LDR);
  213.  
  214.                                 if(LV2LDR_SIZE <= lv2ldr.Size){
  215.                                     printf("Injecting LV2LDR...\n");
  216.                                     memset(LV0+((DWORD)lv2ldr.Address), 0x00, lv2ldr.Size);
  217.                                     memcpy(LV0+((DWORD)lv2ldr.Address), LV2LDR, LV2LDR_SIZE);
  218.                                 }else{
  219.                                     printf("Error : LV2LDR too big!\n\n");
  220.                                 }
  221.                         }
  222.                 }
  223.  
  224.                 if(!strcmp(argv[2], "all") || !strcmp(argv[2], "iso")){
  225.                     LOADER_INFO isoldr = GetLoader(2);
  226.                         if(isoldr.Size > 0){
  227.                             printf("ISOLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",isoldr.Address, isoldr.Size);
  228.  
  229.                             unsigned char* ISOLDR;
  230.                             DWORD ISOLDR_SIZE = LoadFile("isoldr.self", (char**)&ISOLDR);
  231.  
  232.                                 if(ISOLDR_SIZE <= isoldr.Size){
  233.                                     printf("Injecting ISOLDR...\n");
  234.                                     memset(LV0+((DWORD)isoldr.Address), 0x00, isoldr.Size);
  235.                                     memcpy(LV0+((DWORD)isoldr.Address), ISOLDR, ISOLDR_SIZE);
  236.                                 }else{
  237.                                     printf("Error : ISOLDR too big!\n\n");
  238.                                 }
  239.                         }
  240.                 }
  241.  
  242.                 if(!strcmp(argv[2], "all") || !strcmp(argv[2], "app")){
  243.                     LOADER_INFO appldr = GetLoader(3);
  244.                         if(appldr.Size > 0){
  245.                             printf("APPLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",appldr.Address, appldr.Size);
  246.  
  247.                             unsigned char* APPLDR;
  248.                             DWORD APPLDR_SIZE = LoadFile("appldr.self", (char**)&APPLDR);
  249.  
  250.                                 if(APPLDR_SIZE <= appldr.Size){
  251.                                     printf("Injecting APPLDR...\n");
  252.                                     memset(LV0+((DWORD)appldr.Address), 0x00, appldr.Size);
  253.                                     memcpy(LV0+((DWORD)appldr.Address), APPLDR, APPLDR_SIZE);
  254.                                 }else{
  255.                                     printf("Error : APPLDR too big!\n\n");
  256.                                 }
  257.                         }
  258.                 }
  259.  
  260.             SaveFile(argv[4], LV0, LV0_SIZE);
  261.  
  262.             if(LV0)free(LV0);
  263.         }
  264.  
  265.     //View
  266.     }else if(argc == 3 && !strcmp(argv[1], "-v")){
  267.  
  268.             printf("Loading %s...\n\n", argv[2]);
  269.             LV0_SIZE = LoadFile(argv[2], (char**)&LV0);
  270.                 if(LV0[0] != 0x7F){
  271.                     printf("Error : LV0 MUST be decrypted first!\n\n");
  272.                     goto EXIT;
  273.                 }
  274.  
  275.             LOADER_INFO lv1ldr = GetLoader(0);
  276.                 if(lv1ldr.Size > 0){
  277.                     printf("LV1LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv1ldr.Address, lv1ldr.Size);
  278.                 }
  279.  
  280.             LOADER_INFO lv2ldr = GetLoader(1);
  281.                 if(lv2ldr.Size > 0){
  282.                     printf("LV2LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv2ldr.Address, lv2ldr.Size);
  283.                 }
  284.  
  285.             LOADER_INFO isoldr = GetLoader(2);
  286.                 if(isoldr.Size > 0){
  287.                     printf("ISOLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",isoldr.Address, isoldr.Size);
  288.                 }
  289.  
  290.             LOADER_INFO appldr = GetLoader(3);
  291.                 if(appldr.Size > 0){
  292.                     printf("APPLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",appldr.Address, appldr.Size);
  293.                 }
  294.  
  295.             if(LV0)free(LV0);
  296.     }else{
  297.  
  298.         printf("-x [loader] [lv0] - Extract loaders\n-i [loader] [lv0-in] [lv0-out] - Inject loaders\n-v [lv0] - View loaders\n\nLoaders - all, lv1, lv2, iso, app\n\n");
  299.  
  300.     }
  301.  
  302. EXIT:
  303.     return;
  304. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement