PS3 Edit "The Legend of Korra"'s EBOOT for ISO version

I'm always getting NullPointerException:

Code:
> Error running script: AnalyzePs3Binary.java
java.lang.NullPointerException
at Ps3ElfUtils.parseSections(Ps3ElfUtils.java:124)

I used gradle to compile the Ps3GhidraScripts, and installed the zip created on "dist" folder as an extension.
I also added <register name="r2"/> to the <unaffected> list.

When I open the EBOOT.ELF, I always answer "no" to auto analyze, and execute the script "AnalyzePS3Binary.java" from script manager. Am I doing something wrong?
 
Inll just copy / paste what inwrote to arch in pm.

Download the release https://github.com/clienthax/Ps3Ghi...ra_9.2.4_PUBLIC_20210608_Ps3GhidraScripts.zip

Launch ghidra, goto File and select install extension, select the zip. Reboot, it's ready.
Di like it's desceibe in the readme of ghithub.

Then search where is used cellgamebootpermit to find the patch

For cpk/edat patch, go to string tab and search where edat or cpk is used


click on windows>script manager or you also have the button : green circle with a white triangle inside
From there, launch the scripts AnalyzePs3Binary.java

You can also ask google like I did. Most of time, I found answers on tutorial on google/youtube. You won't learn lot of stuff if you don't know how to search :p

2C 03 00 02 cmpwi r3,0x2

I knew i had to change 0x2 but i wasn't sure, how it would impact in the binary. Then i discovered i could modify the code on ghidra directly the decompiled funtion and binary will be updated. (It was an eureka moment for me lol).
How i did : right click on cmpwi r3,0x2 and select 'patch instruction' there you'll be able to change the value and then look at the decompiled function if it's what's you want, if yes then you have your patch by watching what changed in binary


@Arch91 i'll answer here now it may help someone else too
 
Inll just copy / paste what inwrote to arch in pm.
Then Inll just correct you)) And add some details.
Then search where is used cellgamebootpermit to find the patch
I think you made a mistake, not cellgamebootpermit, but cellGameBootCheck (it might be you united cellGameBootCheck and cellGameContentPermit in your mind at the moment of time you were writting that). These should be checked when search program text :
Listing Display
Loaded Blocks
Comments
Instruction Operands
I was not analizing .edat .cpk case.

The offsets you are seeing in the ghidra table are not the same offsets you would see in the HEX-representation of the file. To see that kind of offsets, highlight the offset in the ghidra table and you'll see the additional info with that. The HEX-values to the right are the contents of that offset. They are corresponding to the operands and the instruction to the more right.

By the way, Zar, were you investigating the odd case with an intros are pause-dashings and why they can not be skipped? When used regps3iso only.
ghidra_9.2.4_PUBLIC_20210608_Ps3GhidraScripts.zip
not found
It might be a case when you are living in the country which some other country just do not like by some odd reason... Like my case... In other words, use VPN.
how do you found the correct offsets to edit on eboot? I'll try to do the same with other games I have.
I wanted to ask - which games you are interested in rebuilding to iso?
 
Last edited:
By the way, Zar, were you investigating the odd case with an intros are pause-dashings and why they can not be skipped? When used regps3iso only.

Not, yet. I'm on my phone most of the time, and i don't have access tonmy computer. That's why I'm not really accurate in my explanations, I wrote what I remember. (like the mistake with cellgame function).
Also, I have an idea but i'm not sure if it's going to work... It need some test :)

And I think the best thing will be to modify directly makeps3iso to build iso like genps3iso, which mean setting properly the plain region and 32 sector aglign on encrypted files. I already forked the project, and started to read how it works, but I didn't understand everything, yet.
Next step is to support ird files...

With all this done, I think makeps3iso will be better than genps3iso :)
 
Not, yet. I'm on my phone most of the time, and i don't have access tonmy computer. That's why I'm not really accurate in my explanations, I wrote what I remember. (like the mistake with cellgame function).
Also, I have an idea but i'm not sure if it's going to work... It need some test :)

