触动精灵对某东cookie读取并解密--记lua调用C语言

news2025/3/22 7:58:26

在Mac上构建Lua扩展模块:AES解密与Base64解码实战

今天我要分享一个实用技术:如何在Mac系统上为Lua编写和编译C扩展模块,特别是实现一个某东iOS PIN码解密功能的扩展。这对于需要在Lua环境中执行高性能计算或使用底层系统功能的开发者非常有用。

起因

某东ios环境中是对pinwskey进行加密存储在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源文件,实现两个主要功能:

  1. 一个简单的Hello World函数
  2. 一个更复杂的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)

最后解密结果如图
在这里插入图片描述

在这里插入图片描述

技术要点解析

  1. Base64 URL Safe解码:处理特殊的Base64编码,其中"-“替代”+“,”_“替代”/"

  2. AES-CBC解密:使用CommonCrypto库实现AES-CBC模式解密

  3. JSON字段提取:简单的JSON解析实现,专注于提取特定格式的字段

  4. Lua C API使用

    • luaL_checkstring() 获取Lua传入的字符串参数
    • lua_pushstring() 将结果返回给Lua
    • luaL_newlib() 注册函数集合

总结

通过这个项目,我们学习了如何:

  1. 在Mac上安装和配置Lua环境
  2. 编写C扩展模块实现高性能功能
  3. 使用XCode工具链编译iOS兼容的共享库
  4. 在Lua环境中调用自定义C函数

这种方法非常适合需要在Lua脚本中执行性能敏感操作或访问系统底层功能的应用场景。特别是在移动自动化测试、游戏开发或需要处理加密数据的场景中,这种扩展方式能显著提升性能和扩展功能范围。

希望这个教程对你有所帮助!如有任何问题,欢迎在评论区交流。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【设计模式】三十二、策略模式

系列文章|源码 https://github.com/tyronczt/design-mode-learn 文章目录 系列文章|源码一、模式定义与核心思想二、模式结构与Java实现1. 核心角色2. Java代码示例 三、策略模式的五大核心优势四、适用场景五、与其他模式的对比六、最佳实践建议总结 &#x1f680;进阶版【更…

Cyberchef实用功能之-json line格式文件美化和查询

本文将介绍一下如何使用cyberchef对json line格式数据进行美化方便阅读&#xff0c;以及json line格式数据的批量查询操作。 之前的文章介绍了json格式数据的美化和查询&#xff0c;即Cyberchef实用功能之-json解析美化和转换&#xff0c;Cyberchef实用功能之-批量提取json数据…

计算机基础:编码03,根据十进制数,求其原码

专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏&#xff0c;故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 &#xff08;一&#xff09;WIn32 专栏导航 上一篇&#xff1a;计算机基础&#xff1a;编码02&#xff0c;有符号数编码&#xf…

FaryGui文字shader修改,弧线排列

因项目要求,希望将文字进行标题那样的弧线排列,如下图: 对FaryGUI的文字Shader进行了一些修改,基本达到要求,shader设置如下: shader代码如下: // Upgrade NOTE: replaced _Object2World with unity_ObjectToWorld // Upgrade NOTE: replaced mul(UNITY_MATRIX_MVP,*) with Un…

C++ string的模拟实现

Hello!!大家早上中午晚上好&#xff0c;昨天复习了string的使用&#xff0c;今天来模拟实现一下string&#xff01;&#xff01;&#xff01; 一、string的框架搭建 1.1首先我们需要一个string的头文件用来做变量、函数、类等声明&#xff1b;再需要一个test文件来做测试,还需…

使用LangChain实现基于LLM和RAG的PDF问答系统

目录 前言一.大语言模型(LLM)1. 什么是LLM&#xff1f;2. LLM 的能力与特点 二、增强检索生成(RAG)三. 什么是 LangChain&#xff1f;1. LangChain 的核心功能2. LangChain 的优势3. LangChain 的应用场景4. 总结 四.使用 LangChain 实现基于 PDF 的问答系统 前言 本文将介绍 …

C++实现rabbitmq生产者消费者

RabbitMQ是一个开源的消息队列系统&#xff0c;它实现了高级消息队列协议&#xff08;AMQP&#xff09;&#xff0c; 特点 可靠性&#xff1a;通过持久化、镜像队列等机制保证消息不丢失&#xff0c;确保消息可靠传递。灵活的路由&#xff1a;提供多种路由方式&#xff0c;如…

在VMware上部署【Ubuntu】

