我爱辅助论坛

 找回密码
 【点我注册】

QQ登录

只需一步,快速开始

查看: 4114|回复: 5

[文字教程] 我叫搬运工 啦啦啦【【放置江湖】LUA手游 基于HOOK 解密修改流程】

[复制链接]

签到天数: 14 天

[LV.3]偶尔看看II

发表于 2018-1-22 17:58:09 | 显示全部楼层 |阅读模式
1.下载拿到《放置江湖》 apk 后我们第一步检查游戏框架,直接查看 \lib 目录里面的 so就可以了。

很明显这也是一款基于cocos2dlua 开发的游戏。接着我们查看,他的lua脚本。

看来lua 脚本被加密了,解密的话,我还是比较推荐用Hook luaL_loadbuffer 的方法解密,我一般都比较喜欢用cydia substate框架。
[C] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[backcolor=rgb(27, 36, 38) !important][color=white !important]
[color=white !important]?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

#define LIB "/data/app-lib/com.xhtt.app.fzjh-1/libcocos2dlua.so"

void * (*old_luaL_loadbuffer)(void * L, const char * buff, size_t  size, const char * name);
void * new_luaL_loadbuffer(void * L, const char * buff, size_t  size, const char * name)
{
    // 这里加入保存 buff 到内存卡的代码
    void * ret = old_luaL_loadbuffer(L, buff, size, name);
    return ret;
}

MSInitialize {
    MSImageRef ref = MSGetImageByName(LIB);
    void *sym_luaL_loadbuffer= MSFindSymbol(ref,"luaL_loadbuffer");
    MSHookFunction(sym_luaL_loadbuffer, (void*)&new_luaL_loadbuffer, (void **)&old_luaL_loadbuffer);
};





代码弄好以后,启动运行一次游戏就可以把游戏的全部Lua解密出来;
解密出来的代码 是lua 文件,不是luac的 这样就省去我们 反编译luac 代码的流程。

2.我们拿到了lua脚本代码后怎么用呢?修改了lua的逻辑以后在怎么加载到游戏里面去呢?
由于我也是第一次尝试破解解密lua框架手游,我能想到的还是 luaL_loadbuffer 这个方法,在我们解密的过程中用这个方法拿到了lua明文代码,我们修改后的lua明文代码,还是在这个地方偷梁换柱。

如果采用改包的方式,我们还需要 把明文加密, 替换APK 文件, 签名。这个过程太复杂了。而且频繁的修改就要频繁的重复这个过程;
至于实现的话,为了让没有root的安卓用户也可以使用,我们又要用到 VA 框架了。



这是一个树林打鸟的任务,我们需要把  经验超过后的打工奖励 修改一下。把 这里我把5改成200 而且还有金币奖励;
接下来我们就该操刀 VA 游戏框架了。
VA HOOK SO 的实现过程 有很多,发一下核心实现过程
java 实现部分:
[Java] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[backcolor=rgb(27, 36, 38) !important][color=white !important]
[color=white !important]?

01

02

03

04

05

06

07

08

09

10

11

12

public class Native {
    private final static String TAG = "Plugin-Native";
    static {
        try{
            System.loadLibrary("plugin");
        }catch (Exception ex){
            Log.e(TAG, ex.getMessage(), ex);
        }
    }

    public static native void hook(String p);
}





c++ 实现部分:
[C++] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[backcolor=rgb(27, 36, 38) !important][color=white !important]
[color=white !important]?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

extern "C" {
JNIEXPORT void JNICALL Java_com_plugin_Native_hook(JNIEnv *env, jclass jclazz, jstring p) {
    const char *path = env->GetStringUTFChars(p, NULL);

    MSHookType _hook;
    _hook = (MSHookType) findSymbol("libva-native.so", "_ZN5Cydia14MSHookFunctionEPvS0_PS0_");
    void *sym_luaL_loadbuffer = findSymbol(
            path,
            "luaL_loadbuffer");

    if (_hook != NULL && sym_luaL_loadbuffer != NULL) {
        _hook(sym_luaL_loadbuffer, (void *) &new_luaL_loadbuffer, (void **) &old_luaL_loadbuffer);
    }

}
}





[C++] [color=rgb(51, 102, 153) !important]纯文本查看 [color=rgb(51, 102, 153) !important]复制代码
[backcolor=rgb(27, 36, 38) !important][color=white !important]
[color=white !important]?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

void *(*old_luaL_loadbuffer)(void *L, const char *buff, size_t size, const char *name);

void *new_luaL_loadbuffer(void *L, const char *buff, size_t size, const char *name) {

    std::string s(name);

    if (s.length() < 128) {
        replace_all(s, "/", ".");
        string path("/sdcard/lua/");
        path.append(s);
        FILE *file = fopen(path.c_str(), "r");
        if (file != NULL) {
            fseek(file, 0, SEEK_END);
            size_t new_size = ftell(file);

            fseek(file, 0, SEEK_SET);
            LOGI("[-]file=%s", s.c_str());

            char *new_buff = (char *) alloca(new_size + 1);
            fread(new_buff, new_size, 1, file);
            fclose(file);

            return old_luaL_loadbuffer(L, new_buff, new_size, name);
        }
    }

    void *ret = old_luaL_loadbuffer(L, buff, size, name);
    return ret;
}






我们在打开游戏加载lua的时候,用 name 取比较我们 内存卡根目录的 lua文件夹里面的 lua 代码。如果有就替换 没有就不替换。
这里的话只要注意 lua 文件命名就ok了。
3.最后成功的截图:
[size=0.83em]4.png (500.62 KB, 下载次数: 0)
下载附件  [url=]保存到相册[/url]
[color=rgb(153, 153, 153) !important]2018-1-3 12:39 上传





成品视频教程:
视频地址.txt (79 Bytes, 下载次数: 193)
成品下载微云:
https://share.weiyun.com/c8158569a7deb826ca3905a79d995875







原帖大佬地址
https://www.52pojie.cn/thread-682778-1-1.html

温馨提示:为了保护系统安全,使用辅助前,请务必使用影子系统。

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【好评】【金币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

签到天数: 21 天

[LV.4]偶尔看看III

发表于 2018-1-22 19:06:51 | 显示全部楼层
11111111111111111111

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【好评】【金币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

签到天数: 24 天

[LV.4]偶尔看看III

发表于 2018-1-23 22:00:31 | 显示全部楼层
6666666666666666666666666666

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【好评】【金币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

签到天数: 4 天

[LV.2]偶尔看看I

发表于 2018-2-13 19:33:24 | 显示全部楼层
感谢您的分享,这里有你更精彩!

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【好评】【金币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

签到天数: 12 天

[LV.3]偶尔看看II

发表于 2019-7-11 20:25:48 | 显示全部楼层
牛逼现在还能用吗?

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【好评】【金币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

签到天数: 4 天

[LV.2]偶尔看看I

发表于 2025-1-22 00:20:22 | 显示全部楼层

感谢楼主分享

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】

如何回报帮助你解决问题的坛友,一个好办法就是给对方加【好评】【金币】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 【点我注册】

本版积分规则

QQ|小黑屋|我爱辅助 ( 辽ICP备19006053号-1 )

GMT+8, 2025-5-1 16:14 , Processed in 0.050472 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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