x86使用execve执行一个elf文件并传递参数--代码思路分析

news2024/10/3 3:35:50

execve(const char *filename, char *const argv[ ], char *const envp[ ])

视频教程以及实际代码可以看这一个教程
其他的需要的知识
GDT表
GDT表虚拟内存
页表
任务切换
fork实现
elf文件加载

这一个是一个Linux下面的标准接口

这一个的实际作用的是执行一个可执行文件

把当前程序替换成要执行的程序, 而同时保留原程序运行的方法是,fork+exec

第二个参数是利用数组指针来传递给执行文件,并且需要以空指针(NULL)结束,最后一个参数则为传递给执行文件的新环境变量数组。

函数执行成功时没有返回值,执行失败时的返回值为-1.

#include<unistd.h>   
main()   
{   
  char *argv[ ]={"ls", "-al", "/etc/passwd", NULL};   
  char *envp[ ]={"PATH=/bin", NULL}   
  execve("/bin/ls", argv, envp);   
}  

实现的思路

CPU寄存器的初始化

在使用的时候需要一个新的页表, 记录这一个新的进程使用的地址信息

由于使用系调用的时候会记录进入的时候的CPU寄存器信息, 返回的时候弹出信息, 这一个新的进程再返回的时候, 首先使用是栈里面的记录的信息, 而不是tss表里面的信息

image-20240225191306270

返回的时候这里面的信息也需要进行更改, 如果不改变的话会返回之前的页表对应的位置

该变信息的时候可以使用tss里面的记录的esp0的值进行计算, 使用结构体syscall_frame_t(一个记录压栈时候寄存器顺序的结构体, 定位到对应的位置)

栈的初始化(参数传递)

在使用新的栈的时候, 设置esp需要减去一下系统调用的参数的位置(系统调用返回的时候使用retf会把栈里面的参数弹出来, 新的任务进入的时候栈里面没有这几个参数, 需要预留空间), 以及初始化一下main函数的参数在栈里面

image-20240225202348872

这里可以使用把所有的信息放在栈里面

实际的实现

//执行一个可执行文件
int sys_execve(char *name, char ** argv, char ** env){
    task_t *task = task_current();//获取当前的任务
    uint32_t new_page_dir = memory_create_uvm();//获取一个新的页表给任务使用
    uint32_t old_page_dir = task->tss.cr3;//记录一下现在使用的页表
    //使用这一个新的文件的名字初始化任务名字
    kernel_strncpy(task->name, get_file_name(name), TASK_NAME_SIZE);
    if(! new_page_dir)
    {
        goto exec_failed;
    }
    //获取这一个的入口, 以及加载这一个文件到新的页表里面
    //这里实际是加载一个elf文件, 以及从文件头获取他的入口地址
    //这里需要注意的是实际使用的虚拟地址是还未使用的页表里面的
    //实际加载的时候需要对使用的内存申请, 映射, 复制
    uint32_t entry = load_elf_file(task, name, new_page_dir);
    if(entry == 0){
        goto exec_failed;
    } 
    //预留一段空间放参数(main函数的参数)
    uint32_t stack_top = 栈的顶部虚拟地址 - 预留的参数保存地址;
    //为这一个任务的新页表申请一下栈空间
    int err = memory_alloc_for_page_dir(new_page_dir, 
                MEM_TASK_STACK_TOP - MEM_TASK_STACK_SIZE(实际的虚拟地址最小值), MEM_TASK_STACK_SIZE()大小, 权限(用户可使用, 可写));
    if(err < 0){
        goto exec_failed;
    }
    int argc = strings_count(argv);//获取参数的个数
    //把这一个参数按照之前图里面的格式复制到栈里面预留的空间
    //之后main函数可以直接使用
    err = copy_args((char *)stack_top, new_page_dir, argc, argv);
    if(err < 0)
    {
        goto exec_failed;
    }
    //获取记录了栈里信息的地址
    syscall_frame_t * frame = (syscall_frame_t *)(系统调用的时候记录的特权级esp - sizeof(syscall_frame_t)(实际压入的信息的大小));
    //改变特权级0的栈里面的信息用于返回
    frame->eip = entry;
    frame->eax = frame->ebx = frame->ecx = frame->edx = 0;
    frame->esi = frame->edi = frame->ebp = 0;
    frame->eflags = EFLAGS_DEFAULT | EFLAGS_IF; 
    //预留一下栈里面参数的位置
    frame->esp = stack_top - sizeof(uint32_t) * SYSCALL_PARAM_COUNT;
    //栈里面需要有初始的参数的值

    task->tss.cr3 = new_page_dir;
    mmu_set_page_dir(new_page_dir);
    //销毁之前的页表
    memory_destroy_uvm(old_page_dir);
    return 0;

exec_failed:
    if(new_page_dir){
		//错误处理
    }
    return -1;
}

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

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