And I think the best thing will be to modify directly makeps3iso to build iso like genps3iso, which mean setting properly the plain region and 32 sector aglign on encrypted files. I already forked the project, and started to read how it works, but I didn't understand everything, yet.
Next step is to support ird files...

With all this done, I think makeps3iso will be better than genps3iso :)
I wonder if it would be worth the effort to add the ability to create encrypted ISOs into makeps3iso? I only know of a single project which is able to do that (though, of course, there may be more): https://github.com/al3xtjames/PS3Dec
 
I did it to "inFamous: Festival of Blood", but I think I'll have to patch another offset... When trying to load the ISO on a real PS3, it shows "installing" screen inside the game.... :glee:
 
jcorrea, and others, when you successfully find the offsets and a values to change to, please, share your knowledge! Here or maybe in a standalone new topic. Note the version of the EBOOT (maybe you were using it from the patch), GameID (NPXXYYYYY) and a game title of course.
 
jcorrea, and others, when you successfully find the offsets and a values to change to, please, share your knowledge! Here or maybe in a standalone new topic. Note the version of the EBOOT (maybe you were using it from the patch), GameID (NPXXYYYYY) and a game title of course.
Right, when I end (if I discover how...) to edit the eboot, I will put the offsets here.

About "The Legend of Korra", I opened the eboot on Ghidra, but I didn't understand how the offset "0x41d7cc" is the right value to edit. Because the right value to be edited would be the first argument passed to cellGameBootCheck. Of course editing offset "0x41d7cc" will also work, because the flow changes, forcing it to be executed on the "else" instead of the "if", but some eboots may reference the same value on other segments of code:

Code:
  cellGameBootCheck(&local_130,&local_12c,local_128,auStack280); <--------------- local_130 passed as reference, so it came from inside of this method.
  cellGameContentPermit(auStack280,auStack152);
  DAT_00a62568 = local_128[0];
  if (param_2 == 0) {
    FUN_0065a350(&DAT_00a62258,param_1);
  }
  else {
    FUN_0066df08(&DAT_00a62258,0x104,"%s/data/",auStack152);
    if (local_130 == 2) { //<-------------------------------OFFSET "0x41d7cc" --------------------------------------------------------
      FUN_0066df08(&DAT_00a6235c,0x104,&DAT_007e11a4,&DAT_00a62258);
      DAT_00a62564 = 1;
    }
    else {
      if ((local_12c & 1) != 0) {
        cellGamePatchCheck(local_128,0);
        cellGameContentPermit(auStack280,auStack152);
        FUN_0066df08(&DAT_00a62460,0x104,"%s/data/",auStack152);
      }
    }
  }

Do someone knows from where (offset) the value inside "local_130"came from?
 
Last edited:
jcorrea, if you'll select the next data (which you obtained, yes it is) in the C representation
(local_130 == 2)
you notice that these corresponding operands and instruction will be selected
cmpwi r3,0x2
in the line with the memory offset for ghidra disassembler
0042d7cc
and the HEX-representation of this alike
2c 03 00 02
To see what is the offset it corresponds in EBOOT.ELF, highlight 0042d7cc value and the additional info will appears.

That check - if (local_130 == 2)
why local_130 ? - look at the function above it nearby in the C representation:
cellGameBootCheck(&local_130,&local_12c,local_128,auStack280)
- that is the variable attached to this function. We may suppose that function should check CELL_GAME_GAMETYPE_XXX which are as defined in PS3SDK's sdk_defines.h:
#define CELL_GAME_GAMETYPE_SYS 0
#define CELL_GAME_GAMETYPE_DISC 1
#define CELL_GAME_GAMETYPE_HDD 2
#define CELL_GAME_GAMETYPE_GAMEDATA 3
#define CELL_GAME_GAMETYPE_HOME 4
Why == 2 ? - originally it checks "is it true that local_130 == CELL_GAME_GAMETYPE_HDD ?"
- the answer is "no, please, check local_130 == CELL_GAME_GAMETYPE_DISC instead"
the corresponding definition for the CELL_GAME_GAMETYPE_DISC is 1
so the result for us was
To edit the values from offset 41d7cc - 2c 03 00 02 to 2c 03 00 01
which also means cmpwi r3,0x2 to cmpwi r3,0x1
--------------------------------------------------------------------
I wonder if someone can rewrote the code for the ps2_netemu.elf to it functions like this:
- disable/avoid the encryption/encryption check for the ISO.BIN.EDAT (though, I think no one knows how to create that file without encryption...)
- PS2_classics launchable from the EBOOT.BIN (which is possible will be ps2_netemu.self resigned) from the iso
- launch ISO.BIN.DAT which is inside that iso (so I assume the path for it should also be rethought and edited in ps2_netemu.elf)
So in this imaginable case PS2_classics is launchable from the iso, which means it is working on ODE. I note that for a today I do not know a way to launch PS2 games on PS3 without CFW or without a .rif file which requires the officially gotten act.dat file.
 
Last edited:
  • Like
Reactions: Zar
jcorrea, if you'll select the next data (which you obtained, yes it is) in the C representation
(local_130 == 2)
you notice that these corresponding operands and instruction will be selected
cmpwi r3,0x2
in the line with the memory offset for ghidra disassembler
0042d7cc
and the HEX-representation of this alike
2c 03 00 02
To see what is the offset it corresponds in EBOOT.ELF, highlight 0042d7cc value and the additional info will appears.

That check - if (local_130 == 2)
why local_130 ? - look at the function above it nearby in the C representation:
cellGameBootCheck(&local_130,&local_12c,local_128,auStack280)
- that is the variable attached to this function. We may suppose that function should check CELL_GAME_GAMETYPE_XXX which are as defined in PS3SDK's sdk_defines.h:
#define CELL_GAME_GAMETYPE_SYS 0
#define CELL_GAME_GAMETYPE_DISC 1
#define CELL_GAME_GAMETYPE_HDD 2
#define CELL_GAME_GAMETYPE_GAMEDATA 3
#define CELL_GAME_GAMETYPE_HOME 4
Why == 2 ? - originally it checks "is it true that local_130 == CELL_GAME_GAMETYPE_HDD ?"
- the answer is "no, please, check local_130 == CELL_GAME_GAMETYPE_DISC instead"
the corresponding definition for the CELL_GAME_GAMETYPE_DISC is 1
so the result for us was
To edit the values from offset 41d7cc - 2c 03 00 02 to 2c 03 00 01
which also means cmpwi r3,0x2 to cmpwi r3,0x1
I understood this, but the return value to "local_130" is always the same: "2". So when it is compared with "2", it's true. But editing the offset 0042d7cc to "1" changes the application flow, because "2" (inside "local_130") is different from "1" and it will execute the "else" statement.
 
if (local_130 == 2) is true in case CELL_GAME_GAMETYPE_HDD
if (local_130 == 1) is true in case CELL_GAME_GAMETYPE_DISC
that is the purpose of the function cellGameBootCheck - to check CELL_GAME_GAMETYPE_XXX which will be returning to this local_130 in this case.
 
  • Like
Reactions: Zar
if (local_130 == 2) is true in case CELL_GAME_GAMETYPE_HDD
if (local_130 == 1) is true in case CELL_GAME_GAMETYPE_DISC
that is the purpose of the function cellGameBootCheck - to check CELL_GAME_GAMETYPE_XXX which will be returning to this local_130 in this case.
cellGameBootCheck is always filling the "local_130" with 2 (CELL_GAME_GAMETYPE_HDD). Changing offset 0042d7cc don't change the value of "local_130", but only the comparisson.
 
Even if you'll change the category in PARAM.SFO
from HG Harddrive Game
to DG Disc Game (blueray)
?)
Since the game is rebuilt to iso, to disc type, it is CELL_GAME_GAMETYPE_HDD nomore.
 
  • Like
Reactions: Zar
Even if you'll change the category in PARAM.SFO
from HG Harddrive Game
to DG Disc Game (blueray)
?)
Since the game is rebuilt to iso, to disc type, it is CELL_GAME_GAMETYPE_HDD nomore.
Oh, sorry, I totally forgot about the PARAM.SFO. You are right.
 
About ps2netemu, I already planned to work on it but for something COMPLETLY different. When I'll work on it, i'll try to not forget to look if I can find the patch you talked about...
 
This game just s**** (inFamous: Festival of Blood), it writes files (cache) on execution time on game folder. I found a clue that there is a way to disable cache, I'm just checking it out right now...
 
  • Like
Reactions: Zar
About ps2netemu, I already planned to work on it but for something COMPLETLY different. When I'll work on it, i'll try to not forget to look if I can find the patch you talked about...
Yes, thanks, that would be nice.
--------------------------------
I opened the EBOOT.ELF of CS:GO... It seems that that game just is not supposed to be rebuilt into nothing but HDD game type.
Code:
undefined8 FUN_00012538(longlong param_1,ulonglong param_2)

{
  undefined8 uVar1;
  undefined8 uVar2;
  int iVar3;
  char *pcVar4;
  char *__s1;
  char *__s;
  undefined *puVar5;
  undefined4 local_520;
  undefined4 local_51c;
  undefined4 local_518;
  undefined4 local_514;
  undefined4 local_510;
  undefined4 local_50c;
  undefined auStack1288 [32];
  undefined auStack1256 [1064];
  undefined local_c0;
  undefined auStack191 [31];
  undefined8 local_a0;
 
  if (*(char *)(param_1 + 0xc70) != '\0') {
    FUN_000124c0("CPs3ContentPathInfo is being initialized twice!\n");
  }
  uVar1 = cellSysmoduleLoadModule(0x16);
  if ((int)uVar1 == 0) {
    local_a0 = cellSysmoduleIsLoaded(0x3e);
    if ((int)local_a0 == 0) {
      FUN_000124c0(
                  "The SYSUTIL_GAME module is already loaded -- revist load order logic in CPs3ContentPathInfo::Init()\n"
                  );
    }
    else {
      uVar1 = cellSysmoduleLoadModule(0x3e);
      if ((int)uVar1 != 0) {
        uVar2 = FUN_00012398(uVar1,0xa0000);
        FUN_000124c0("Failed to load sysutil_game: %s\n",uVar2);
        return uVar1;
      }
    }
    local_520 = 0;
    local_51c = 0;
    local_518 = 0;
    local_c0 = 0;
    sys_libc_0xA7E9EA47(auStack191,0,0x1f);
    uVar1 = cellGameBootCheck(param_1 + 0xc64,param_1 + 0xc68,&local_520,&local_c0);
    if ((int)uVar1 == 0) {
      *(undefined *)(param_1 + 0xc70) = 1;
      *(undefined4 *)(param_1 + 0xc6c) = local_520;
      __s1 = (char *)(param_1 + 0x1a4);
      pcVar4 = (char *)(param_1 + 0xa4);
      if ((param_2 & 1) == 0) {
        uVar1 = cellGameGetParamString(0,param_1,0x80);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_TITLE )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamString(100,param_1 + 0x80,10);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_TITLE_ID )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamString(0x6a,param_1 + 0x8a,6);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_APP_VER )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamInt(0x66,param_1 + 0x98);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_PARENTAL_LEVEL )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamInt(0x67,param_1 + 0x9c);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_RESOLUTION )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamInt(0x68,param_1 + 0xa0);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_SOUND_FORMAT )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameContentPermit(pcVar4,__s1);
        if (((*(uint *)(param_1 + 0xc68) & 4) != 0) &&
           (iVar3 = strncmp(__s1,"/app_home",9), iVar3 == 0)) {
          snprintf(pcVar4,0x7f,"/app_home/PS3_GAME");
          snprintf(__s1,0x7f,"/app_home/PS3_GAME/USRDIR");
        }
      }
      else {
        if (*(int *)(param_1 + 0xc64) != 2) {
          FUN_000124c0("Unsupported boot in RETAIL mode! (bootmode=%d)\n",*(int *)(param_1 + 0xc64))
          ;
          return 0xffffffffffffffff;
        }
        uVar1 = cellGameGetParamString(0,param_1,0x80);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_TITLE )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamString(100,param_1 + 0x80,10);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_TITLE_ID )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamString(0x6a,param_1 + 0x8a,6);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_APP_VER )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamInt(0x66,param_1 + 0x98);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_PARENTAL_LEVEL )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamInt(0x67,param_1 + 0x9c);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_RESOLUTION )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamInt(0x68,param_1 + 0xa0);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1);
          FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_SOUND_FORMAT )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameContentPermit(pcVar4,__s1);
        if ((int)uVar1 != 0) {
          uVar2 = FUN_00012398(uVar1,0xa0000);
          FUN_000124c0("cellGameContentPermit failed (line %d, code %d): %s\n",0xe0,uVar1,uVar2);
          return uVar1;
        }
        iVar3 = *(int *)(param_1 + 0xc64);
        if (iVar3 != 2) {
          puVar5 = (undefined *)0x0;
          if (iVar3 == 2) {
            puVar5 = &local_c0;
          }
          uVar1 = cellGameDataCheck(iVar3,puVar5,&local_520);
          if ((int)uVar1 != 0) {
            uVar2 = FUN_00012398(uVar1,0xa0000);
            FUN_000124c0("cellGameDataCheck failed (line %d, code %d): %s\n",0xfb,uVar1,uVar2);
            return uVar1;
          }
          uVar1 = cellGameGetParamString(0,param_1,0x80);
          if ((int)uVar1 < 0) {
            uVar2 = FUN_00012398(uVar1);
            FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_TITLE )",uVar2);
            return uVar1;
          }
          uVar1 = cellGameGetParamString(100,param_1 + 0x80,10);
          if ((int)uVar1 < 0) {
            uVar2 = FUN_00012398(uVar1);
            FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_TITLE_ID )",uVar2);
            return uVar1;
          }
          uVar1 = cellGameGetParamString(0x6a,param_1 + 0x8a,6);
          if ((int)uVar1 < 0) {
            uVar2 = FUN_00012398(uVar1);
            FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_APP_VER )",uVar2);
            return uVar1;
          }
          uVar1 = cellGameGetParamInt(0x66,param_1 + 0x98);
          if ((int)uVar1 < 0) {
            uVar2 = FUN_00012398(uVar1);
            FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_PARENTAL_LEVEL )",uVar2);
            return uVar1;
          }
          uVar1 = cellGameGetParamInt(0x67,param_1 + 0x9c);
          if ((int)uVar1 < 0) {
            uVar2 = FUN_00012398(uVar1);
            FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_RESOLUTION )",uVar2);
            return uVar1;
          }
          uVar1 = cellGameGetParamInt(0x68,param_1 + 0xa0);
          if ((int)uVar1 < 0) {
            uVar2 = FUN_00012398(uVar1);
            FUN_000124c0("%s: %s\n","PARAM.SFO getParam( CELL_GAME_PARAMID_SOUND_FORMAT )",uVar2);
            return uVar1;
          }
          uVar1 = cellGameContentPermit(pcVar4,__s1);
        }
      }
      if ((*(uint *)(param_1 + 0xc68) & 1) != 0) {
        local_514 = 0;
        local_510 = 0;
        local_50c = 0;
        uVar1 = cellGamePatchCheck(&local_514,0);
        if ((int)uVar1 != 0) {
          uVar2 = FUN_00012398(uVar1,0xa0000);
          FUN_000124c0("cellGamePatchCheck failed (line %d, code %d): %s\n",0x113,uVar1,uVar2);
          return uVar1;
        }
        uVar1 = cellGameGetParamString(0x6a,param_1 + 0x90,6);
        if ((int)uVar1 < 0) {
          uVar2 = FUN_00012398(uVar1,0xa0000);
          FUN_000124c0("%s: %s\n","PARAM.SFO PATCH getParam( CELL_GAME_PARAMID_APP_VER )",uVar2);
          return uVar1;
        }
        uVar1 = cellGameContentPermit(param_1 + 0x124,param_1 + 0x224);
      }
      __s = (char *)(param_1 + 0x324);
      pcVar4 = __s1;
      if (*(int *)(param_1 + 0xc64) != 2) {
        pcVar4 = "/hddpath/invalid";
      }
      snprintf(__s,0x80,pcVar4);
      if (-1 < (int)uVar1) {
        sys_libc_0xA7E9EA47(auStack1288,0,0x444);
        memcpy(auStack1288,"NPUB30589",10);
        uVar1 = cellSysCacheMount(auStack1288);
        if ((-1 < (int)uVar1) &&
           (memcpy((void *)(param_1 + 0x424),auStack1256,0x41f), (param_2 & 0x80) != 0)) {
          cellSysCacheClear();
        }
      }
      pcVar4 = (char *)(param_1 + 0x3a4);
      snprintf(pcVar4,0x80,__s1);
      if ((param_2 & 8) == 0) {
        if ((param_2 & 4) == 0) {
          if ((param_2 & 2) != 0) {
            snprintf(pcVar4,0x80,"/dev_bdvd/PS3_GAME/USRDIR");
          }
        }
        else {
          snprintf(pcVar4,0x80,__s);
        }
      }
      else {
        snprintf(pcVar4,0x80,"/app_home/PS3_GAME/USRDIR");
      }
      pcVar4 = (char *)(param_1 + 0x2a4);
      snprintf(pcVar4,0x80,"%s/bin",__s1);
      if ((param_2 & 0x40) == 0) {
        if ((param_2 & 0x20) == 0) {
          if ((param_2 & 0x10) != 0) {
            snprintf(pcVar4,0x80,"/dev_bdvd/PS3_GAME/USRDIR/bin");
          }
        }
        else {
          snprintf(pcVar4,0x80,"%s/bin",__s);
        }
      }
      else {
        snprintf(pcVar4,0x80,"/app_home/PS3_GAME/USRDIR/bin");
      }
      sys_libc_0xBDA4DCF0((char *)(param_1 + 0x843),param_1 + 0x424,0x41f);
      strncat((char *)(param_1 + 0x843),"/tempsave/",0x41f);
      if ((int)local_a0 != 0) {
        cellSysmoduleUnloadModule(0x3e);
      }
    }
    else {
      uVar2 = FUN_00012398(uVar1,0xa0000);
      FUN_000124c0("cellGameBootCheck failed (line %d, code %d): %s\n",0x8b,uVar1,uVar2);
    }
  }
  else {
    uVar2 = FUN_00012398(uVar1,0xa0000);
    FUN_000124c0("Failed to load sysutil_np: %s\n",uVar2);
  }
  return uVar1;
}
Those lines:
if (*(int *)(param_1 + 0xc64) != 2) {
FUN_000124c0("Unsupported boot in RETAIL mode! (bootmode=%d)\n",*(int *)(param_1 + 0xc64))
- if they are here then I think the developers thought out the game rebuilt as to deprecate that. I tried to change !=2 to !=1, that case the system is trying to search for the non-existing files... So, looks like this game is doomed to exist in it's HDD type only :/
I am starting to think that the case with the Korra's EBOOT is just a single one...
--------------------------------------
Juast was wondering and had a free moment - tried to rebuild "InFamous: Festival of Blood" NPEA00322 into iso. There is no need in it's EBOOT edit, it simply rebuilds. It even functionals like a standalone BD game (without the needence in the original pkg's data presence in /dev_hdd0/, it is independable). Tested either in emulator and on my console device, passing to the moment after the videos when I could control a character. So, jcorrea, If you were trusting the rebuild proccess to some third program like psnliberator, it's time to have a doubt in it)
 
Last edited:
Back
Top