LUA的使用

背景

LUA刚流行起来的时候,想学习一下LUA。就找了一款使用LUA脚本引擎的游戏玩。希望从中了解LUA的使用

结果

熟悉了LUA的同时也熟悉了这款游戏。

准备工作

使用detoured withdll注入LUAK.dll。LUAK.dll用于管理LUA环境

procedure PROCESS_ATTACH(); stdcall
begin//  Msg_hwd := TMsg_hwd.Create;HookAPI_init;
end;

拦截了 函数:lua_pushstring lua_setfield lua_pushcclosure luaL_newstate luaL_openlibs luaL_loadbuffer lua_pushlstring lua_tointeger lua_pushinteger lua_pushboolean lua_toboolean lua_createtable lua_resume lua_pushnumber lua_settop lua_tolstring lua_settable lua_pushlightuserdata lua_newthread lua_pushnil lua_tonumber luaL_checknumber lua_yield lua_type lua_typename lua_gettable lua_isstring lua_pcall lua_getfield luaopen_table luaopen_math luaopen_string luaopen_base lua_close lua_touserdata

procedure HookAPI_init;
vardwProtect, temp, k: cardinal;
begin//writelogfs('HookAPI_init');LoadLuaLib('Lua5.dll');writelogfs('LoadLuaLib');LUA_HMODULE := fLibHandle;@Oldlua_pushstringFunction := GetProcAddress(LUA_HMODULE, 'lua_pushstring');if assigned(Oldlua_pushstringFunction) thenOldlua_pushstringAddress := DWORD(@Oldlua_pushstringFunction);Spylua_pushstringAddress := DWORD(@Spylua_pushstring);VirtualProtect(@Oldlua_pushstringFunction, 6, PAGE_EXECUTE_READWRITE, @dwProtect);move(PChar(Oldlua_pushstringAddress)[0], tmpBuff_lua_pushstring[0], 6);PChar(Oldlua_pushstringAddress)^ := #$FF;PChar(Oldlua_pushstringAddress + 1)^ := #$25;PInteger(Oldlua_pushstringAddress + 2)^ := DWORD(@Spylua_pushstringAddress);VirtualProtect(@Oldlua_pushstringFunction, 6, dwProtect, @temp);//@Oldlua_setfieldFunction := GetProcAddress(LUA_HMODULE, 'lua_setfield');if assigned(Oldlua_setfieldFunction) thenOldlua_setfieldAddress := DWORD(@Oldlua_setfieldFunction);Spylua_setfieldAddress := DWORD(@Spylua_setfield);VirtualProtect(@Oldlua_setfieldFunction, 6, PAGE_EXECUTE_READWRITE, @dwProtect);move(PChar(Oldlua_setfieldAddress)[0], tmpBuff_lua_setfield[0], 6);PChar(Oldlua_setfieldAddress)^ := #$FF;PChar(Oldlua_setfieldAddress + 1)^ := #$25;PInteger(Oldlua_setfieldAddress + 2)^ := DWORD(@Spylua_setfieldAddress);VirtualProtect(@Oldlua_setfieldFunction, 6, dwProtect, @temp);@Oldlua_pushcclosureFunction := GetProcAddress(LUA_HMODULE, 'lua_pushcclosure');if assigned(Oldlua_pushcclosureFunction) thenOldlua_pushcclosureAddress := DWORD(@Oldlua_pushcclosureFunction);Spylua_pushcclosureAddress := DWORD(@Spylua_pushcclosure);VirtualProtect(@Oldlua_pushcclosureFunction, 6, PAGE_EXECUTE_READWRITE, @dwProtect);move(PChar(Oldlua_pushcclosureAddress)[0], tmpBuff_lua_pushcclosure[0], 6);PChar(Oldlua_pushcclosureAddress)^ := #$FF;PChar(Oldlua_pushcclosureAddress + 1)^ := #$25;PInteger(Oldlua_pushcclosureAddress + 2)^ := DWORD(@Spylua_pushcclosureAddress);VirtualProtect(@Oldlua_pushcclosureFunction, 6, dwProtect, @temp);//@OldluaL_newstateFunction := GetProcAddress(LUA_HMODULE, 'luaL_newstate');if assigned(OldluaL_newstateFunction) thenOldluaL_newstateAddress := DWORD(@OldluaL_newstateFunction);SpyluaL_newstateAddress := DWORD(@SpyluaL_newstate);VirtualProtect(@OldluaL_newstateFunction, 6, PAGE_EXECUTE_READWRITE, @dwProtect);move(PChar(OldluaL_newstateAddress)[0], tmpBuff_luaL_newstate[0], 6);PChar(OldluaL_newstateAddress)^ := #$FF;PChar(OldluaL_newstateAddress + 1)^ := #$25;PInteger(OldluaL_newstateAddress + 2)^ := DWORD(@SpyluaL_newstateAddress);VirtualProtect(@OldluaL_newstateFunction, 6, dwProtect, @temp);@OldluaL_openlibsFunction := GetProcAddress(LUA_HMODULE, 'luaL_openlibs');if assigned(OldluaL_openlibsFunction) thenOldluaL_openlibsAddress := DWORD(@OldluaL_openlibsFunction);SpyluaL_openlibsAddress := DWORD(@SpyluaL_openlibs);VirtualProtect(@OldluaL_openlibsFunction, 6, PAGE_EXECUTE_READWRITE, @dwProtect);move(PChar(OldluaL_openlibsAddress)[0], tmpBuff_luaL_openlibs[0], 6);PChar(OldluaL_openlibsAddress)^ := #$FF;PChar(OldluaL_openlibsAddress + 1)^ := #$25;PInteger(OldluaL_openlibsAddress + 2)^ := DWORD(@SpyluaL_openlibsAddress);VirtualProtect(@OldluaL_openlibsFunction, 6, dwProtect, @temp);@OldluaL_loadbufferFunction := GetProcAddress(LUA_HMODULE, 'luaL_loadbuffer');if assigned(OldluaL_loadbufferFunction) thenOldluaL_loadbufferAddress := DWORD(@OldluaL_loadbufferFunction);SpyluaL_loadbufferAddress := DWORD(@SpyluaL_loadbuffer);VirtualProtect(@OldluaL_loadbufferFunction, 6, PAGE_EXECUTE_READWRITE, @dwProtect);move(PChar(OldluaL_loadbufferAddress)[0], tmpBuff_luaL_loadbuffer[0], 6);PChar(OldluaL_loadbufferAddress)^ := #$FF;PChar(OldluaL_loadbufferAddress + 1)^ := #$25;PInteger(OldluaL_loadbufferAddress + 2)^ := DWORD(@SpyluaL_loadbufferAddress);VirtualProtect(@OldluaL_loadbufferFunction, 6, dwProtect, @temp);

