触动精灵对某东cookie读取并解密--记lua调用C语言
在Mac上构建Lua扩展模块:AES解密与Base64解码实战
今天我要分享一个实用技术:如何在Mac系统上为Lua编写和编译C扩展模块,特别是实现一个某东iOS PIN码解密功能的扩展。这对于需要在Lua环境中执行高性能计算或使用底层系统功能的开发者非常有用。
起因
某东ios环境中是对pin,wskey进行加密存储在plist中的,具体可参阅我之前的文章
某电商ios版WJLoginInfo.plist和*DLoginInfo.plist文件的应用与安全机制分析
那我们常用的触动精灵,只有aes-ecb加解密函数,并没有aes-cbc 加解密函数,所以使用起来很不方便
想要从plist中读取加密的cookie,并还原出明文的话,更是困难重重。
所以,本文即探讨如何使用lua的配合c代码自行编译so,用来解密此cookie,方便手机中直接读取明文。
下面实操(本文仅做技术探讨,故已经抹去关键信息,仅做抛砖引玉功能)
1. 安装Lua 5.2
由于目标环境使用的是Lua 5.2,首先需要在Mac上安装相应版本:
# 下载Lua 5.2.1源码
# 下载地址:http://www.lua.org/ftp/lua-5.2.1.tar.gz# 解压并进入目录
cd lua-5.2.1# 编译和安装
sudo make macos
sudo make install
安装完成后,可以通过启动Lua解释器来验证安装:
$lua
Lua 5.2.1 Copyright (C) 1994-2012 Lua.org, PUC-Rio
>
2. 编写C扩展模块
接下来,我们将创建一个名为mt.c的C源文件,实现两个主要功能:
- 一个简单的Hello World函数
- 一个更复杂的IosPinDecode函数,用于解密特定格式的数据
cd src
touch mt.c
下面是核心C代码结构(出于安全考虑,部分实现细节已隐去):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#include <CommonCrypto/CommonCrypto.h>/* 库 open 函数的前置声明 */
int luaopen_mt(lua_State *L);/* * Base64 URL Safe 解码函数* [实现细节已隐藏]*/
static unsigned char* base64_url_decode(const char* input, size_t* output_length) {// 实现Base64 URL Safe解码// ...
}/** 将十六进制字符串转换为字节数组*/
static void hex_to_bytes(const char* hex, unsigned char* bytes, size_t len) {// 将十六进制字符串转换为字节数组// ...
}/** AES-CBC 解密函数 每东ios中pin和wskey的关键加解密信息*/
static unsigned char* aes_cbc_decrypt(const unsigned char* data, size_t data_len,const char* key_hex, const char* iv_hex, size_t* out_len) {// 使用CommonCrypto进行AES-CBC解密// ...
}/** 从JSON字符串中提取指定字段值,直接从加密后的ck解析出完整的pin=xxxxx;wskey=xxxxxx;*/
static char* extract_json_field(const char* json, const char* field_name) {// 提取JSON字段// ...
}/** 检查JSON中是否同时包含pin和a2字段*/
static int has_pin_and_a2(const char* json) {// 检查字段存在性// ...
}/** IosPinDecode 函数实现 - 解密并格式化PIN数据*/
static int mt_ios_pin_decode(lua_State *L) {// 1. 获取传入的编码数据// 2. Base64 URL安全解码// 3. 选择合适的密钥// 4. AES-CBC解密// 5. 处理解密结果并返回// ...
}/* * Hello World函数,本函数仅用来测试so是否正常加载和工作,并没有实际作用。*/
static int mt_hello_world(lua_State *L)
{const char * name_str = "hello lua so,hello world";lua_pushstring(L, name_str);return 1;
}/* 注册函数库 */
static const luaL_Reg mt_lib[] = {{"hello_world", mt_hello_world},{"IosPinDecode", mt_ios_pin_decode},{NULL, NULL}
};/* 库初始化函数 */
int luaopen_mt(lua_State *L)
{luaL_newlib(L, mt_lib);return 1;
}
3. 编译为共享库
编译过程分为两步:
第一步:编译C源文件为目标文件
xcrun -sdk iphoneos clang -c -arch arm64 mt.c -o mt.o
第二步:链接为共享库
本次xcode版本为Version 16.0 (16A242d)
xcrun -sdk iphoneos clang -arch arm64 -isysroot $(xcrun -sdk iphoneos --show-sdk-path) \-I/path/to/lua/include \-L/path/to/lua/lib \-mios-version-min=11.0 \-O3 \-fmodules \-fobjc-arc \-shared \-undefined dynamic_lookup \-Wl,-install_name,@rpath/mt.so \-o mt.so mt.c
编译过程中可能会出现以下警告,但通常不影响使用:
ld: warning: -undefined dynamic_lookup is deprecated on iOS
ld: warning: search path '/path/to/lua/lib' not found
4. 在Lua中使用扩展模块
编译完成后,可以在Lua或触动精灵脚本中使用这个模块:
-- 加载模块
local mt = require "mt"-- 调用Hello World函数
print(mt.hello_world())-- 使用PIN解码功能
local encoded = "PqtjjdPxnYc15Ur6a7HxuHMB4_digJ2kesa2TCMRdI3_A5vIogWxWqIwWDgpVFUw..."
local decoded = mt.IosPinDecode(encoded)
print(decoded)
最后解密结果如图


