Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit ae87682

Browse files
committed
improve GetResolution and AlphaBlendCamera hook
1 parent 9c6367a commit ae87682

2 files changed

Lines changed: 98 additions & 83 deletions

File tree

frida/dist/_.js

Lines changed: 47 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
📦
2-
691581 /src/index.js
2+
691796 /src/index.js
33
44
var __defProp = Object.defineProperty;
55
var __export = (target, all) => {
@@ -19691,6 +19691,8 @@ var IL2CPP_RUNTIME_OFFSETS = {
1969119691
"il2cpp_type_get_name": 960,
1969219692
"il2cpp_field_static_get_value": 383548,
1969319693
// Internal function
19694+
"il2cpp_field_static_set_value": 383724,
19695+
// Internal function
1969419696
"il2cpp_array_class_get": 108,
1969519697
"il2cpp_array_length": 112,
1969619698
"il2cpp_array_new": 116,
@@ -19702,7 +19704,8 @@ var IL2CPP_RUNTIME_OFFSETS = {
1970219704
"il2cpp_field_get_offset": 632,
1970319705
"il2cpp_field_get_type": 636,
1970419706
"il2cpp_field_get_value": 640,
19705-
"il2cpp_field_has_attribute": 644
19707+
"il2cpp_field_has_attribute": 644,
19708+
"il2cpp_value_box": 1956
1970619709
};
1970719710
function createIl2CppExports(il2cppInitAddress, offsets) {
1970819711
const exports = {};
@@ -19801,7 +19804,7 @@ function getMaxRefreshRate490() {
1980119804
} else {
1980219805
refreshRate = currentResolution.method("get_refreshRateRatio").invoke().method("get_value").invoke();
1980319806
}
19804-
return refreshRate;
19807+
return Math.ceil(refreshRate);
1980519808
}
1980619809
rpc.exports = {
1980719810
setconfig: (cfg) => {
@@ -19915,20 +19918,26 @@ function main() {
1991519918
return this.method(".ctor").invoke(directoryManager, downloader, fileSystem);
1991619919
};
1991719920
}
19921+
var alphaModified = false;
19922+
var alphaResolutionLongSide = 0;
1991819923
function getSize(quality = -1, isLongSide = 1) {
19919-
if (quality == -1) {
19920-
quality = get_SaveData().method("get_RenderTextureQuality").invoke().field("value__").value;
19921-
}
1992219924
var size = 0;
19923-
switch (quality) {
19924-
case 1:
19925-
size = globalConfig["MediumQualityLongSide"];
19926-
break;
19927-
case 2:
19928-
size = globalConfig["HighQualityLongSide"];
19929-
break;
19930-
default:
19931-
size = globalConfig["LowQualityLongSide"];
19925+
if (alphaModified) {
19926+
size = alphaResolutionLongSide;
19927+
} else {
19928+
if (quality == -1) {
19929+
quality = get_SaveData().method("get_RenderTextureQuality").invoke().field("value__").value;
19930+
}
19931+
switch (quality) {
19932+
case 1:
19933+
size = globalConfig["MediumQualityLongSide"];
19934+
break;
19935+
case 2:
19936+
size = globalConfig["HighQualityLongSide"];
19937+
break;
19938+
default:
19939+
size = globalConfig["LowQualityLongSide"];
19940+
}
1993219941
}
1993319942
if (!isLongSide) {
1993419943
return Math.floor(size / 16 * 9);
@@ -19937,42 +19946,39 @@ function main() {
1993719946
}
1993819947
}
1993919948
if (AssemblyCSharp.image.tryClass("School.LiveMain.SchoolResolution")) {
19940-
let setResolutions2 = function(_liveAreaResolutions) {
19941-
for (let i = 0; i < 3; i++) {
19942-
const LiveResolution = _liveAreaResolutions.method("get_Item").invoke(i);
19943-
LiveResolution.field("_longSide").value = getSize(i, 1);
19944-
LiveResolution.field("_shortSide").value = getSize(i, 0);
19945-
}
19946-
};
19947-
var setResolutions = setResolutions2;
1994819949
const SchoolResolution = AssemblyCSharp.image.class("School.LiveMain.SchoolResolution");
19949-
SchoolResolution.initialize();
1995019950
SchoolResolution.method("GetResolution").implementation = function(quality, orientation) {
19951-
const _liveAreaResolutions = SchoolResolution.field("_liveAreaResolutions").value;
19952-
const numQuality = quality.field("value__").value;
19953-
const longSide = _liveAreaResolutions.method("get_Item").invoke(numQuality).field("_longSide").value;
19954-
if (getSize(numQuality, 1) != longSide) {
19955-
setResolutions2(_liveAreaResolutions);
19956-
}
1995719951
const result = this.method("GetResolution").invoke(quality, orientation);
19952+
const numQuality = quality.field("value__").value;
19953+
const numOrientation = orientation.field("value__").value;
19954+
result.field("m_Width").value = getSize(numQuality, numOrientation ^ 1);
19955+
result.field("m_Height").value = getSize(numQuality, numOrientation);
1995819956
return result;
1995919957
};
1996019958
}
1996119959
const AlphaBlendCamera = Core.image.class("Inspix.AlphaBlendCamera");
19962-
var alphaModified = false;
19960+
function forceRefreshRenderTexture(quality) {
19961+
if (quality > 0) {
19962+
get_SaveData().method("set_RenderTextureQuality").invoke(quality - 1);
19963+
get_SaveData().method("set_RenderTextureQuality").invoke(quality);
19964+
} else if (quality < 2) {
19965+
get_SaveData().method("set_RenderTextureQuality").invoke(quality + 1);
19966+
get_SaveData().method("set_RenderTextureQuality").invoke(quality);
19967+
}
19968+
}
1996319969
AlphaBlendCamera.method("UpdateAlpha").implementation = function(newAlpha) {
1996419970
const alpha = newAlpha;
1996519971
const RenderTextureQuality = get_SaveData().method("get_RenderTextureQuality").invoke();
1996619972
const quality = RenderTextureQuality.field("value__").value;
1996719973
if (alpha > 0 && alpha < 1) {
19968-
if (!alphaModified && quality > 0) {
19974+
if (!alphaModified) {
19975+
alphaResolutionLongSide = Math.round(getSize(quality) * 2 / 3);
1996919976
alphaModified = true;
19970-
get_SaveData().method("set_RenderTextureQuality").invoke(quality - 1);
19977+
forceRefreshRenderTexture(quality);
1997119978
}
1997219979
} else if (alphaModified) {
1997319980
alphaModified = false;
19974-
if (quality < 2)
19975-
get_SaveData().method("set_RenderTextureQuality").invoke(quality + 1);
19981+
forceRefreshRenderTexture(quality);
1997619982
}
1997719983
this.method("UpdateAlpha").invoke(newAlpha);
1997819984
};
@@ -20262,10 +20268,12 @@ function main() {
2026220268
objData.method("set_ArchiveUrl").invoke(Il2Cpp.string(archiveData.archive_url));
2026320269
for (let i = 0; i < objChapters.method("get_Count").invoke(); i++) {
2026420270
const chapter = objChapters.method("get_Item").invoke(i);
20265-
if (i < archiveData.chapters.length) {
20266-
chapter.method("set_PlayTimeSecond").invoke(archiveData.chapters[i].play_time_second);
20267-
} else {
20268-
break;
20271+
if (archiveData.chapters) {
20272+
if (i < archiveData.chapters.length) {
20273+
chapter.method("set_PlayTimeSecond").invoke(archiveData.chapters[i].play_time_second);
20274+
} else {
20275+
break;
20276+
}
2026920277
}
2027020278
}
2027120279
if (objCostumeIds.method("get_Count").invoke() == 0) {

frida/src/index.ts

Lines changed: 51 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,7 @@ const IL2CPP_RUNTIME_OFFSETS: Record<`il2cpp_${string}`, number> = {
121121
"il2cpp_type_get_name": 0x3C0,
122122

123123
"il2cpp_field_static_get_value": 0x5DA3C, // Internal function
124+
"il2cpp_field_static_set_value": 0x5DAEC, // Internal function
124125

125126
"il2cpp_array_class_get": 0x6C,
126127
"il2cpp_array_length": 0x70,
@@ -136,6 +137,8 @@ const IL2CPP_RUNTIME_OFFSETS: Record<`il2cpp_${string}`, number> = {
136137
"il2cpp_field_get_type": 0x27C,
137138
"il2cpp_field_get_value": 0x280,
138139
"il2cpp_field_has_attribute": 0x284,
140+
141+
"il2cpp_value_box": 0x7A4,
139142
};
140143

141144
function createIl2CppExports(
@@ -258,7 +261,7 @@ function getMaxRefreshRate490(): number {
258261
.method<Il2Cpp.Object>("get_refreshRateRatio").invoke()
259262
.method<number>("get_value").invoke()
260263
}
261-
return refreshRate;
264+
return Math.ceil(refreshRate);
262265
}
263266

264267
rpc.exports = {
@@ -436,6 +439,9 @@ function main() {
436439
}
437440
}
438441

442+
var alphaModified: boolean = false
443+
var alphaResolutionLongSide: number = 0
444+
439445
/**
440446
* 按照设置的质量档位,获取对应的渲染分辨率
441447
* - 低 1080p
@@ -444,20 +450,24 @@ function main() {
444450
* @param isLongSide 是否是长边
445451
*/
446452
function getSize(quality: number = -1, isLongSide: number = 1) {
447-
if (quality == -1) {
448-
quality = get_SaveData().method<Il2Cpp.ValueType>("get_RenderTextureQuality").invoke().field<number>("value__").value
449-
}
450-
451453
var size = 0
452-
switch (quality) {
453-
case 1:
454-
size = globalConfig["MediumQualityLongSide"]
455-
break
456-
case 2:
457-
size = globalConfig["HighQualityLongSide"]
458-
break
459-
default:
460-
size = globalConfig["LowQualityLongSide"]
454+
455+
if (alphaModified) {
456+
size = alphaResolutionLongSide
457+
} else {
458+
if (quality == -1) {
459+
quality = get_SaveData().method<Il2Cpp.ValueType>("get_RenderTextureQuality").invoke().field<number>("value__").value
460+
}
461+
switch (quality) {
462+
case 1:
463+
size = globalConfig["MediumQualityLongSide"]
464+
break
465+
case 2:
466+
size = globalConfig["HighQualityLongSide"]
467+
break
468+
default:
469+
size = globalConfig["LowQualityLongSide"]
470+
}
461471
}
462472

463473
if (!isLongSide) {
@@ -469,43 +479,36 @@ function main() {
469479

470480
if (AssemblyCSharp.image.tryClass("School.LiveMain.SchoolResolution")) {
471481
const SchoolResolution = AssemblyCSharp.image.class("School.LiveMain.SchoolResolution")
472-
SchoolResolution.initialize()
473-
474-
/**
475-
* 替换内置的质量档位到分辨率词典
476-
* @param _liveAreaResolutions School.LiveMain.SchoolResolution._liveAreaResolutions
477-
*/
478-
function setResolutions(_liveAreaResolutions: Il2Cpp.Object) {
479-
for (let i = 0; i < 3; i++) {
480-
const LiveResolution = _liveAreaResolutions.method("get_Item").invoke(i) as Il2Cpp.Object
481-
LiveResolution.field("_longSide").value = getSize(i, 1)
482-
LiveResolution.field("_shortSide").value = getSize(i, 0)
483-
}
484-
}
485482

486483
/**
487484
* 检查是否已经套用自定义的分辨率,没有套用则套用
488485
* @param quality School.LiveMain.SchoolResolution.LiveAreaQuality
489486
* @param orientation School.LiveMain.SchoolResolution.LiveResolution
490487
*/
491488
SchoolResolution.method("GetResolution").implementation = function (quality, orientation) {
492-
const _liveAreaResolutions = SchoolResolution.field("_liveAreaResolutions").value as Il2Cpp.Object
493-
const numQuality = (quality as Il2Cpp.ValueType).field<number>("value__").value
494-
const longSide = _liveAreaResolutions.method<Il2Cpp.Object>("get_Item").invoke(numQuality).field<number>("_longSide").value
495-
496-
if (getSize(numQuality, 1) != longSide) {
497-
setResolutions(_liveAreaResolutions)
498-
}
499-
500-
const result = this.method("GetResolution").invoke(quality, orientation)
489+
const result = this.method<Il2Cpp.Object>("GetResolution").invoke(quality, orientation)
501490
// console.log("GetResolution", result)
491+
const numQuality = (quality as Il2Cpp.ValueType).field<number>("value__").value;
492+
const numOrientation = (orientation as Il2Cpp.ValueType).field<number>("value__").value;
493+
result.field<number>("m_Width").value = getSize(numQuality, numOrientation ^ 1)
494+
result.field<number>("m_Height").value = getSize(numQuality, numOrientation)
495+
502496
return result
503497
}
504498
}
505499

506500
const AlphaBlendCamera = Core.image.class("Inspix.AlphaBlendCamera")
507501

508-
var alphaModified: boolean = false
502+
function forceRefreshRenderTexture(quality: number) {
503+
if (quality > 0) {
504+
get_SaveData().method("set_RenderTextureQuality").invoke(quality - 1)
505+
get_SaveData().method("set_RenderTextureQuality").invoke(quality)
506+
} else if (quality < 2) {
507+
get_SaveData().method("set_RenderTextureQuality").invoke(quality + 1)
508+
get_SaveData().method("set_RenderTextureQuality").invoke(quality)
509+
}
510+
}
511+
509512
/** Fes×LIVE进行AlphaBlend时降低分辨率至更低画质档位以保证帧率
510513
*
511514
* 基于Apple M4平台进行测试,AlphaBlend应当在1080p才能保证稳定的60FPS
@@ -518,15 +521,17 @@ function main() {
518521
const quality = RenderTextureQuality.field<number>("value__").value
519522

520523
if (alpha > 0 && alpha < 1) {
521-
if (!alphaModified && quality > 0) {
524+
if (!alphaModified) {
525+
alphaResolutionLongSide = Math.round(getSize(quality) * 2.0 / 3.0)
522526
alphaModified = true
523-
get_SaveData().method("set_RenderTextureQuality").invoke(quality - 1)
527+
forceRefreshRenderTexture(quality)
524528
}
525529
}
526530
else if (alphaModified) {
527531
alphaModified = false
528-
if (quality < 2) get_SaveData().method("set_RenderTextureQuality").invoke(quality + 1)
532+
forceRefreshRenderTexture(quality)
529533
}
534+
530535
this.method("UpdateAlpha").invoke(newAlpha)
531536
}
532537

@@ -978,10 +983,12 @@ function main() {
978983

979984
for (let i = 0; i < objChapters.method<number>("get_Count").invoke(); i++) {
980985
const chapter = objChapters.method<Il2Cpp.Object>("get_Item").invoke(i)
981-
if (i < archiveData.chapters.length) {
982-
chapter.method("set_PlayTimeSecond").invoke(archiveData.chapters[i].play_time_second)
983-
} else {
984-
break
986+
if (archiveData.chapters) {
987+
if (i < archiveData.chapters.length) {
988+
chapter.method("set_PlayTimeSecond").invoke(archiveData.chapters[i].play_time_second)
989+
} else {
990+
break
991+
}
985992
}
986993
}
987994

0 commit comments

Comments
 (0)