数据分析

在luaL_loadbuffer 中保存LUA代码到文件中,便于以后的分析。

       if trim(name) = '' thenbeginSpyluaL_loadstring_count := SpyluaL_loadstring_count + 1;save_fn := Logpath + 'loadbuffer_' + inttostr(SpyluaL_loadstring_count) + '.lua';endelsebeginsave_fn := Logpath + stringreplace(name, ':', '_', [rfReplaceAll]) + inttostr(sz);end;ForceDirectories(ExtractFilePath(save_fn));ms := TMemoryStream.Create;ms.Write(buff[0], sz);ms.Position := 0;ms.SaveToFile(save_fn);FreeAndNil(ms);sl := TStringList.Create;sl.Add('L=' + inttostr(integer(L)));sl.SaveToFile(save_fn + '.txt');FreeAndNil(sl);last_sz := sz;last_ch1 := buff[0];last_ch2 := buff[1];

也可以在这里修改LUA代码,例如 

  setlength(lua, sz);Move(buff[0], lua[1], sz);if pos('gf_SetPlayerInvincible(nTime)', lua) > 0 thenbeginfun_name := 'luaL_loadbuffer';lua := lua + #13#10 + ' gf_SetPlayerInvincible(10000) ';result := OldluaL_loadbufferFunction(L, pchar(lua), length(lua), name);lua := stringreplace(lua, 'return szCIP;', ' gf_SetPlayerInvincible(10000);'#13#10'return szCIP;', [rfIgnoreCase]);writelogfs(fun_name + ' gf_SetPlayerInvincible');endelsebeginresult := OldluaL_loadbufferFunction(L, buff, sz, name);end;lua := '';

 LUA源码记录到文件中之后,可以先看看文件中的LUA源码进行学习。俺的经验是先看文件尺寸,选大的。

 

