吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2408|回复: 1
收起左侧

[Android 求助] 求助一下坛子里面会用Cydia Substrate的大神

[复制链接]
2316361 发表于 2021-4-23 10:07
201吾爱币
本帖最后由 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被加密的原因,亦或是被游戏检测到了?
期待大神的解答,谢谢啦!

最佳答案

查看完整内容

你能DUMP DLL 也能DUMP il2cpp DUMP出来 拖进IDA. 分析完成后 转到 get_attackSpeed 看下具体实现. C# 会因为泛型之类的问题 导致生成的代码传参不一样.. HOOK代码应该是没有问题的.

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

meiercn 发表于 2021-4-23 10:07
你能DUMP DLL 也能DUMP il2cpp
DUMP出来 拖进IDA.
分析完成后 转到 get_attackSpeed
看下具体实现.
C# 会因为泛型之类的问题 导致生成的代码传参不一样..
HOOK代码应该是没有问题的.
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-15 21:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表