dump出游戏lua源码(dump解密lua)
本文目录一览:
如何学习 Lua VM 的源码
2011年底开始阅读Lua代码,选择的版本是5.1.4,在那个时候是最新的版本了,不过2012年不仅有更新的5.1版本出来,还有最新的5.2.暂时管不了这么多,继续看这个版本先了。 历经近一年,中间酸甜苦辣只有自己知道,你问有什么方法,我的回答只有坚持。一边看代码,一看补一些基础(比如看龙书),到最后觉得差不多了就自己抄Lua虚拟机代码来跟踪它的实现。 我的博客上:,有我写的Lua分析文章,还没有完全写完。当然我现在也不认为我完全理解的通通透透了。 我最后希望能做到的是:把Lua某个版本的代码通透看完,在github上写一个开源的分析Lua源码的文档,最后能正确写一份英文的得到Lua社区的认可。 之 所以花这么大功夫去啃Lua代码,是因为我觉得Lua是门很好的语言,参见知乎我在其他帖子中对Lua的评价。另一方面是Lua的代码数量足够 小,5.1.4仅仅1.5W行,去掉空白行和注释估计能到1W行。Lua是世界最流行的脚本语言之一,前几年还进过top20的流行语言,另外又是 C\C++的完美伴侣。另外,我自己对如何实现一门语言也充满了好奇,Lua虽小五脏俱全而且还是正经实用的项目。就这些理由一直在支撑着我看下去。当然 现在最难的时候已经过去了。 其他人的文章,国内云风写的是最多的。不过我认为云风的文章key太高,很难follow,你如果对云风写的文章涉及的技术点没有什么涉猎就直接去看,可能很难看懂。 另外国外人写过的,最推荐的有: 《ANoFrillsIntroToLua51VMInstructions》 《The implementation of Lua 5.0》
lua源码分析4(lua是怎么执行的)收藏
当分析到这里,对于lua生成中间码的过程就比较熟悉了。关键是生成的中间码必须要和lua虚拟机的执行联系在一起。所以,对于这里分析的函数调用,要结合lua虚拟机的执行一起来分析。
上篇文章对生成局部函数中间码做了简单的介绍。这里知道,当lua发现一个新定义的函数的时候,会生成OP_CLOSURE指令。那么,lua虚拟机执行到OP_CLOSURE后怎么执行呢?
在此之前,先说在lua解析代码完了以后,会做那些善后之事呢?
前面说过,lua会把一个代码文件当作是一个函数解析执行。在解析期间,它会率先生成一个FuncState的结构,作为最外面的函数。但这是解析时做的事情,运行期间,是不会有FuncState这个东西出现的。在运行期间,是由一个个叫CallInfo的数据结果的,它指的是当前运行的函数。
那么,在解析代码以后,是怎么转入运行的呢?
lua 怎么反编译
lua源文件--obfuscate--lua源文件(混淆后)--compile--luac文件(带调试用的变量名和行号)--strip--luac文件(不带调试信息)
lua/luac--加密/打包--数据文件
数据文件--解包/解密--lua/luac--lua虚拟机
1. 跟踪,脱壳,解包,解密,获得 luac
追 luaL_loadbuffer luaL_loadfile lua_load 应该可以找到 解密函数。
hook 这3个函数,导出解密后的数据,直接就是 luac 文件。如果没编译甚至是 lua源文件。
hook luaV_execute 可以拿到 Proto* ,想办法用 luaU_dump 导出。luaD_precall 应该没必要搞。
2. 非标准 luac 处理
我们有两种方案来处理得到的 luac
1. 得到一个能够执行上述非标 luac 的 lua 版本
搞清楚编译方式,改 lua 源文件,编译出一个,这样做什么都可以,还能编译出对应的 luadec 。
如果能找到 lua51.dll 之类的就直接调用吧。但是,只能用于导出 luac 对比文件格式,或者执行找到的几个关键函数。
2. 将非标 luac 转换成标准格式 luac,正所谓:山不来就我,我便去就山
非标准 luac 是怎么做的:
1. bad header 改文件头
#define LUA_SIGNATURE "\033Lua" // lua.h
2. bad header 改数据类型
// luaconf.h
#define LUA_NUMBER_DOUBLE
#define LUA_NUMBER double
LUA_NUMBER to float
LUA_NUMBER_SCAN to "%f"
LUA_NUMBER_FMT to "%.7g"
l_mathop(x) to (x##f)
lua_str2number to use strtof
3. bad code OpCode 重定义
// 改有 "ORDER OP" 的地方
/* grep "ORDER OP" if you change these enums */
enum OpCode; // lopcodes.h
const lu_byte luaP_opmodes[]; // lopcodes.c
const char *const luaP_opnames[]; // lopcodes.c
如何让Lua集成到自己的Android游戏
下面开始详细步骤:
安装Cygwin,下载到的setup是一个安装器,负责在线或者本地找到安装需要的文件并执行安装,建议把文件下载到本地以备下次使用,安装过程执行到选择安装包时一定确定All结点(树形结点的根结点)在Install状态以免需要的包不被安装,如果是在线安装时间会很长,耐心等待过后Cygwin安装成功。
安装NDK,NDK是一个压缩文件,下载完成解压缩(建议解压缩到一个方便输入路径的目录)。
下载上面lua和luajava的源代码并解压缩到任意目录。
在任意目录创建luajava4android(名字可以任意)目录,在目录下创建子目录jni(名字指定为jni),把lua和luajava中的C文件(包括头文件和源文件)都拷入该目录,并在该目录下创建Android.mk文件,拷贝下面内容至文件:
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_ARM_MODE := arm LOCAL_MODULE := luajava-1.1 LOCAL_SRC_FILES := lapi.c \ lauxlib.c \ lbaselib.c \ lcode.c \ ldblib.c \ ldebug.c \ ldo.c \ ldump.c \ lfunc.c \ lgc.c \ linit.c \ liolib.c \ llex.c \ lmathlib.c \ lmem.c \ loadlib.c \ lobject.c \ lopcodes.c \ loslib.c \ lparser.c \ lstate.c \ lstring.c \ lstrlib.c \ ltable.c \ ltablib.c \ ltm.c \ lundump.c \ lvm.c \ lzio.c \ print.c \ luajava.c include $(BUILD_SHARED_LIBRARY)
运行Cygwin安装目录下的Cygwin.bat进入命令行界面,进入刚才建立的luajava4android路径,执行ndk-build,成功以后就会在目录下生成一个lib目录,里面以.so为后缀名的文件即为我们需要的动态链接库文件。
把luajava中的java源代码导入到自己的Android工程中,在工程目录下建立\libs\armeabi\结构的路径,并把动态链接库文件拷入,刷新工程,这样我们就完成了所有的步骤,并不复杂,可以写一个简单的实例来验证Lua环境是否搭建好了。
package com.android.hello; import android.app.Activity; import android.os.Bundle; import android.widget.TextView; import org.keplerproject.luajava.*; public class HelloAndroidActivity extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { LuaState L = LuaStateFactory.newLuaState(); L.openLibs(); L.LdoString("text = 'Hello Android, I am Lua.'"); L.getGlobal("text"); String text = L.toString(-1); super.onCreate(savedInstanceState); TextView tv = new TextView(this); tv.setText(text); setContentView(tv); } }