编写自己的CA和TA与逆向

参考内容《手机安全和可信应用开发》
https://note.youdao.com/s/MTlG4c1w

介绍

TA的全称是Trust Application, 即可信任应用程序。 CA的全称是Client Applicant, 即客户端应用程序。 TA运行在OP-TEE的用户空间, CA运行在REE侧。 CA执行时代入特定的UUID和命令ID参数就能实现请求特定TA执行特定操作的需求, 并将执行结果返回给CA。 通过CA对TA的调用可实现在REE侧对安全设备和安全资源的操作。 普通用户无法知道TA的具体实现, 例如操作使用了什么算法、 操作了哪些资源、 获取了哪些数据等, 这也就确保了相关资源和数据的安全。

编写自己的第一个TA程序

在这里插入图片描述
Android.mk是安卓编译,
host/main.c==>CA:共五步:1.初始化上下文;2.打开会话;3.发送命令和参数;4.关闭会话;5.结束上下文。
hello_world_ta.c==>TA,分别对应CA五步的入口操作

CA


int main(void)
{
//1.--------------------------------------------------------------------------------------------    
    res = TEEC_InitializeContext(NULL, &ctx);
    if (res != TEEC_SUCCESS)
        errx(1, "TEEC_InitializeContext failed with code 0x%x", res);
//2.--------------------------------------------------------------------------------------------
    res = TEEC_OpenSession(&ctx, &sess, &uuid,
                   TEEC_LOGIN_PUBLIC, NULL, NULL, &err_origin);
    if (res != TEEC_SUCCESS)
        errx(1, "TEEC_Opensession failed with code 0x%x origin 0x%x",
            res, err_origin);
//3.--------------------------------------------------------------------------------------------    
    memset(&op, 0, sizeof(op));

    op.paramTypes = TEEC_PARAM_TYPES(TEEC_VALUE_INOUT, TEEC_NONE,
                     TEEC_NONE, TEEC_NONE);
    op.params[0].value.a = 42;

    printf("Invoking TA to increment %d\n", op.params[0].value.a);
    res = TEEC_InvokeCommand(&sess, TA_HELLO_WORLD_CMD_INC_VALUE, &op,
                 &err_origin);command 
    if (res != TEEC_SUCCESS)
        errx(1, "TEEC_InvokeCommand failed with code 0x%x origin 0x%x",
            res, err_origin);
    printf("TA incremented value to %d\n", op.params[0].value.a);
//4.---------------------------------------------------------------------------------------------
    TEEC_CloseSession(&sess);
//5.--------------------------------------------------------------------------------------------
    TEEC_FinalizeContext(&ctx);

    return 0;
}

TA


TEE_Result TA_CreateEntryPoint(void)
{
    DMSG("has been called");

    return TEE_SUCCESS;
}


void TA_DestroyEntryPoint(void)
{
    DMSG("has been called");
}


TEE_Result TA_OpenSessionEntryPoint(uint32_t param_types,
        TEE_Param __maybe_unused params[4],
        void __maybe_unused **sess_ctx)
{
    uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_NONE,
                           TEE_PARAM_TYPE_NONE,
                           TEE_PARAM_TYPE_NONE,
                           TEE_PARAM_TYPE_NONE);

    DMSG("has been called");

    if (param_types != exp_param_types)
        return TEE_ERROR_BAD_PARAMETERS;

    (void)&params;
    (void)&sess_ctx;


    IMSG("Hello 0xCC!\n");


    return TEE_SUCCESS;
}


void TA_CloseSessionEntryPoint(void __maybe_unused *sess_ctx)
{
    (void)&sess_ctx; /* Unused parameter */
    IMSG("Goodbye! 0xCC \n");
}

static TEE_Result inc_value(uint32_t param_types,
    TEE_Param params[4])
{
    uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INOUT,
                           TEE_PARAM_TYPE_NONE,
                           TEE_PARAM_TYPE_NONE,
                           TEE_PARAM_TYPE_NONE);

    DMSG("has been called");

    if (param_types != exp_param_types)
        return TEE_ERROR_BAD_PARAMETERS;

    IMSG("Got value: %u from NW", params[0].value.a);
    params[0].value.a += 10;  ///42+10 = 52
    IMSG("Increase value to: %u", params[0].value.a);

    return TEE_SUCCESS;
}

static TEE_Result dec_value(uint32_t param_types,
    TEE_Param params[4])
{
    uint32_t exp_param_types = TEE_PARAM_TYPES(TEE_PARAM_TYPE_VALUE_INOUT,
                           TEE_PARAM_TYPE_NONE,
                           TEE_PARAM_TYPE_NONE,
                           TEE_PARAM_TYPE_NONE);

    DMSG("has been called");

    if (param_types != exp_param_types)
        return TEE_ERROR_BAD_PARAMETERS;

    IMSG("Got value: %u from NW", params[0].value.a);
    params[0].value.a--;
    IMSG("Decrease value to: %u", params[0].value.a);

    return TEE_SUCCESS;
}

