文章目录

  • 导读
    • 开发环境
  • 预备知识
    • luaL_loadbuffer
    • frida拦截器Interceptor
    • NativeFunction创建目录
  • 分析思路
    • 挂起启动WeGame
    • hook函数luaL_loadbufferx保存所有js
  • 参考资料

导读

开发环境

版本号 描述
操作系统 Win11-21H2 内部版本号22000.588
Python Python3.7.1
frida.exe 15.0.18

预备知识

luaL_loadbuffer

函数原型(https://www.lua.org/manual/5.1/manual.html#luaL_loadbuffer):

int luaL_loadbuffer (lua_State *L,               // Lua句柄const char *buff,           // lua脚本size_t sz,                  // lua脚本字节数const char *name);           // 标记(通过分析可以发现这里是文件名)

将缓冲区加载为 Lua 块。此函数用于加载lua_load指向的缓冲区中的块。 name是块名称,用于调试信息和错误消息。

WeGame中使用的是Lua51.dll,它导出了两个函数luaL_loadbufferluaL_loadbufferx,通过IDA分析可以猜测,luaL_loadbufferx只是比luaL_loadbuffer多了个参数a5,其他参数都是一样的。

frida拦截器Interceptor

frida的Interceptor模块中,attach函数原型为Interceptor.attach(target, callbacks[, data]),实现了对参数target进行hook的操作,下面是简单的参数分析:

  • target: 这是一个 NativePointer,指定您想要拦截调用的函数的地址。我们可以通过Module.getExportByName()来获取可执行文件的导出函数作为该参数,frida会自动处理。
  • callbacks: 顾名思义,这是hook的回调函数集合,里面包含了hook前和hook后两个回调函数。
    • onEnter(args): 该回调函数的参数args为hook函数的参数数组,每个参数都是一个NativePointer对象,我们可以在这里获取参数信息,或者篡改参数内容。
    • onLeave(retval): 该调用是执行完目标函数后的处理,参数retval是一个NativePointer对象,是目标函数的返回值,我们可以修改该指针内容达到hook的目的。
  • data: 可选参数,暂时忽略掉。

示例:

Interceptor.attach(Module.getExportByName('libc.so', 'read'), {onEnter(args) {this.fileDescriptor = args[0].toInt32();// this上下文信息:包含寄存器信息context、返回值地址returnAddress、线程ID threadId等console.log('Context information:');console.log('Context  : ' + JSON.stringify(this.context));console.log('Return   : ' + this.returnAddress);console.log('ThreadId : ' + this.threadId);console.log('Depth    : ' + this.depth);console.log('Errornr  : ' + this.err);},onLeave(retval) {if (retval.toInt32() > 0) {/* do something with this.fileDescriptor */}}
});

ps: callbacks是一个对象,frida实现中,会在初始化的时候,给该对象填充上下文信息信息,这也就是为什么示例中的this可以访问context、returnAddress、threadId这些内容。

ps2: 之前一直纠结onEnter中生成的变量,怎么在onLeave中使用,其实直接通过this就可以了this.tempVal=333;。这都是对js的基础理解和应用。

NativeFunction创建目录

frida调用dll函数,通过NativeFunction创建一个函数对象,设置响应的参数和返回值。

本文使用的是WinExec函数调用了cmd命令中的mkdir指令来实现创建目录,具体实现看下面的代码。

ps: 也可以使用c函数中的system,其原型如下:

分析思路

挂起启动WeGame

为了保证hook所有的lua,需要挂起启动WeGame,使用命令frida -f 应用程序全路径即可挂起启动目标进程,命令行示例:

D:\Python\Python371\Scripts\frida.exe -f "G:\Program Files (x86)\WeGame\wegame.exe"

WeGame需要管理员权限启动,否则会报0x000002e4的启动失败错误。

hook函数luaL_loadbufferx保存所有js

var fnWinExec = new NativeFunction(Module.findExportByName('Kernel32.dll', 'WinExec'),'int', ['pointer', 'int'],'stdcall'
);function ez_fnWinExec(jsStr) {console.log( 'ez_fnWinExec: ', jsStr );var cStrPointer = Memory.allocUtf8String(jsStr);fnWinExec(cStrPointer, 0);
}Interceptor.attach(Module.getExportByName('Lua51.dll', 'luaL_loadbufferx'), {onEnter(args) {// 不可以使用数组解构赋值!!!//       var [_,a,b]=[0,1,3]// var [L, buff, sz, name] = args;var buff = args[1];var sz = args[2];var name = args[3];console.log( name.readCString(), sz.toInt32(), buff );// 过滤非lua文件if (!name.readCString().endsWith('.lua')){return;}var pth = 'D:\\_TMP\\wegame\\' + name.readCString();// 创建文件夹var dir_ = pth.substr(0, pth.lastIndexOf('\\')+1);ez_fnWinExec('cmd.exe /c mkdir '+ dir_);// 保存文件var f = new File(pth, 'wb');var data = buff.readByteArray(sz.toInt32());f.write(data);f.close();},onLeave(retval) {}
});

一开始想的是不需要调用函数WinExec,优化一下可以写成“一行”代码的,后来发现多级目录,得自己创建目录,又加上了一堆的代码。。。
所以,就不再是“一行”代码实现了。

参考资料

  • [frida] 00_简单介绍和使用 https://blog.csdn.net/kinghzking/article/details/123225580
  • Lua游戏逆向及破解方法介绍 https://blog.csdn.net/liujiayu2/article/details/81942010
  • qq群:夜猫逐梦技术交流裙/953949723

**ps:**文章中内容仅用于技术交流,请勿用于违规违法行为。

【frida实战】“一行”代码教你获取WeGame平台中所有的lua脚本相关推荐

  1. 一行代码教你七夕情人节如何告白❤—动漫3D相册(音乐+文字)HTML+CSS+JavaScript

    ❤ 一行代码教你七夕情人节如何告白-动漫3D相册(音乐+文字)HTML+CSS+JavaScript 七夕是中国的情人节,七夕520情人节也是一个非常适合表白的日子,可以把自己平常害怕说出来的话,在这 ...

  2. 一行代码教你帮室友戒网瘾

    一行代码教你帮室友戒网瘾,新建一个文本文档输入 dim s do until s=500 s=s+1 msgbox"别玩游戏了,滚去学习",64 loop Ctrl+S保存文本,然 ...

  3. pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值、groupby.nth函数获取每个组中的最后一个值

    pandas使用groupby.last函数获取每个组中的最后一个值实战:groupby.last函数获取每个组中的最后一个值.groupby.nth函数获取每个组中的最后一个值 目录

  4. 【PyQt5】一行代码教你一件换头像

    最近在做UI的时候碰到一个需求,客户希望能够快速的换头像,按照以前用PyQt设计的思路来看,需要以下几步: 1.将图片导入PyQt5的资源管理器内 2.将资源管理器的图片插入空间的样式表内,比如下图 ...

  5. mapbox 修改初始位置_一行代码教你如何随心所欲初始化Bert参数(附Pytorch代码详细解读)...

    微信公众号:NLP从入门到放弃 微信文章在这里(排版更漂亮,但是内置链接不太行,看大家喜欢哪个点哪个看吧): 一行代码带你随心所欲重新初始化bert的参数(附Pytorch代码详细解读)​mp.wei ...

  6. lua游戏代码_在游戏中如何使用LUA脚本语言

    当你希望在你的游戏开始的时候读取一些信息,以配置你的游戏,这些信息通常都是放到一个文本文件中,在你的游戏启动的时候,你需要打开这个文件,然后解析字符串,找到所需要的信息. 或许你认为这样就足够了,为什 ...

  7. 程序员python代码打招呼方式_某编程少年说他是Python大神,神级程序员不用一行代码教他做人!...

    听君一席话,胜读十年书. 1.扎实的python基础 个人的技术基础知识是否扎实,决定了个人是否能够做的工作层次. 比如某些Python半吊子,只能够纸上谈兵,和Python小白谈谈人生理想,而只要涉 ...

  8. 一行代码教你撩妹手到擒来❤html+css+js烟花告白3D相册(含音乐+可自定义文字)520表白/七夕情人节/求婚

    ❤ 我是如何获取学姐芳心~html+css+js实现满屏烟花3D相册(含音乐+自定义文字) 一年一度的520情人节/七夕情人节/女朋友生日/程序员表白/送礼物/3D相册,是不是要给女朋友或者正在追求的 ...

  9. 一行代码教你撩妹手到擒来html+css+js烟花告白3D相册(含音乐+可自定义文字)520表白/七夕情人节/求婚...

    ❤ 我是如何获取学姐芳心~html+css+js实现满屏烟花3D相册(含音乐+自定义文字) 一年一度的520情人节/七夕情人节/女朋友生日/程序员表白/送礼物/3D相册,是不是要给女朋友或者正在追求的 ...

  10. 一行代码教你撩妹手到擒来~html+css+js烟花告白3D相册(含音乐+可自定义文字)

    ❤ 我是如何获取学姐芳心~html+css+js实现满屏烟花3D相册(含音乐+自定义文字) 一年一度的520情人节/七夕情人节/女朋友生日/程序员表白/送礼物/3D相册,是不是要给女朋友或者正在追求的 ...

最新文章

  1. 要想成功 需要了解的东西
  2. python画笑脸图案-如何让这些代码中的一个在窗口中绘制不同大小的笑脸?
  3. 【鸿蒙 HarmonyOS】UI 组件 ( 单选按钮 | RadioButton 与 RadioContainer 组件 )
  4. ACM模板--链接表 有向图
  5. 手机算通用计算机还是,电脑手机通用的便签是哪个?有人知道吗
  6. Silverlight Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)
  7. 实验六 团队作业2—团队项目评审与团队项目选题报告
  8. android分享助手下载地址,语音导出分享助手手机版|语音导出分享助手安卓版下载 v2.1 - 跑跑车安卓网...
  9. oracle日期函数函数,Oracle日期函数
  10. mysql bit类型 查询_数据库中的bit类型
  11. 高内聚低耦合_拉锥耦合器最强粘接方案
  12. jQuery中show、hide与fadeIn、fadeOut与slideUp、slideDown与fadeToggle、fadeTo、Toggle
  13. Android监听系统来电,弹出提示窗口
  14. 1.2.3 数据模型的组成要素
  15. wordpress图文安装教程 非常详细
  16. Java实现简单的日历小程序之Java图形界面开发小日历
  17. bugku-web-source
  18. gojs实现仿启信宝股权结构关系树图
  19. BOSS和拉勾竞品分析
  20. OpenNI SDK 2.0

热门文章

  1. java生成zipf分布_统计分布-Zipf分布
  2. 高频小信号谐振放大器设计-课程设计Multisim仿真
  3. 【Python抢票神器】火车票枪票软件到底靠谱吗?实测—终极攻略。
  4. 图解傅里叶变换(时域频域)
  5. 红米k30 允许调用gpu调试层_高效渲染!RTX 3090卡皇打造NVIDIA STUDIO强力主机实战体验|nvidia|显卡|gpu|cpu|内存...
  6. 计算机视觉前沿技术探索
  7. Android emoji表情处理
  8. (三)基于Phyphox的三线摆法测量物体转动惯量
  9. 重写JavaScript特效大全 | 时钟显示在任意指定位置---01
  10. 电路(第五版)邱关源 第一章总结