相关文章

用最直观的方式解释:什么是零信任?

在网络安全领域&#xff0c;零信任&#xff08;Zero Trust&#xff09;是一种新兴的安全模型&#xff0c;旨在提高网络安全防御的效果。零信任的核心理念是不信任任何人或设备&#xff0c;即使是内部的用户或设备也不例外。这一概念可以通过一个简单易懂的故事来解释。 很久以…

Opencv(2)深浅拷贝与基本绘图(c++python

Opencv(2)深浅拷贝与基本绘图 文章目录 Opencv(2)深浅拷贝与基本绘图三、深浅拷贝四、HSV色域(1).意义(2).cvtColor()(3).inRange()(4).适应光线 三、深浅拷贝 浅拷贝是指当图像之间进行赋值时&#xff0c;图像数据并未发生复制&#xff0c;而是两个对象都指向同一块内存块。 …

NCDA视觉传达设计大赛终极攻略:助你斩获佳绩

第十二届全国高校未来设计师数字艺术设计大赛&#xff08;NCDA&#xff09; A类&#xff1a;视觉传达设计 参赛对象&#xff1a; 大学生小组&#xff1a;分①研究生组②本科生组③专科生组&#xff0c;三组分别进行评审 教师小组&#xff1a;普通高校教师&#xff0c;不分小…

森歌集成灶:以冠军标准打造健康厨房,为全民健康保驾护航

在2024年这个实施“十四五”规划的关键之年&#xff0c;健康话题无疑是公众最为关注的焦点之一。随着国家卫健委最新发布的《2022年中国居民健康素养监测情况》报告显示&#xff0c;我国居民健康素养水平稳步提升&#xff0c;厨电高端品牌森歌响应国策、顺应潮流将于2月27日-2月…

【Golang】Golang使用embed加载、打包静态资源文件

【Golang】Golang使用embed加载、打包静态资源文件 大家好 我是寸铁&#x1f44a; 总结了一篇Golang使用embed加载静态资源文件的文章✨ 喜欢的小伙伴可以点点关注 &#x1f49d; 前言 事情是这样的&#xff1a;前不久&#xff0c;有同学问我,golang怎么把静态资源文件打包成一…

ReentrantLock详解-可重入锁-默认非公平

ReentrantLock是Java中的一个可重入锁&#xff0c;也被称为“独占锁”。它基于AQS&#xff08;AbstractQueuedSynchronizer&#xff09;框架实现&#xff0c;是JDK中提供的一种线程并发访问的同步手段&#xff0c;与synchronized类似&#xff0c;但具有更多特性。 ReentrantLo…

开发一套智慧工地系统需要多少钱?

智慧工地是智慧地球理念在工程领域的行业具现&#xff0c;是一种崭新的工程全生命周期管理理念。它运用信息化手段&#xff0c;通过三维设计平台对工程项目进行精确设计和施工模拟&#xff0c;围绕施工过程管理&#xff0c;建立互联协同、智能生产、科学管理的施工项目信息化生…

【Java程序员面试专栏 算法思维】五 高频面试算法题:贪心算法

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊贪心算法,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间买卖股票的最佳时机 II贪心算法遍历整个股票交易日价格列表 price,并执行贪心策…

如何使用群晖NAS中FTP服务开启与使用固定地址远程上传下载本地文件?

文章目录 1. 群晖安装Cpolar2. 创建FTP公网地址3. 开启群晖FTP服务4. 群晖FTP远程连接5. 固定FTP公网地址6. 固定FTP地址连接 本文主要介绍如何在群晖NAS中开启FTP服务并结合cpolar内网穿透工具&#xff0c;实现使用固定公网地址远程访问群晖FTP服务实现文件上传下载。 Cpolar内…

员工如何看待年终考

对于企业管理者来说&#xff0c;年终考是对员工一年的各种工作计划部署进行检查、评价和督查,是一种必要的、有效的考核方法&#xff0c;可以有效激发员工工作积极性&#xff0c;促进企业发展&#xff0c;但是年终考真的达到了这样的效果吗&#xff1f;企业员工又是怎样看待年终…

HuggingFists系统功能介绍(5)--环境资源

模型库 模型库用于管理由HuggingFists系统自己生成的或者外部导入的各种模型。如&#xff1a;HuggingFace网站提供的各类模型可导入该模块进行统一管理及部署。该功能目前在HuggingFists的社区版中并未提供。 环境管理 环境管理-工作节点 环境管理-服务配置 环境管理主要用于与…

网络安全“三保一评”深度解析

“没有网络安全就没有国家安全”。近几年&#xff0c;我国法律法规陆续发布实施&#xff0c;为承载我国国计民生的重要网络信息系统的安全提供了法律保障&#xff0c;正在实施的“3保1评”为我国重要网络信息系统的安全构筑了四道防线。 什么是“3保1评”&#xff1f; 等保、分…

docker小知识:linux环境安装docker

安装必要软件包&#xff0c;执行如下命令 yum install -y yum-utils device-mapper-persistent-data lvm2目的是确保在安装 Docker 之前&#xff0c;系统已经安装了必要的软件包和服务&#xff0c;以支持 Docker 的正常运行。设置yum源&#xff0c;添加Docker官方的CentOS存储…

虹科技术|PTP时钟源设备全攻略:从普通时钟到透明时钟的进阶之路

导读&#xff1a;在现代通信技术中&#xff0c;精确时间同步对于保障网络性能至关重要。PTP&#xff08;Precision Time Protocol&#xff09;时钟源设备作为实现高精度时间同步的关键组件&#xff0c;其配置和选择对于网络架构师和工程师来说至关重要。本文将探讨普通时钟和透…

【JS】事件绑定方法自带一个形参e“function(e)”,what is e?

在学习js的时候 我跳过了一部分章节的内容&#xff0c;导致现在学习react的时候很多内容都不知所措&#xff0c;因为这些教程都是建立在它认为你js所有内容都掌握的前提下&#xff0c;当然这是我自身的原因。需要反省。 下面是正题&#xff1a; 我们知道js有很多事件&#…

举个栗子!Quick BI 技巧(6):词云图的制作及应用

众所周知&#xff0c;在数据分析中&#xff0c;词云图常用来制作用户画像和用户标签&#xff0c;应用场景非常多。例如&#xff0c;我们可以对所有的产品名称进行分析。它可以很直观的告诉我们&#xff1a;哪些产品的销售额更突出&#xff0c;并且还可以通过词云与地图的数据联…

React歌词滚动效果(跟随音乐播放时间滚动)

首先给audio绑定更新时间事件 const updateTime e > {console.log(e.target.currentTime)setCurrentTime(e.target.currentTime);};<audiosrc{currentSong.url}ref{audio}onCanPlay{ready}onEnded{end}onTimeUpdate{updateTime}></audio>当歌曲播放时间改变的时…

抖音视频评论采集软件|抖音数据抓取工具

抖音视频评论采集软件是一款基于C#开发的高效、便捷的工具&#xff0c;旨在为用户提供全面的数据采集和分析服务。该软件不仅支持通过关键词进行搜索抓取&#xff0c;还能够通过分享链接进行单个视频的抓取和下载&#xff0c;让用户轻松获取抖音视频评论数据。 其中&#xff0c…

macOS 12 Monterey 支持电脑型号macOS Monterey 12新功能

macOS 12 Monterey是苹果公司于2021年6月8日在WWDC2021上正式发布的操作系统。这个版本的macOS带来了许多新功能&#xff0c;包括快捷指令、Mac和iPad的通用控制等。 其中&#xff0c;通用控制功能在后续的版本更新中得到了进一步的完善和优化。在2022年5月13日发布的macOS Mo…

4.测试教程 - 用例篇

文章目录 1.测试用例的基本要素2.测试用例的给我们带来的好处3.测试用例的设计方法3.1基于需求进行测试用例的设计3.1.1功能需求测试分析3.1.2非功能需求测试分析 3.2具体的设计方法3.2.1等价类3.2.2边界值3.2.3错误猜测法3.2.4判定表3.2.5场景设计法3.2.6因果图3.2.7因果图的需…