逆向分析Lua注入类型外挂
<h2 id="相关"><a href="#相关" class="headerlink" title="相关"></a>相关</h2><p>该网游类型为横版过关类角色扮演游戏,之前在这上面花了不少时间。刚接触逆向分析,所以比较好奇外挂以及游戏漏洞的原理,故写此记录一下分析过程。 </p>
找寻样本该游戏近年在国内市场效应不佳,所以游戏工作室以及外挂制作等业务逐渐退出国服范围。在谷歌搜索后,发现存在许多类型为Lua 注入的外挂–也就是向游戏注入Lua脚本代码,执行实现非法行为的手段。而其中支持国服的,只有一款,下载后对其进行分析。
分析下载下来后,发现该外挂为单文件,对其进行查壳操作。为.NET程序,并且无壳,这就相当于开源了。使用Reflector反编译:无混淆,直接导出源码,丢入vs2017,方便阅读代码。
加载器目录结构:
加载器功能函数:
加载器主要逻辑WPF程序启动函数:
...
LUA
</a><div class="a-content"><a class="clearlink" href="15583468928554.html">
</a><div class="a-content-text"><a class="clearlink" href="15583468928554.html">
<p>kong作为非java全家桶的一员,在非java领域的网关系统中得到了广泛的应用</p>
使用docker一键启动kong
参考项目:https://github.com/Kong/docker-kong/tree/master/compo ...
Lua之面向对象个人总结
面向对象的三个特征:封装、继承和多态。Lua并没有类,没有直接实现面向对象的方法。不过Lua的Table,有内部对象和内部方法。Lua的面向对象主要是通过Table来模拟面向对象。
封装在Lua之Table学习中,曾以Computer为例子,介绍了Table 也是可以有自己内部的属性和方法。
1234567891011121314local CPU = { name = 'CPU', cost = 400 }local Monitor = { name = 'bird', cost = 200 }local Memory = { name = 'memory', cost = 100 }local Computer = { description = "this is a computer", cpu = CPU, monitor = Monitor, memory = Memory}function Computer.getDescription() return Computer.desc ...
浅析android手游lua脚本的加密与解密(前传)
为了能让一些同学更好的学习lua的逆向,我把收集的一些资料组合成一篇lua加解密的相关工作给大家参考,当然,看这篇文章之前还是需要一些lua的基础知识,这里推荐云风大佬的《Lua源码欣赏》[19],建议结合搜索引擎学习之。
文章分2部分介绍,第1部分介绍lua加解密的相关文章介绍,第2部分介绍lua的相关工具。
相关工作: 这一节介绍了互联网上对lua的各种相关文章,包括lua的加解密如文件格式的解析、基于lua的游戏和比赛的介绍、lua的hook技术等。
1. lua加解密入门:
非虫大佬[1-4] 写了4篇关于luac和luajit文件格式和字节码的相关文章,并开源了010Editor的解析luac和luajit的模板代码。Ganlv 同学[7] 在吾爱破解写了7篇关于lua加解密的系列教程。腾讯gslab[9] 写了一篇关于lua游戏逆向的入门介绍,这是一篇比较早的lua游戏解密的文章。INightElf 同学[10] 写了一篇关于lua脚本反编译入门的文章。
2. 基于lua的手游:
lua不仅能用于端游戏,也能用于手游,而且由于手游的火热,带动了lua逆向相 ...
lua字符串类型
Lua中字符串结构体的定义是:
typedef union TString {
L_Umaxalign dummy; /* ensures maximum alignment for strings */
struct {
CommonHeader;
lu_byte reserved;
unsigned int hash;
size_t len;
} tsv;
} TString;
这里TString结构体是一个union, 最开始的L_Umaxalign dummy;起到的是对齐作用.紧跟着是CommonHeader,可以看出TString也是可GC数据类型的一种.
在Lua中,字符串是一个保存在一个全局的地方,在globale_state的strt里面,这是一个hash数组,专门用于存放字符串:
typedef struct stringtable {
GCObject **hash;
lu_int32 nuse; /* number of elements */
int ...
Lua 学习 chapter13
目录
位和字节
无符号的输出
打包和解包二进制数据
What is the cost of lies? It’s not that we’ll mistake them for the truth. The real danger is that if we hear enough lies, then we no longer recognize the truth at all. What can we do then? What else is left but to abandon even the hope of truth and content ourselves instaed with stories? In these stories, it doesn’t matter who the heroes are. All we want to know is: who is to blame? No friends. Or, at least, not important ones.
位和字节
在lua中位运算和其它语言基本一致,包含按位与、按 ...
Lua
元表(metatable) 是 Lua 中的重要概念,每一个 table 都可以加上 metatable,以改变相应的 table 的行为。
Lua 中不能改变其他类型的元表(除了使用调试库),必须使用C API才能做到。
元表也是普通的table,定义了原始值在某些特定操作下的行为。你可通过在值的原表中设置特定的字段来改变作用于该值的操作的某些行为特征。
<a href="14674693691952.html" class="more-link">查看全文 →</a>
</div>
Lua之 loadfile ,dofile, loadstring,require
loadfile——只编译,不运行1.功能:载入文件但不执行代码块,对于相同的文件每次都会执行。只是编译代码,然后将编译结果作为一个函数返回
2.调用:loadfile("filename")
3.错误处理:不引发错误,只返回错误值但不处理错误,即返回nil和错误消息
4.优点:调用一次之后可以多次调用返回的结果(即函数),
即“多次调用”只需编译一次(注:这里的多次调用 是指多次调用返回的函数,而不是多次调用loadfile)
dofile可如下定义:1234function (filename) local f = assert(loadfile(filename)) return f()end
12345注:加载了程序块并没有定义其中的函数。在Lua中,函数定义是一种赋值操作,是在运行时才完成的操作。例如:一个文件test.lua中有一个函数 function foo(x) print(x) end ,执行如下代码: f = loadfile(test.lua) --加载程序块,此时还没有定义函数foo f() --运行加载的程序块,此时 ...
SLua for Unity简要技术原理
动态更新对于游戏来说非常重要,它可以极大缩短bug修复、新功能添加的时间成本,同时强制版本更新造成的用户流失也是一大痛点。对于Unity游戏开发者来说,Slua是一个不错的选择。
这里简要介绍一下Slua的技术原理,Slua Github的项目主页好像没有提及,一些关键代码看起来也都集成到dll文件中了,很难从源码找出一些原理方面的线索。用一个完全不清楚原理的库感觉很慌啊,挖掘了一些有意义的信息,基本可以解释Slua的技术原理,这里罗列一下。
Lua C API 教程
前一篇文章介绍了怎么从 C 程序中调用 Lua 代码。但内容并没有深入,还有很多东西需要反复去尝试,并且需要通过 Lua 辅助来调用 C 程序。 本章将着重介绍如何继续扩展你的 Lua 程序 - 在Lua中调用C函数。
剖析一个 Lua 程序对 C 的调用从 Lua 的角度来看,调用 C 程序其实就是调用一个模块,在Lua中一个代码块称为chunk,一个chunk里面通常有若干函数,这些函数用table存储。而Lua的C扩展模块也是可以这样实现的,Lua调用C函数时,并不依赖于函数名、包的位置,而只依赖于注册函数时传入的函数地址。
一个简单的 Lua 程序,调用一个包含了 foo 和 bar 函数的 mylib 模块:
123local mylib = require "mylib"print(mylib.foo())print(mylib.bar())
上面的代码 require "mylib" 语句加载了一个名为 mylib 的模块,显然模块具有函数 foo 和 bar。所以 C 程序不仅需要定义 foo() 和 bar() 函数,还需要将自己注册为 ...