技术要点解析
-
Base64 URL Safe解码:处理特殊的Base64编码,其中"-“替代”+“,”_“替代”/"
-
AES-CBC解密:使用CommonCrypto库实现AES-CBC模式解密
-
JSON字段提取:简单的JSON解析实现,专注于提取特定格式的字段
-
Lua C API使用:
luaL_checkstring()获取Lua传入的字符串参数lua_pushstring()将结果返回给LualuaL_newlib()注册函数集合
总结
通过这个项目,我们学习了如何:
- 在Mac上安装和配置Lua环境
- 编写C扩展模块实现高性能功能
- 使用XCode工具链编译iOS兼容的共享库
- 在Lua环境中调用自定义C函数
这种方法非常适合需要在Lua脚本中执行性能敏感操作或访问系统底层功能的应用场景。特别是在移动自动化测试、游戏开发或需要处理加密数据的场景中,这种扩展方式能显著提升性能和扩展功能范围。
希望这个教程对你有所帮助!如有任何问题,欢迎在评论区交流。
相关文章:
触动精灵对某东cookie读取并解密--记lua调用C语言
在Mac上构建Lua扩展模块:AES解密与Base64解码实战 今天我要分享一个实用技术:如何在Mac系统上为Lua编写和编译C扩展模块,特别是实现一个某东iOS PIN码解密功能的扩展。这对于需要在Lua环境中执行高性能计算或使用底层系统功能的开发者非常有…...
分布式中间件:基于 Redis 实现分布式锁
分布式中间件:基于 Redis 实现分布式锁 一、背景引入 在当今的互联网应用中,分布式系统变得越来越常见。在分布式环境下,多个服务实例可能会同时对共享资源进行读写操作,这就很容易引发数据不一致等问题。比如电商系统中的库存扣…...
鸿蒙开发工程师简历项目撰写全攻略
一、项目结构的黄金法则 建议采用「41」结构: 项目背景(业务价值)技术架构(鸿蒙特性)核心实现(技术难点)个人贡献(量化成果)附加价值(延伸影响) …...
MSE分类时梯度消失的问题详解和交叉熵损失的梯度推导
下面是MSE不适合分类任务的解释,包含梯度推导。以及交叉熵的梯度推导。 前文请移步笔者的另一篇博客:大模型训练为什么选择交叉熵损失(Cross-Entropy Loss):均方误差(MSE)和交叉熵损失的深入对比…...
【设计模式】三十二、策略模式
系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式定义与核心思想二、模式结构与Java实现1. 核心角色2. Java代码示例 三、策略模式的五大核心优势四、适用场景五、与其他模式的对比六、最佳实践建议总结 🚀进阶版【更…...
Cyberchef实用功能之-json line格式文件美化和查询
本文将介绍一下如何使用cyberchef对json line格式数据进行美化方便阅读,以及json line格式数据的批量查询操作。 之前的文章介绍了json格式数据的美化和查询,即Cyberchef实用功能之-json解析美化和转换,Cyberchef实用功能之-批量提取json数据…...
Java求101-200之间有多少素数
Java学习笔记 今天看教程看到了这个题,对于一名打过算法竞赛的选手还是很简单的,但由于之前是c组的,所以用java写一下,练一下手。 代码: package com.itheima.hello;public class Test1 {public static void main(S…...
计算机基础:编码03,根据十进制数,求其原码
专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:计算机基础:编码02,有符号数编码…...
FaryGui文字shader修改,弧线排列
因项目要求,希望将文字进行标题那样的弧线排列,如下图: 对FaryGUI的文字Shader进行了一些修改,基本达到要求,shader设置如下: shader代码如下: // Upgrade NOTE: replaced _Object2World with unity_ObjectToWorld // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with Un…...
QT笔记---JSON
QT笔记---JSON JSON1、JSON基本概念1.1、判断.json文件工具 2、生成.json数据3、解析.json数据 JSON 在现代软件开发中,数据的交换和存储格式至关重要。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式,以其简洁易…...
C++ string的模拟实现
Hello!!大家早上中午晚上好,昨天复习了string的使用,今天来模拟实现一下string!!! 一、string的框架搭建 1.1首先我们需要一个string的头文件用来做变量、函数、类等声明;再需要一个test文件来做测试,还需…...
使用LangChain实现基于LLM和RAG的PDF问答系统
目录 前言一.大语言模型(LLM)1. 什么是LLM?2. LLM 的能力与特点 二、增强检索生成(RAG)三. 什么是 LangChain?1. LangChain 的核心功能2. LangChain 的优势3. LangChain 的应用场景4. 总结 四.使用 LangChain 实现基于 PDF 的问答系统 前言 本文将介绍 …...
图像滤波中常用滤波器的相位响应——不是只有零相位滤波器
实偶函数滤波器 当滤波器是实偶函数时,其滤波结果的相位在通带内为 0 或 π \pi π,正频率和负频率成分的相位相同。这种相位特性使得实偶函数滤波器在低通滤波、平滑处理等需要保持信号相位不失真的应用中非常有用。 实偶函数特性: 滤波器…...
学习CSS滤镜属性 `filter: invert()`
一、核心机制 数学原理 invert(1) 对每个像素的RGB通道执行 颜色反相计算: 新通道值 255 - 原通道值 例如 rgb(255,0,0)(纯红)会转换为 rgb(0,255,255)(青色)。 透明度处理 该滤镜会保留元素的Alpha通道(…...
C++实现rabbitmq生产者消费者
RabbitMQ是一个开源的消息队列系统,它实现了高级消息队列协议(AMQP), 特点 可靠性:通过持久化、镜像队列等机制保证消息不丢失,确保消息可靠传递。灵活的路由:提供多种路由方式,如…...
在VMware上部署【Ubuntu】
镜像下载 国内各镜像站点均可下载Ubuntu镜像,下面例举清华网站 清华镜像站点:清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下: 创建虚拟机 准备:在其他空间大的盘中创建存储虚拟机的目录,…...
【Pandas】pandas Series plot.barh
Pandas2.2 Series Plotting 方法描述Series.plot([kind, ax, figsize, …])用于绘制 Series 对象的数据可视化图表Series.plot.area([x, y, stacked])用于绘制堆叠面积图(Stacked Area Plot)Series.plot.bar([x, y])用于绘制垂直条形图(Ver…...
检索增强生成(2)本地PDF 本地嵌入模型
from langchain_community.document_loaders import PyPDFLoader from pathlib import Pathdef load_local_pdf(file_path):if not Path(file_path).exists():raise FileNotFoundError(f"文件 {file_path} 不存在!")loader PyPDFLoader(file_path)try:do…...
又双叒叕Scrapy爬虫相关的面试题及详细解答
Scrapy是Python开发的一个快速、高层次的网络爬虫框架,专注于高效抓取网页并提取结构化数据。其核心设计基于异步处理机制,适合大规模数据采集任务。 文章目录 基础概念1. Scrapy框架的核心组件有哪些?架构与流程2. 描述Scrapy的工作流程核心组件详解3. 如何自定义Item Pipe…...
【QA】装饰模式在Qt中有哪些运用?
在Qt框架中,装饰模式(Decorator Pattern)主要通过继承或组合的方式实现,常见于IO设备扩展和图形渲染增强场景。以下是Qt原生实现的装饰模式典型案例: 一、QIODevice装饰体系(继承方式) 场景 …...
【保姆级】阿里云codeup配置Git的CI/CD步骤
以下是通过阿里云CodeUp的Git仓库进行CI/CD配置的详细步骤,涵盖前端(Vue 3)和后端(Spring Boot)项目的自动化打包,并将前端打包结果嵌入到Nginx的Docker镜像中,以及将后端打包的JAR文件拷贝至Do…...
使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)
1.STM32CubeMX配置 (1)配置SYS (2)配置RCC (3)配置串口,此处我用的是串口4,其他串口也是一样的 (4)配置DMA,将串口4的TX和RX添加到DMA中 &#…...
【视觉提示学习】3.21论文随想
. . Frontiers of Information Technology & Electronic Engineering. 2024, 25(1): 42-63 https://doi.org/10.1631/FITEE.2300389 中文综述,根据里面的架构,把视觉提示学习分成两类,一类是单模态提示学习(以vit为代表&…...
(一)丶Windows安装RabbitMQ可能会遇到的问题
一丶可能会忘了配置ERLang的环境变量 二丶执行命令时报错 第一步 rabbitmq-plugins enable rabbitmq_management 第二部 rabbitmqctl status 三丶修改.erlang.cookie 文件 1.找到C盘目下的.erlang.cookie文件 C:\Users\admin\.erlang.cookie C:\Windows\System32\config\sys…...
Mistral AI发布开源多模态模型Mistral Small 3.1:240亿参数实现超越GPT-4o Mini的性能
法国人工智能初创公司Mistral AI于2025年3月正式推出新一代开源模型Mistral Small 3.1 ,该模型凭借240亿参数的轻量级设计,在多项基准测试中表现优异,甚至超越了Google的Gemma 3和OpenAI的GPT-4o Mini等主流专有模型。 1、核心特性与优势 多…...
如何在IPhone 16Pro上运行python文件?
在 iPhone 16 Pro 上运行 Python 文件需要借助第三方工具或远程服务,以下是具体实现方法和步骤: 一、本地运行方案(无需越狱) 使用 Python 编程类 App 以下应用可在 App Store 下载,支持直接在 iPhone 上编写并运行 …...
springboot整合mybatis-plus【详细版】
目录 一,简介 1. 什么是mybatis-plus2.mybatis-plus特点 二,搭建基本环境 1. 导入基本依赖:2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三,基本知识介绍 1. 基本注解 T…...
视频剪辑行业的现状与进阶之路:一个双视角分析
视频剪辑行业的现状与进阶之路:一个双视角分析 一、现状解析 商业角度分析 成本控制 培训需要投入时间和人力成本 快节奏的市场环境要求快速产出 人员流动性大,培训投入可能无法获得长期回报 市场需求 大量内容需要快速产出 标准化的剪辑模板更容易管理 …...
k近邻图(knn-graph)和局部线性嵌入图(LLE-graph)的相似性和区别
K 近邻图(KNN - graph)和局部线性嵌入图(LLE - graph)是用于构建数据点之间关系图的两种方法。 1. k近邻图(knn-graph) 核心思想:k近邻图通过计算样本之间的距离来构建图。具体来说,…...
Qt之MVC架构MVD
什么是MVC架构: MVC模式(Model–view–controller)是软件工程中的一种软件架构模式,把软件系统分为三个基本部分:模型(Model)、视图(View)和控制器(Controll…...
