hook时机
根据 jithook中介绍,luaopen_jit 是 最后一个加载的库 lua lib_init.c
所以选择在 hook luaopen_jit 来加载hook.lua
1 | static const luaL_Reg lj_lib_load[] = { |
实现
当VA加载libtolua.so的时候,找到函数luaopen_jit,jit加载完毕后,加载/sdcard/mydump/hook.lua并执行。
1 | if (strstr(name, "libtolua.so") != NULL && Count != true) { |
hook.lua
使用lua 自带的debug库,详细介绍
大体作用就是 每次调用某个函数会检查函数名或者其他信息是否可疑,将可疑函数的相关的局部变量保存到文件里。找到参数时用相应函数修改。
1 | function serialize(obj) |
问题
对于local value 的解析,游戏里个别地方 数据结构复杂,会table嵌套table、userdata。
(userdata 是一种用户自定义数据,用于表示一种由应用程序或 C/C++ 语言库所创建的类型,可以将任意 C/C++ 的任意数据类型的数据(通常是 struct 和 指针)存储到 Lua 变量中调用)
debug.getuservalue (u)
这个是把userdata转换成table
Returns the Lua value associated to u
. If u
is not a userdata, returns nil.
网上常见的两种解析方法都不可行:
递归解析(emm)https://www.jianshu.com/p/9b388de0899b
可解析userdata,但是数据过于复杂,lua报错无限递归栈溢出
json编码
可解析复杂的table,但是,json库、cjson库,网友实现的其他json库都不能解析userdata