如何通过HOOK技术破解修改【放置江湖】LUA手游?

2026-04-01 18:431阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计11501个文字,预计阅读时间需要47分钟。

如何通过HOOK技术破解修改【放置江湖】LUA手游?

1. 下载《放置江湖》apk,首先检查游戏框架,直接查看\lib目录下的so文件即可。明显这是一款基于cocos2d-lua开发的游戏。查看其lua脚本,了解其实现。




1.下载拿到《放置江湖》 apk 后我们第一步检查游戏框架,直接查看 \lib 目录里面的 so就可以了。

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

看来lua 脚本被加密了,解密的话,我还是比较推荐用HookluaL_loadbuffer的方法解密,我一般都比较喜欢用cydia substate框架。
[C] 纯文本查看 复制代码 ? 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] 纯文本查看 复制代码 ? 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++] 纯文本查看 复制代码 ? 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++] 纯文本查看 复制代码 ? 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.最后成功的截图:


成品视频教程:

视频地址.txt(79 Bytes, 下载次数: 612)

v.youku.com/v_show/id_XMzI4NzI3NTY5Mg==.html?spm=a2h3j.8428770.3416059.1

成品下载微云:
share.weiyun.com/c8158569a7deb826ca3905a79d995875

如何通过HOOK技术破解修改【放置江湖】LUA手游?

本文共计11501个文字,预计阅读时间需要47分钟。

如何通过HOOK技术破解修改【放置江湖】LUA手游?

1. 下载《放置江湖》apk,首先检查游戏框架,直接查看\lib目录下的so文件即可。明显这是一款基于cocos2d-lua开发的游戏。查看其lua脚本,了解其实现。




1.下载拿到《放置江湖》 apk 后我们第一步检查游戏框架,直接查看 \lib 目录里面的 so就可以了。

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

看来lua 脚本被加密了,解密的话,我还是比较推荐用HookluaL_loadbuffer的方法解密,我一般都比较喜欢用cydia substate框架。
[C] 纯文本查看 复制代码 ? 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] 纯文本查看 复制代码 ? 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++] 纯文本查看 复制代码 ? 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++] 纯文本查看 复制代码 ? 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.最后成功的截图:


成品视频教程:

视频地址.txt(79 Bytes, 下载次数: 612)

v.youku.com/v_show/id_XMzI4NzI3NTY5Mg==.html?spm=a2h3j.8428770.3416059.1

成品下载微云:
share.weiyun.com/c8158569a7deb826ca3905a79d995875

如何通过HOOK技术破解修改【放置江湖】LUA手游?