Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * LV0 Loader (Extractor/Injector) - By : TheUnkn0wn
- */
- #include <Windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- DWORD LoadFile(char* FilePath, char** Output){
- DWORD Size = -1;
- FILE* pFile = fopen(FilePath,"rb");
- if(pFile){
- fseek(pFile,0,SEEK_END);Size = ftell(pFile);rewind(pFile);*Output = (char*)malloc(Size);
- fread(*Output,1,Size,pFile);
- fclose(pFile);
- }
- return Size;
- }
- void SaveFile(char* FileName, void* Data, DWORD Size){
- FILE* pFile = fopen(FileName,"wb");
- fwrite(Data,1,Size,pFile);
- fclose(pFile);
- }
- DWORD FindSignature(BYTE* Data,DWORD DataLen,BYTE* Signature,DWORD SignatureLen){
- for(DWORD Start=0;Start<DataLen;Start++){
- for(DWORD i=0;i<SignatureLen;i++){
- if(Signature[i] != 0xEE){
- if(Data[Start+i] == Signature[i]){
- if(i==SignatureLen-1)return Start;
- }else{
- break;
- }
- }
- }
- }
- return 0;
- }
- unsigned char* LV0;
- DWORD LV0_SIZE;
- //LV1LDR = SIGNATURE + 0x0C
- BYTE lv1ldr_signature[] = {0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};
- //LV2LDR = SIGNATURE - 0x70
- BYTE lv2ldr_signature[] = {0x1F, 0xF0, 0x00, 0x00, 0x09, 0x00, 0x00, 0x01};
- //ISOLDR = SIGNATURE - 0x70
- BYTE isoldr_signature[] = {0x1F, 0xF0, 0x00, 0x00, 0x0A, 0x00, 0x00, 0x01};
- //APPLDR = SIGNATURE - 0x70
- BYTE appldr_signature[] = {0x1F, 0xF0, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x01};
- //SCE
- BYTE SCE_signature[] = {0x53, 0x43, 0x45, 0x00};
- struct LOADER_INFO {
- unsigned char* Address;
- DWORD Size;
- };
- LOADER_INFO GetLoader(int ldr){
- LOADER_INFO ret;
- //Initialize
- ret.Address = 0;
- ret.Size = 0;
- //LV1LDR
- if(ldr == 0){
- DWORD Signature = FindSignature(LV0, LV0_SIZE, lv1ldr_signature, sizeof(lv1ldr_signature));
- if(Signature > 0){
- ret.Address = (unsigned char*)(Signature + 0x0C);
- ret.Size = FindSignature((LV0 + (DWORD)ret.Address) + 1, (LV0_SIZE - (DWORD)ret.Address) - 1, SCE_signature, sizeof(SCE_signature)) + 1;
- }else{
- printf("Error : Could not find LV1LDR!\n");
- return ret;
- }
- //LV2LDR
- }else if(ldr == 1){
- DWORD Signature = FindSignature(LV0, LV0_SIZE, lv2ldr_signature, sizeof(lv2ldr_signature));
- if(Signature > 0){
- ret.Address = (unsigned char*)(Signature - 0x70);
- ret.Size = FindSignature((LV0 + (DWORD)ret.Address + 1), (LV0_SIZE - (DWORD)ret.Address - 1), SCE_signature, sizeof(SCE_signature)) + 1;
- }else{
- printf("Error : Could not find LV2LDR!\n");
- return ret;
- }
- //ISOLDR
- }else if(ldr == 2){
- DWORD Signature = FindSignature(LV0, LV0_SIZE, isoldr_signature, sizeof(isoldr_signature));
- if(Signature > 0){
- ret.Address = (unsigned char*)(Signature - 0x70);
- ret.Size = FindSignature((LV0 + (DWORD)ret.Address + 1), (LV0_SIZE - (DWORD)ret.Address - 1), SCE_signature, sizeof(SCE_signature)) + 1;
- }else{
- printf("Error : Could not find ISOLDR!\n");
- return ret;
- }
- //APPLDR
- }else if(ldr == 3){
- DWORD Signature = FindSignature(LV0, LV0_SIZE, appldr_signature, sizeof(appldr_signature));
- if(Signature > 0){
- ret.Address = (unsigned char*)(Signature - 0x70);
- ret.Size = FindSignature((LV0 + (DWORD)ret.Address + 1), (LV0_SIZE - (DWORD)ret.Address - 1), SCE_signature, sizeof(SCE_signature)) + 1;
- }else{
- printf("Error : Could not find APPLDR!\n");
- return ret;
- }
- }
- return ret;
- }
- void main(int argc, char *argv[]){
- printf("LV0 Loader (Extractor/Injector) v1.0\nBy : TheUnkn0wn\n\n");
- //Extract
- if(argc == 4 && !strcmp(argv[1], "-x")){
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv1") || !strcmp(argv[2], "lv2") || !strcmp(argv[2], "iso") || !strcmp(argv[2], "app")){
- printf("Loading %s...\n\n", argv[3]);
- LV0_SIZE = LoadFile(argv[3], (char**)&LV0);
- if(LV0[0] != 0x7F){
- printf("Error : LV0 MUST be decrypted first!\n\n");
- goto EXIT;
- }
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv1")){
- LOADER_INFO lv1ldr = GetLoader(0);
- if(lv1ldr.Size > 0){
- printf("LV1LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv1ldr.Address, lv1ldr.Size);
- if(LV0[(DWORD)lv1ldr.Address] == 0x53){
- SaveFile("lv1ldr.self", LV0+((DWORD)lv1ldr.Address), lv1ldr.Size);
- }else{
- SaveFile("lv1ldr-enc", LV0+((DWORD)lv1ldr.Address), lv1ldr.Size);
- }
- }
- }
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv2")){
- LOADER_INFO lv2ldr = GetLoader(1);
- if(lv2ldr.Size > 0){
- printf("LV2LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv2ldr.Address, lv2ldr.Size);
- SaveFile("lv2ldr.self", LV0+((DWORD)lv2ldr.Address), lv2ldr.Size);
- }
- }
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "iso")){
- LOADER_INFO isoldr = GetLoader(2);
- if(isoldr.Size > 0){
- printf("ISOLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",isoldr.Address, isoldr.Size);
- SaveFile("isoldr.self", LV0+((DWORD)isoldr.Address), isoldr.Size);
- }
- }
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "app")){
- LOADER_INFO appldr = GetLoader(3);
- if(appldr.Size > 0){
- printf("APPLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",appldr.Address, appldr.Size);
- SaveFile("appldr.self", LV0+((DWORD)appldr.Address), appldr.Size);
- }
- }
- if(LV0)free(LV0);
- }
- //Inject
- }else if(argc == 5 && !strcmp(argv[1], "-i")){
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv1") || !strcmp(argv[2], "lv2") || !strcmp(argv[2], "iso") || !strcmp(argv[2], "app")){
- printf("Loading %s...\n\n", argv[3]);
- LV0_SIZE = LoadFile(argv[3], (char**)&LV0);
- if(LV0[0] != 0x7F){
- printf("Error : LV0 MUST be decrypted first!\n\n");
- goto EXIT;
- }
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv1")){
- LOADER_INFO lv1ldr = GetLoader(0);
- if(lv1ldr.Size > 0){
- printf("LV1LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv1ldr.Address, lv1ldr.Size);
- unsigned char* LV1LDR;
- DWORD LV1LDR_SIZE = LoadFile("lv1ldr-enc", (char**)&LV1LDR);
- if(LV1LDR_SIZE <= lv1ldr.Size){
- printf("Injecting LV1LDR...\n");
- memset(LV0+((DWORD)lv1ldr.Address), 0x00, lv1ldr.Size);
- memcpy(LV0+((DWORD)lv1ldr.Address), LV1LDR, LV1LDR_SIZE);
- }else{
- printf("Error : LV1LDR too big!\n\n");
- }
- }
- }
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "lv2")){
- LOADER_INFO lv2ldr = GetLoader(1);
- if(lv2ldr.Size > 0){
- printf("LV2LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv2ldr.Address, lv2ldr.Size);
- unsigned char* LV2LDR;
- DWORD LV2LDR_SIZE = LoadFile("lv2ldr.self", (char**)&LV2LDR);
- if(LV2LDR_SIZE <= lv2ldr.Size){
- printf("Injecting LV2LDR...\n");
- memset(LV0+((DWORD)lv2ldr.Address), 0x00, lv2ldr.Size);
- memcpy(LV0+((DWORD)lv2ldr.Address), LV2LDR, LV2LDR_SIZE);
- }else{
- printf("Error : LV2LDR too big!\n\n");
- }
- }
- }
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "iso")){
- LOADER_INFO isoldr = GetLoader(2);
- if(isoldr.Size > 0){
- printf("ISOLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",isoldr.Address, isoldr.Size);
- unsigned char* ISOLDR;
- DWORD ISOLDR_SIZE = LoadFile("isoldr.self", (char**)&ISOLDR);
- if(ISOLDR_SIZE <= isoldr.Size){
- printf("Injecting ISOLDR...\n");
- memset(LV0+((DWORD)isoldr.Address), 0x00, isoldr.Size);
- memcpy(LV0+((DWORD)isoldr.Address), ISOLDR, ISOLDR_SIZE);
- }else{
- printf("Error : ISOLDR too big!\n\n");
- }
- }
- }
- if(!strcmp(argv[2], "all") || !strcmp(argv[2], "app")){
- LOADER_INFO appldr = GetLoader(3);
- if(appldr.Size > 0){
- printf("APPLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",appldr.Address, appldr.Size);
- unsigned char* APPLDR;
- DWORD APPLDR_SIZE = LoadFile("appldr.self", (char**)&APPLDR);
- if(APPLDR_SIZE <= appldr.Size){
- printf("Injecting APPLDR...\n");
- memset(LV0+((DWORD)appldr.Address), 0x00, appldr.Size);
- memcpy(LV0+((DWORD)appldr.Address), APPLDR, APPLDR_SIZE);
- }else{
- printf("Error : APPLDR too big!\n\n");
- }
- }
- }
- SaveFile(argv[4], LV0, LV0_SIZE);
- if(LV0)free(LV0);
- }
- //View
- }else if(argc == 3 && !strcmp(argv[1], "-v")){
- printf("Loading %s...\n\n", argv[2]);
- LV0_SIZE = LoadFile(argv[2], (char**)&LV0);
- if(LV0[0] != 0x7F){
- printf("Error : LV0 MUST be decrypted first!\n\n");
- goto EXIT;
- }
- LOADER_INFO lv1ldr = GetLoader(0);
- if(lv1ldr.Size > 0){
- printf("LV1LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv1ldr.Address, lv1ldr.Size);
- }
- LOADER_INFO lv2ldr = GetLoader(1);
- if(lv2ldr.Size > 0){
- printf("LV2LDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",lv2ldr.Address, lv2ldr.Size);
- }
- LOADER_INFO isoldr = GetLoader(2);
- if(isoldr.Size > 0){
- printf("ISOLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",isoldr.Address, isoldr.Size);
- }
- LOADER_INFO appldr = GetLoader(3);
- if(appldr.Size > 0){
- printf("APPLDR\nAddress : 0x%08X\nSize : %d Bytes\n\n",appldr.Address, appldr.Size);
- }
- if(LV0)free(LV0);
- }else{
- 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");
- }
- EXIT:
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement