Skip to content

Commit b81f59d

Browse files
committed
Rewrite the LayeredFS pattern searching, small cleanup
1 parent 39c2b89 commit b81f59d

1 file changed

Lines changed: 48 additions & 43 deletions

File tree

injector/source/patcher.c

Lines changed: 48 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -186,17 +186,16 @@ static inline u8 *getCfgOffsets(u8 *code, u32 size, u32 *CFGUHandleOffset)
186186

187187
for(u8 *CFGU_GetConfigInfoBlk2_endPos = code; CFGU_GetConfigInfoBlk2_endPos <= code + size - 12; CFGU_GetConfigInfoBlk2_endPos += 4)
188188
{
189-
static const u32 CFGU_GetConfigInfoBlk2_endPattern[] = {0xE8BD8010, 0x00010082};
190-
191189
//There might be multiple implementations of GetConfigInfoBlk2 but let's search for the one we want
192190
u32 *cmp = (u32 *)CFGU_GetConfigInfoBlk2_endPos;
193191

194-
if(cmp[0] != CFGU_GetConfigInfoBlk2_endPattern[0] || cmp[1] != CFGU_GetConfigInfoBlk2_endPattern[1]) continue;
192+
if(cmp[0] != 0xE8BD8010 || cmp[1] != 0x00010082) continue;
195193

196194
for(u32 i = 0; i < n; i++)
197195
if(possible[i] == cmp[2])
198196
{
199197
*CFGUHandleOffset = cmp[2];
198+
200199
return CFGU_GetConfigInfoBlk2_endPos;
201200
}
202201

@@ -256,14 +255,12 @@ static inline void patchCfgGetRegion(u8 *code, u32 size, u8 regionId, u32 CFGUHa
256255
{
257256
for(u8 *cmdPos = code; cmdPos <= code + size - 28; cmdPos += 4)
258257
{
259-
static const u32 cfgSecureInfoGetRegionCmdPattern[] = {0xEE1D0F70, 0xE3A00802};
260-
261258
u32 *cmp = (u32 *)cmdPos;
262259

263-
if(*cmp != cfgSecureInfoGetRegionCmdPattern[1]) continue;
260+
if(*cmp != 0xE3A00802) continue;
264261

265262
for(u32 i = 1; i < 3; i++)
266-
if((*(cmp - i) & 0xFFFF0FFF) == cfgSecureInfoGetRegionCmdPattern[0] && *((u16 *)cmdPos + 5) == 0xE59F &&
263+
if((*(cmp - i) & 0xFFFF0FFF) == 0xEE1D0F70 && *((u16 *)cmdPos + 5) == 0xE59F &&
267264
*(u32 *)(cmdPos + 16 + *((u16 *)cmdPos + 4)) == CFGUHandleOffset)
268265
{
269266
cmp[3] = 0xE3A00000 | regionId; //mov r0, =regionId
@@ -290,37 +287,45 @@ static u32 findFunctionStart(u8 *code, u32 pos)
290287

291288
static inline bool findLayeredFsSymbols(u8 *code, u32 size, u32 *fsMountArchive, u32 *fsRegisterArchive, u32 *fsTryOpenFile, u32 *fsOpenFileDirectly)
292289
{
290+
u32 found = 0,
291+
*temp = NULL;
292+
293293
for(u32 addr = 0; addr <= size - 4; addr += 4)
294294
{
295-
if(*fsMountArchive == 0xFFFFFFFF)
295+
switch(*(u32 *)(code + addr))
296296
{
297-
if(addr <= size - 12 && *(u32 *)(code + addr) == 0xE5970010)
298-
{
299-
if((*(u32 *)(code + addr + 4) == 0xE1CD20D8) && ((*(u32 *)(code + addr + 8) & 0xFFFFFF) == 0x008D0000))
300-
*fsMountArchive = findFunctionStart(code, addr);
301-
}
302-
else if(addr <= size - 16 && *(u32 *)(code + addr) == 0xE24DD028)
303-
{
304-
if((*(u32 *)(code + addr + 4) == 0xE1A04000) && (*(u32 *)(code + addr + 8) == 0xE59F60A8) && (*(u32 *)(code + addr + 0xC) == 0xE3A0C001))
305-
*fsMountArchive = findFunctionStart(code, addr);
306-
}
297+
case 0xE5970010:
298+
if(addr <= size - 12 && *fsMountArchive == 0xFFFFFFFF && *(u32 *)(code + addr + 4) == 0xE1CD20D8 && (*(u32 *)(code + addr + 8) & 0xFFFFFF) == 0x008D0000) temp = fsMountArchive;
299+
break;
300+
case 0xE24DD028:
301+
if(addr <= size - 16 && *fsMountArchive == 0xFFFFFFFF && *(u32 *)(code + addr + 4) == 0xE1A04000 && *(u32 *)(code + addr + 8) == 0xE59F60A8 && *(u32 *)(code + addr + 0xC) == 0xE3A0C001) temp = fsMountArchive;
302+
break;
303+
case 0xE3500008:
304+
if(addr <= size - 12 && *fsRegisterArchive == 0xFFFFFFFF && (*(u32 *)(code + addr + 4) & 0xFFF00FF0) == 0xE1800400 && (*(u32 *)(code + addr + 8) & 0xFFF00FF0) == 0xE1800FC0) temp = fsRegisterArchive;
305+
break;
306+
case 0xE351003A:
307+
if(addr <= size - 0x40 && *fsTryOpenFile == 0xFFFFFFFF && *(u32 *)(code + addr + 4) == 0x1AFFFFFC && *(u32 *)(code + addr + 0x34) == 0xE590C000 && *(u32 *)(code + addr + 0x3C) == 0xE12FFF3C) temp = fsTryOpenFile;
308+
break;
309+
case 0x08030204:
310+
if(*fsOpenFileDirectly == 0xFFFFFFFF) temp = fsOpenFileDirectly;
311+
break;
307312
}
308313

309-
if(addr <= size - 12 && *fsRegisterArchive == 0xFFFFFFFF && *(u32 *)(code + addr) == 0xE3500008 &&
310-
(*(u32 *)(code + addr + 4) & 0xFFF00FF0) == 0xE1800400 && (*(u32 *)(code + addr + 8) & 0xFFF00FF0) == 0xE1800FC0)
311-
*fsRegisterArchive = findFunctionStart(code, addr);
312-
313-
if(addr <= size - 0x40 && *fsTryOpenFile == 0xFFFFFFFF && *(u32 *)(code + addr + 4) == 0x1AFFFFFC && *(u32 *)(code + addr) == 0xE351003A &&
314-
*(u32 *)(code + addr + 0x34) == 0xE590C000 && *(u32 *)(code + addr + 0x3C) == 0xE12FFF3C)
315-
*fsTryOpenFile = findFunctionStart(code, addr);
314+
if(temp != NULL)
315+
{
316+
*temp = findFunctionStart(code, addr);
316317

317-
if(*fsOpenFileDirectly == 0xFFFFFFFF && *(u32 *)(code + addr) == 0x08030204)
318-
*fsOpenFileDirectly = findFunctionStart(code, addr);
318+
if(*temp != 0xFFFFFFFF)
319+
{
320+
found++;
321+
if(found == 4) break;
322+
}
319323

320-
if(*fsMountArchive != 0xFFFFFFFF && *fsRegisterArchive != 0xFFFFFFFF && *fsTryOpenFile != 0xFFFFFFFF && *fsOpenFileDirectly != 0xFFFFFFFF) return true;
324+
temp = NULL;
325+
}
321326
}
322327

323-
return false;
328+
return found == 4;
324329
}
325330

326331
static inline bool findLayeredFsPayloadOffset(u8 *code, u32 size, u32 *payloadOffset)
@@ -476,33 +481,33 @@ static inline bool loadTitleLocaleConfig(u64 progId, u8 *regionId, u8 *languageI
476481

477482
if(R_FAILED(IFile_Read(&file, &total, buf, fileSize))) goto exit;
478483

479-
u32 i,
480-
j;
484+
static const char *regions[] = {"JPN", "USA", "EUR", "AUS", "CHN", "KOR", "TWN"},
485+
*languages[] = {"JP", "EN", "FR", "DE", "IT", "ES", "ZH", "KO", "NL", "PT", "RU", "TW"};
481486

482-
for(i = 0; i < 7; i++)
483-
{
484-
static const char *regions[] = {"JPN", "USA", "EUR", "AUS", "CHN", "KOR", "TWN"};
487+
u32 i;
485488

489+
for(i = 0; i < sizeof(regions) / sizeof(char *); i++)
490+
{
486491
if(memcmp(buf, regions[i], 3) == 0)
487492
{
488493
*regionId = (u8)i;
489494
break;
490495
}
491496
}
492497

493-
for(j = 0; j < 12; j++)
498+
if(i != sizeof(regions) / sizeof(char *))
494499
{
495-
static const char *languages[] = {"JP", "EN", "FR", "DE", "IT", "ES", "ZH", "KO", "NL", "PT", "RU", "TW"};
496-
497-
if(memcmp(buf + 4, languages[j], 2) == 0)
500+
for(i = 0; i < sizeof(languages) / sizeof(char *); i++)
498501
{
499-
*languageId = (u8)j;
500-
break;
502+
if(memcmp(buf + 4, languages[i], 2) == 0)
503+
{
504+
*languageId = (u8)i;
505+
ret = true;
506+
break;
507+
}
501508
}
502509
}
503510

504-
ret = i != 7 && j != 12;
505-
506511
exit:
507512
IFile_Close(&file);
508513

@@ -553,7 +558,7 @@ static inline bool patchLayeredFs(u64 progId, u8 *code, u32 size, u32 textSize)
553558
u32 *payload32 = (u32 *)payload;
554559
for(u32 i = 0; i < romfsredir_bin_size / 4; i++)
555560
{
556-
switch (payload32[i])
561+
switch(payload32[i])
557562
{
558563
case 0xdead0000:
559564
payload32[i] = *(u32 *)(code + fsOpenFileDirectly);

0 commit comments

Comments
 (0)