镜像下载 国内各镜像站点均可下载Ubuntu镜像&#xff0c;下面例举清华网站 清华镜像站点&#xff1a;清华大学开源软件镜像站 | Tsinghua Open Source Mirror 具体下载步骤如下&#xff1a; 创建虚拟机 准备&#xff1a;在其他空间大的盘中创建存储虚拟机的目录&#xff0c…

又双叒叕Scrapy爬虫相关的面试题及详细解答

Scrapy是Python开发的一个快速、高层次的网络爬虫框架,专注于高效抓取网页并提取结构化数据。其核心设计基于异步处理机制,适合大规模数据采集任务。 文章目录 基础概念1. Scrapy框架的核心组件有哪些?架构与流程2. 描述Scrapy的工作流程核心组件详解3. 如何自定义Item Pipe…

使用STM32CubeMX+DMA+空闲中断实现串口接收和发送数据(STM32G070CBT6)

1.STM32CubeMX配置 &#xff08;1&#xff09;配置SYS &#xff08;2&#xff09;配置RCC &#xff08;3&#xff09;配置串口&#xff0c;此处我用的是串口4&#xff0c;其他串口也是一样的 &#xff08;4&#xff09;配置DMA&#xff0c;将串口4的TX和RX添加到DMA中 &#…

【视觉提示学习】3.21论文随想

. . Frontiers of Information Technology & Electronic Engineering. 2024, 25(1): 42-63 https://doi.org/10.1631/FITEE.2300389 中文综述&#xff0c;根据里面的架构&#xff0c;把视觉提示学习分成两类&#xff0c;一类是单模态提示学习&#xff08;以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 &#xff0c;该模型凭借240亿参数的轻量级设计&#xff0c;在多项基准测试中表现优异&#xff0c;甚至超越了Google的Gemma 3和OpenAI的GPT-4o Mini等主流专有模型。 1、核心特性与优势 多…

springboot整合mybatis-plus【详细版】

目录 一&#xff0c;简介 1. 什么是mybatis-plus2.mybatis-plus特点 二&#xff0c;搭建基本环境 1. 导入基本依赖&#xff1a;2. 编写配置文件3. 创建实体类4. 编写controller层5. 编写service接口6. 编写service层7. 编写mapper层 三&#xff0c;基本知识介绍 1. 基本注解 T…

Qt之MVC架构MVD

什么是MVC架构&#xff1a; MVC模式&#xff08;Model–view–controller&#xff09;是软件工程中的一种软件架构模式&#xff0c;把软件系统分为三个基本部分&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;和控制器&#xff08;Controll…

深度解析学术论文成果评估(Artifact Evaluation):从历史到现状

深度解析学术论文成果评估(Artifact Evaluation)&#xff1a;从历史到现状 引言 在计算机科学和工程领域的学术研究中&#xff0c;可重复性和可验证性越来越受到重视。随着实验性研究的复杂性不断增加&#xff0c;确保研究成果可以被其他研究者验证和构建变得尤为重要。这一需…

二分查找上下界问题的思考

背景 最近在做力扣hot100中的二分查找题目时&#xff0c;发现很多题目都用到了二分查找的变种问题&#xff0c;即二分查找上下界问题&#xff0c;例如以下题目&#xff1a; 35. 搜索插入位置 74. 搜索二维矩阵 34. 在排序数组中查找元素的第一个和最后一个位置 它们不同于查找…

关于FastAPI框架的面试题及答案解析

FastAPl是一个现代、快速(高性能)的Web框架,用于构建API,基于Python3.7+的类型提示功能。它由Python开发者SebastianRamirez创建,并且使用了Starlette作为其核心组件以及Pydantic进行数据验证。 文章目录 基础篇1. FastAPI的核心优势是什么?2. 如何定义一个GET请求路由?…

HashMap添加元素的流程图

文章目录 JDK7 vs JDK8 的 HashMap 结构变化Java8 中哈希表的红黑树优化机制HashMap 添加元素的完整流程解析1. 计算 key 的哈希值并确定索引2. 检查该索引位置是否已有元素3. 处理哈希冲突4. 判断当前存储结构&#xff08;链表还是红黑树&#xff09;5. 判断链表长度是否超过 …

面向医药仓储场景下的药品分拣控制策略方法 研究(大纲)

面向医药仓储场景下的药品分拣控制策略方法研究 基于多机器人协同与智能调度的分拣系统设计 第一章 绪论 1.1 研究背景与意义 医药仓储自动化需求&#xff1a; 人工分拣效率低、出错率高&#xff08;如药品批次混淆、过期风险&#xff09;温控药品&#xff08;如疫苗、生物制…