TEE_Result TA_InvokeCommandEntryPoint(void __maybe_unused *sess_ctx,
            uint32_t cmd_id,
            uint32_t param_types, TEE_Param params[4])
{
    (void)&sess_ctx; /* Unused parameter */

    switch (cmd_id) {
    case TA_HELLO_0xCC_CMD_INC_VALUE:
        return inc_value(param_types, params);
    case TA_HELLO_0xCC_CMD_DEC_VALUE:
        return dec_value(param_types, params);
    default:
        return TEE_ERROR_BAD_PARAMETERS;
    }
}

TA属性说明


#ifndef USER_TA_HEADER_DEFINES_H
#define USER_TA_HEADER_DEFINES_H

/* To get the TA UUID definition */
#include <hello_0xcc_ta.h>

#define TA_UUID                TA_HELLO_0xCC_UUID
TA识别号
/*
 * TA properties: multi-instance TA, no specific attribute
 * TA_FLAG_EXEC_DDR is meaningless but mandated.
 */
#define TA_FLAGS            TA_FLAG_EXEC_DDR
表示TA是否支持多个会话实例
/* Provisioned stack size */
#define TA_STACK_SIZE            (2 * 1024)
TA运行时栈大小
/* Provisioned heap size for TEE_Malloc() and friends */
#define TA_DATA_SIZE            (32 * 1024)
TA运行时堆空间大小 TEE_Malloc就是从这个空间中分配
/* The gpd.ta.version property */
#define TA_VERSION    "1.0"
版本信息
/* The gpd.ta.description property */
#define TA_DESCRIPTION    "Example of OP-TEE Hello 0xCC Trusted Application"
TA的描述字段
/* Extra properties */
#define TA_CURRENT_TA_EXT_PROPERTIES \
    { "org.linaro.optee.examples.hello_world.property1", \
    USER_TA_PROP_TYPE_STRING, \
        "Some string" }, \
    { "org.linaro.optee.examples.hello_world.property2", \
    USER_TA_PROP_TYPE_U32, &(const uint32_t){ 0x0010 } }
通过宏定义描述gp.ta.description和gp.ta.version
#endif /* USER_TA_HEADER_DEFINES_H */

运行结果

在这里插入图片描述
在这里插入图片描述

逆向

将uuid.ta的程序逆向,可以看到是跟编写的代码一致的,一般是从TA_InvokeCommandEntryPoint函数开始看起,因为大部分功能是从这里来的。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NB水表能承受最大的水压是多少?

NB水表&#xff0c;作为新一代智能水表&#xff0c;以小巧的体积、稳定的性能和强大的功能赢得了市场的认可。那么&#xff0c;它究竟能承受多大的水压呢&#xff1f;接下来&#xff0c;小编来为大家揭秘下&#xff0c;一起来看下吧&#xff01; 一、NB水表概述 NB水表&#xf…

森利威尔SL4010 升压恒压 12V升压24V 12V升压36V 12V升压48V

在当今的电子设备中&#xff0c;电源管理系统的设计是非常重要的。为了保证设备的稳定运行&#xff0c;升压和恒压电源的应用已经成为不可或缺的一部分。在这篇文章中&#xff0c;我们将介绍森利威尔SL4010升压恒压电源&#xff0c;它可以实现12V升压24V、12V升压36V、12V升压4…

2023亚太杯数学建模竞赛C题新能源电动汽车数据分析与代码讲解

C题论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解、问题4模型的建立和求解、问题5模型的建立和求解&#xff09;、模型的评价等等&#xff0c; 视频讲解如下&…

C++算法入门练习——相同的二叉查找树

将第一组n​个互不相同的正整数先后插入到一棵空的二叉查找树中&#xff0c;得到二叉查找树T1​&#xff1b;再将第二组n个互不相同的正整数先后插入到一棵空的二叉查找树中&#xff0c;得到二叉查找树T2​。判断T1​和T2​​是否是同一棵二叉查找树。 二叉查找(搜索)树定义&am…

基于springboot实现校园在线拍卖系统项目【项目源码】

基于springboot实现校园在线拍卖系统演示 Javar技术 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&…

Jmeter 分布式压测

为什么要分布式 jmeter是100%纯java开发的程序&#xff0c;虚拟用户是以线程实现的&#xff0c;在大量并发情况下&#xff0c;很容易出现CPU、内存消耗过大的问题&#xff0c;甚至会出现java内存溢出。一般一台电脑设置500-600线程数即可&#xff0c;如果超过1000线程&#xf…

【UE5】组成部分

了解UE游戏的基本构成 资源&#xff08;Asset&#xff09;: 在UE中&#xff0c;资源&#xff08;Asset&#xff09;是指游戏中使用到的各种素材&#xff0c;例如模型、纹理、材质、声音、动画、蓝图、数据表格、关卡等&#xff08;通常以uasset结尾&#xff09;&#xff0c;他…

2022年全国英烈纪念设施数据,各区县均有!