然后就可以从这些LUA的源码中学习LUA的源码,在学习LUA的源码同时也可以熟悉这个游戏

随着学习LUA代码,发现了这个游戏有很多新手对话任务。这些任务只要执行 

idx=8101; 
ClientAcceptTask(idx);
ClientCompleteTask(idx);

就可以领取并完成任务,这样就可以获得经验并升级。

工具

任务列表,从lua源码中提取的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/406324.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 实现自定义异常

在Python编程中,异常处理是保证程序健壮性的重要机制。Python提供了一些内置的异常类,如ValueError、TypeError、IndexError等,开发者可以直接使用这些类来捕获和处理程序运行中出现的各种错误。然而,某些场景下,内置的…

无人机使用材料与结构特点详解,看完这篇文你就懂了!!!

一、常用材料 无人机的常用材料主要包括机身材料(结构材料和非结构材料)、发动机材料和涂料,其中最主要的是机身结构材料和发动机材料。 机身结构材料 低速无人机:主要使用木材、塑料、玻璃纤维或碳纤维复合材料蜂窝夹层结构。…

SQL Server数据库查询常用语句汇总

这里,汇总了在使用SQL Server数据库的过程中经常会写的查询语句。 情形1 根据时间查询最新一条数据 (dtime类型为datetime) select top 1 名称 as name,列名1 as parname1,列名2 as parname2,dtime,col1,col2 from demo order by dtime …

【基础算法总结】多源 BFS_多源最短路问题

多源 BFS_多源最短路问题 1.多源 BFS_多源最短路问题2.01 矩阵3.飞地的数量4.地图中的最高点5.地图分析 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&…

NtripShare全站仪自动化监测之气象改正

最近有幸和自动化监测领域权威专家进行交流,讨论到全站仪气象改正的问题,因为有些观点与专家不太一致,所以再次温习了一下全站仪气象改正的技术细节。 气象改正的概念 全站仪一般利用光波进行测距,首先仪器会处理测距光波的相位漂…

SpingBoot 两种方式配置多数据源

第一种&#xff1a;使用与MyBaits-Plus师出同门的“dynamic-datasource-spring-boot-starter” 官网地址&#xff1a; 基础必读&#xff08;免费&#xff09; dynamic-datasource 看云 1&#xff1a;引入依赖 <!-- 苞米豆多数据源 --> <dependency><group…

科技大厂对AI的垄断

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

ios白苹果修复办法有哪些?

在这个数字化时代&#xff0c;iPhone作为智能手机的佼佼者&#xff0c;早已融入了我们生活的方方面面。然而&#xff0c;当那熟悉的开机画面——“白苹果”意外地成为了你的日常&#xff0c;无疑让人头疼不已。别担心&#xff0c;今天我们就来聊聊iOS白苹果现象的成因及几种有效…

C#实现数据采集系统-多设备采集

系统功能升级-多设备采集 数据采集系统在网络环境下&#xff0c;性能足够&#xff0c;可以实现1对多采集&#xff0c;需要支持多个设备进行同时采集功能&#xff0c;现在就开发多设备采集功能 修改多设备配置 设备配置 将DeviceLink 改成List集合的DeviceLinks删掉Points&a…

运维开发——局域网SSH访问服务器与应用

摘要 本博文主要介绍局域网SSH访问登陆虚拟机和及其应用相关配置操作。 1. 局域网SSH访问登陆虚拟机 目标&#xff1a;在局域网内A电脑使用SSH登陆B电脑上虚拟机的服务器。 前提条件:B电脑为宿主机&#xff0c;可以正常使用ssh访问虚拟机服务器&#xff0c;虚拟机网络连接方…

数学强化| 李林880重点题速刷计划

