本帖最后由 2316361 于 2021-4-23 10:09 编辑
小弟想修改一款unity3d游戏,由于libil2cpp.so被加密了,不知道怎么解密,只好用GG修改器dump出来再用Il2CppDumper解析,然后尝试用Cydia Substrate修改。
类似这种函数:
[C#] 纯文本查看 复制代码 // RVA: 0x158DE84 Offset: 0x158DE84 VA: 0xC8C0DE84 Slot: 59
public float get_moveSpeed() { }
都好办,但是在修改攻速时候傻眼了。
[C#] 纯文本查看 复制代码 // RVA: 0x158DA7C Offset: 0x158DA7C VA: 0xC8C0DA7C
public FP get_attackSpeed() { }
返回个FP。翻了半天发现FP是个结构体。
[C#] 纯文本查看 复制代码 // Namespace: Torappu
[LuaCallCSharpAttribute] // RVA: 0x91FE10 Offset: 0x91FE10 VA: 0xC7F9FE10
[Serializable]
public struct FP : IEquatable<FP>, IComparable<FP> // TypeDefIndex: 12439
{
// Fields
[SerializeField] // RVA: 0x91FE24 Offset: 0x91FE24 VA: 0xC7F9FE24
public long _serializedValue; // 0x0
public const long MAX_VALUE = 9223372036854775807;
// 一大堆常量。。。
public static readonly Decimal Precision; // 0x0
// 一大堆静态属性。。。
// Properties
public long RawValue { get; }
// Methods
// RVA: 0x163ACF8 Offset: 0x163ACF8 VA: 0xC8CBACF8
private void .ctor(long rawValue) { }
// RVA: 0x163AD18 Offset: 0x163AD18 VA: 0xC8CBAD18
public void .ctor(int value) { }
// RVA: 0x163DDC4 Offset: 0x163DDC4 VA: 0xC8CBDDC4
public static FP FromFloat(float value) { }
// 一大堆方法。。。
// RVA: 0x163EDC8 Offset: 0x163EDC8 VA: 0xC8CBEDC8
private static void .cctor() { }}
小弟先尝试了一下这样:
[C++] 纯文本查看 复制代码 void *(*o_get_attackSpeed)(void *_this);
void *h_get_attackSpeed(void *_this) {
return o_get_attackSpeed(_this);
}
__attribute__((constructor))
void libhook_main() {
while (libBase == 0) {
libBase = get_libBase(libName);
sleep(1);
}
MSHookFunction((void *) getRealOffset(0x158DA7C), (void *) &h_get_attackSpeed, (void **) &o_get_attackSpeed);
}
结果游戏崩溃了。
又尝试了一下这样:
[C++] 纯文本查看 复制代码 void *(*o_FromFloat)(float value);
void *h_FromFloat(float value) {
return o_FromFloat(value);
}
void *(*o_get_attackSpeed)(void *_this);
void *h_get_attackSpeed(void *_this) {
return o_FromFloat(1000);
}
__attribute__((constructor))
void libhook_main() {
while (libBase == 0) {
libBase = get_libBase(libName);
sleep(1);
}
MSHookFunction((void *) getRealOffset(0x163DDC4), (void *) &h_FromFloat, (void **) &o_FromFloat);
MSHookFunction((void *) getRealOffset(0x158DA7C), (void *) &h_get_attackSpeed, (void **) &o_get_attackSpeed);
}
结果游戏卡死了。
又尝试了一下这样:
[C++] 纯文本查看 复制代码 long (*o_get_attackSpeed)(void *_this);
long h_get_attackSpeed(void *_this) {
return 1000;
}
__attribute__((constructor))
void libhook_main() {
while (libBase == 0) {
libBase = get_libBase(libName);
sleep(1);
}
MSHookFunction((void *) getRealOffset(0x158DA7C), (void *) &h_get_attackSpeed, (void **) &o_get_attackSpeed);
}
结果没崩溃也没卡死。可是无论修改成多少,小人都站在那里一动不动。
所以想求助一下这里的大神,是因为小弟的写法不对,还是libil2cpp.so被加密的原因,亦或是被游戏检测到了?
期待大神的解答,谢谢啦! |