中国是一个拥有悠久历史和灿烂文化的国家&#xff0c;其英烈纪念设施承载着中国人民对为国家独立、民族解放和民主进步而英勇斗争的先烈们的崇敬和缅怀之情。 这些设施不仅是中国革命历史和先烈精神的重要载体&#xff0c;也是传承红色文化、弘扬革命精神的重要场所。 今天分享…

nint和Pattern matching介绍(C#)

nint 最近看C# 9.0时&#xff0c;发现一个有意思的关键词&#xff0c;就是nint&#xff0c;第一次看到这个&#xff0c;于是好奇心爆棚&#xff0c;就去实际操作了一下。 nint i 1000; Console.WriteLine("i{0}", i);实际结果与int的结果是一样的&#xff0c;那为什…

智能配电室电力监控系统

智能配电室电力监控系统是一种专门针对配电室的电力设备进行实时监控和管理的系统。依托电易云-智慧电力物联网&#xff0c;它采用先进的技术手段&#xff0c;对配电室内的电气设备和环境进行全方位、实时的监测和控制&#xff0c;以确保配电室的安全、稳定运行。 该系统的主要…

戳穿人工智能的六个谎言:辨别真伪

目录 1. AI是智能的 2. 始终越大越好 3. AI毫无透明度和问责制可言 4. AI一贯正确 5. AI严重冲击就业市场 6. AI主宰人类 主要结论 相关拓展 人工智能&#xff08;AI&#xff09;无疑是我们这个时代的流行语。特别是随着ChatGPT等生成式AI应用程序的出现&#xff0c;A…

使用Pytorch从零开始构建Transformer

在本教程中&#xff0c;我们将使用 PyTorch 从头开始​​构建一个基本的 Transformer 模型。Vaswani 等人提出的 Transformer 模型。在论文“Attention is All You Need”中&#xff0c;是一种专为序列到序列任务&#xff08;例如机器翻译和文本摘要&#xff09;而设计的深度学…

Centos7 mysql8.2.0

一、下载 选择社区开源版 二、解压安装 解压 tar -xvf mysql.tar查看是否存在mariadb&#xff0c;如果存在卸载&#xff0c;可能会有冲突 //查看mariadb rpm -qa|grep mariadb //存在即卸载 rpm -e --nodeps mariadb-libs 开始安装 //需要安装解压后其中几个rpm,包有依赖关系…

python变量、常量、数据类型

一、变量 变量是存储在内存中的值&#xff0c;这就意味着在创建变量时会在内存中开辟一个空间。 基于变量的数据类型&#xff0c;解释器会分配指定内存&#xff0c;并决定什么数据可以被存储在内存中。 因此&#xff0c;变量可以指定不同的数据类型&#xff0c;这些变量可以…

C语言——利用函数递归,编写函数不允许创建临时变量,求字符串长度

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h>int my_strlen(char* str) {if(*str ! \0)return 1my_strlen(str1);elsereturn 0; }int main() {char arr[] "hello";int len my_strlen(arr); //arr是数组&#xff0c;数组传参&#xff0c;传过去的是第…

Android和iOS应用程序加固方法详解:混淆、加壳、数据加密、动态加载和数字签名实现

目录 Android和iOS应用程序加固方法详解&#xff1a;混淆、加壳、数据加密、动态加载和数字签名实现 APP 加固方式 iOS APP加固代码实现 打开要处理的IPA文件 设置签名使用的证书和描述文件 开始ios ipa重签名 APP 加固方式 iOSAPP 加固是优化 iOS安全性的一种方法&…

2020年09月 Scratch(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Scratch等级考试(1~4级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 执行下面程序,屏幕上最多会看到多少个苹果? A:10个 B:11个 C:1个 D:无法确定 答案:B 第2题 关于下面程序,说法正确的是 ? A:执行 后,马上执行

ChatGPT重磅升级!集简云支持GPT4 Turbo Vision, GPT4 Turbo, Dall.E 3,Whisper等最新模型

在11月7日凌晨&#xff0c;OpenAI全球开发者大会宣布了 GPT-4的一次大升级&#xff0c;推出了 GPT-4 Turbo号称为迄今为止最强的大模型。 此次GPT-4的更新和升级在多个方面显示出强大的优势和潜力。为了让集简云用户能快速体验新模型的能力&#xff0c;我们第一时间整理了大会发…

关于自学\跳槽\转行做网络安全行业的一些建议

很好&#xff0c;如果你是被题目吸引过来的&#xff0c;那请看完再走&#xff0c;还是有的~ 为什么写这篇文章 如何自学入行&#xff1f;如何小白跳槽&#xff0c;年纪大了如何转行等类似问题 &#xff0c;发现很多人都有这样的困惑。下面的文字其实是我以前的一个回答&#…

【EI会议投稿】第九届电子技术和信息科学国际学术会议(ICETIS 2024)

第九届电子技术和信息科学国际学术会议&#xff08;ICETIS 2024&#xff09; The 9th International Conference on Electronic Technology andInformation Science&#xff08;ICETIS 2024&#xff09; ICETIS会议始于2016年&#xff0c;先后吸引众多来自国内外高等院校、科…