快9月了&#xff0c;有的同学还没开始强化&#xff0c;进度确实有点慢了&#xff0c;有同学问&#xff1a; 刚开始强化&#xff0c;880题该如何快速刷完&#xff1f; 听我说&#xff0c;别急&#xff01;越是强化开始的晚&#xff0c;就越不能急&#xff0c;因为强化的作用有两…

【Datawhale AI 夏令营】第四期 基于2B源大模型 微调

定位&#xff1a;代码复现贴 教程&#xff1a;https://datawhaler.feishu.cn/wiki/PLCHwQ8pai12rEkPzDqcufWKnDd 模型加载 model AutoModelForCausalLM.from_pretrained(path, device_map"auto", torch_dtypetorch.bfloat16, trust_remote_codeTrue )AutoModelForC…

AI学习记录 - 如何快速构造一个简单的token词汇表

创作不易&#xff0c;有用的话点个赞 先直接贴代码&#xff0c;我们再慢慢分析&#xff0c;代码来自openai的图像分类模型的一小段 def bytes_to_unicode():"""Returns list of utf-8 byte and a corresponding list of unicode strings.The reversible bpe c…

压测工具哪个好?LoadRunner、Jmeter、Locust、Wrk 全方位对比....

当你想做性能测试的时候&#xff0c;你会选择什么样的测试工具呢&#xff1f;是会选择wrk&#xff1f;jmeter&#xff1f;locust&#xff1f;还是loadrunner呢&#xff1f;今天&#xff0c;笔者将根据自己使用经验&#xff0c;针对jmeter、locust、wrk和loadrunner常用的性能测…

前后端部署-服务器linux中部署Node.js环境

一.安装分布式版本管理系统Git (Alibaba Cloud Linux 3/2、CentOS 7.x) sudo yum install git -y 二.使用Git将NVM的源码克隆到本地的~/.nvm目录下&#xff0c;并检查最新版本。 git clone https://gitee.com/mirrors/nvm.git ~/.nvm && cd ~/.nvm && gi…

RVG29;狂犬病病毒肽;狂犬病病毒糖蛋白;115136-25-9;YTIWMPENPRPGTPCDIFTNSRGKRASNG

【RVG29 简介】 RVG29&#xff08;狂犬病病毒肽&#xff09;是一种由29个氨基酸组成的细胞穿透肽&#xff0c;它来源于狂犬病病毒糖蛋白。RVG肽能够特异性识别并结合中枢神经系统中普遍存在的烟碱型乙酰胆碱受体&#xff08;nAChR&#xff09;&#xff0c;并通过受体介导的转胞…

AR 眼镜之-系统应用音效-实现方案

目录 &#x1f4c2; 前言 AR 眼镜系统版本 系统应用音效 1. &#x1f531; 技术方案 1.1 技术方案概述 1.2 实现方案 1&#xff09;初始化 2&#xff09;播放音效 3&#xff09;释放资源 2. &#x1f4a0; 播放音效 2.1 静音不播放 2.2 获取音效默认音量 3. ⚛️ …

2.初识springcloud

文章目录 1.什么是SpringCloud1.1版本的介绍 2.Spring Cloud实现方案3.环境搭建4.服务拆分原则5.数据准备5.1订单服务5.2商品服务 大家好&#xff0c;我是晓星航。今天为大家带来的是 初识springcloud 相关的讲解&#xff01;&#x1f600; 1.什么是SpringCloud 简单来说&…

【算法基础实验】图论-最小生成树-Prim的即时实现

理论知识 Prim算法是一种用于计算加权无向图的最小生成树&#xff08;MST, Minimum Spanning Tree&#xff09;的贪心算法。最小生成树是一个连通的无向图的子图&#xff0c;它包含所有的顶点且总权重最小。Prim算法从一个起始顶点开始&#xff0c;不断将权重最小的边加入生成…

Excel表格添加趋势线_数据拟合

一个曲线通过补偿算法拟合为另一个曲线&#xff0c;通常可以通过多种数学和计算技术实现。这里也可以通过Excel表格添加趋势线&#xff0c;然后对趋势线进行拟合&#xff0c;得到趋势预测公式来达到数据补偿。 通过把你需要的数据导入到Excel表格中。 通过 “ 插入 ” --> “…