linux劫持系统调用connect

本文介绍了如何在64位CentOS系统中,通过劫持系统调用`__NR_connect`来实现网络监控的需求。详细阐述了相关代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为实现网络监控,故需要监控系统调用函数__NR_connect 

系统环境  64 位 CentOS


代码如下:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/list.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <asm/unistd.h>
#include <linux/dirent.h>
#include <linux/stat.h>
#include <linux/fs.h>
#include <linux/proc_fs.h>
#include <asm/uaccess.h>

#include <net/sock.h>
#include <net/netlink.h>

#define CALLOFF 100
#define SP_INTERCEPT_SOCKET_NETLINK 28
//define idtr and idt struct

char psname[10] = "hello";
char *processname = psname;

static char *mod_name = "hook";
module_param(mod_name, charp, 0);

struct{
    unsigned short limit;
    unsigned int base;
}__attribute__((packed))idtr;

struct{
    unsigned short off_low;
    unsigned short sel;
    unsigned char none;
    unsigned char flags;
    unsigned short off_high;
}__attribute__((packed))*idt;

struct _idt
{
    unsigned short offset_low,segment_sel;
    unsigned char reserved,flags;
    unsigned short offset_high;
};

/*unsigned long *getscTable()
{
    unsigned char idtr[6] = {0}, *shell = NULL, *sort = NULL;
    struct _idt *idtLong = NULL;
    unsigned long system_call = 0, sct = 0;
    unsigned short offset_low = 0, offset_high = 0;
    char *p = NULL;
    int i = 0;

    __asm__("sidt %0" : "=m" (idtr));

    idtLong=(struct _idt*)(*(unsigned long*)&idtr[2]+8*0x80);
    offset_low = idtLong->offset_low;
    offset_high = idtLong->offset_high;
    system_call = (offset_high<<16)|offset_low;

    shell=(char *)system_call;
    sort="\xff\x14\x85";

    for(i=0;i<(100-2);i++)
    {
        if(shell[i] == sort[0] && shell[i+1] == sort[1] && shell[i+2] == sort[2])
	{
	    break;
	}
    }

    p = &shell[i];
    p += 3;

    sct=*(unsigned long*)p;
    return (unsigned long*)(sct);
}*/

//define function, Point to the system being hijacked

struct linux_dirent
{
    unsigned long     d_ino;
    unsigned long     d_off;
    unsigned short    d_reclen;
    char    d_name[1];
};

//asmlinkage long (*orig_getdents)(unsigned int fd, struct linux_dirent __user *dirp, unsigned int count);

/*
struct sockaddr
{
    unsigned short sa_family;
    char sa_data[14];
};

struct in_addr 
{
    unsigned long s_addr;
};
*/
//struct sockaddr_in
//{
  //  short int sin_family; /* Internet地址族*/
  //  unsigned short int sin_port; /* 端口号*/
  //  struct in_addr sin_addr; /* Internet地址*/
  //  unsigned char sin_zero[8]; /* 填充0(为了保持和struct sockaddr一样大小)*/
//};

asmlinkage long (*orig_getdents)(int fd, struct sockaddr __user *dirp, int addrlen);

//int orig_cr0 = 0;
unsigned long *sys_call_table = NULL;

//add by liangz 2016-06-13
void spinfo_destroy_netlink();
static struct mutex ply_cs_mutex;
static struct sock *nl_sk = NULL;
//policy list
typedef struct _NetworkCtrl_
{
    // 是否启用
    bool bEnable;
    //ip:port
    char website[2048];

}NetworkCtrl, *PNetworkCtrl;

PNetworkCtrl sp_ply_info = NULL;

//get function system_call addr
/*void* get_system_call(void)
{
    printk(KERN_ALERT "start get_system_call...\n");
    void * addr = NULL;
    asm("sidt %0":"=m"(idtr));
    idt = (void*) ((unsigned long*)idtr.base);
    addr = (void*) (((unsigned int)idt[0x80].off_low) | (((unsigned int)idt[0x80].off_high)<<16 ));
    return addr;
}*/

//find sys_call_table

char* findoffset(char *start)
{
    printk(KERN_ALERT "start findoffset...\n");
    char *p = NULL;
    int i = 0;
    /*for(p=sta
<think>嗯,用户之前问过如何禁用手机硬件摄像头并使用虚拟摄像头,现在他们的问题是“系统级调用变成虚拟摄像头”。我需要先理解用户的具体需求。可能他们希望系统级别的应用或服务能够调用虚拟摄像头而不是物理摄像头,类似于之前的问题但更深入系统层面。 首先,回顾之前的回答,我提到了系统级禁用需要Root权限,修改配置文件或者卸载驱动模块,还有非Root方案如权限管控和虚拟摄像头工具。现在用户提到系统级调用,可能需要更深入的系统修改,比如替换系统默认的摄像头服务,或者通过虚拟驱动层来拦截和重定向摄像头调用。 用户可能希望他们的手机在系统级别上将所有摄像头请求重定向到虚拟摄像头,而不仅仅是应用层面的权限控制。这可能涉及到Android系统的底层架构,比如HAL(硬件抽象层)或者内核驱动。对于普通用户来说,这样的操作需要Root权限,并且需要一定的技术知识,比如编译自定义内核或修改系统服务。 接下来,我需要考虑可能的解决方案。例如,使用Xposed框架或Magisk模块来拦截摄像头调用,或者开发一个虚拟摄像头驱动。另外,Android 10以上支持虚拟摄像头API,可能可以通过开发一个虚拟摄像头应用来实现系统级调用,但需要系统签名权限,普通用户可能无法实现。 用户可能是开发者或高级用户,想要彻底替换系统摄像头硬件抽象层,或者希望所有应用,包括系统应用,都使用虚拟摄像头。这时候可能需要参考Android的开源项目,修改HAL层代码,重新编译系统镜像,并刷入设备。这对大多数用户来说难度较大,但确实是一种方法。 另外,还需要考虑不同Android版本的区别。较新版本可能限制了底层访问,而旧版本可能更容易修改。同时,虚拟摄像头的实现方式可能有多种,比如使用NDK开发一个虚拟设备节点,或者利用现有的开源项目如v4l2loopback在Android上的移植版本。 还要提醒用户风险,如系统不稳定、安全漏洞、失去保修等。建议用户根据自身情况选择合适的方法,优先考虑非Root方案或物理遮挡,如果必须系统级调用,可能需要专业开发或使用特定工具。 最后,确保回答结构清晰,分步骤说明可能的方案,并强调注意事项,帮助用户做出明智的决定。</think>--- 要将系统级摄像头调用重定向至虚拟摄像头,需从驱动层或框架层实现硬件请求的拦截与数据替换。以下是技术实现路径及操作指南: --- ### **一、系统级实现原理** Android摄像头调用流程: $$应用层 \xrightarrow{API调用} 框架层(Camera2 API) \xrightarrow{JNI} 原生层(libcamera) \xrightarrow{HAL} 内核驱动$$ **目标**:在HAL层或内核层插入虚拟摄像头驱动,劫持硬件调用。 --- ### **二、具体实现方案** #### **1. HAL层虚拟化(需Root+自定义ROM)** **步骤**: 1. **修改HAL接口**: - 定位HAL库文件:`/vendor/lib/hw/camera.[厂商名].so` - 使用`LD_PRELOAD`注入自定义库,重写`open()`、`enumerate_devices()`等函数 ```c // 伪代码示例:劫持摄像头打开请求 int camera_open(const struct hw_module_t* module, const char* id, struct hw_device_t** device) { return virtual_camera_open(module, id, device); // 指向虚拟设备 } ``` 2. **数据流替换**: - 将`dequeueBuffer`/`queueBuffer`操作映射到虚拟视频源(如预录视频/图像流) **工具要求**: - Android NDK编译环境 - 熟悉Camera HAL v3/v4接口规范 --- #### **2. 内核虚拟设备(Linux内核支持)** **使用v4l2loopback模块**: ```bash # 在已Root的手机上操作 adb push v4l2loopback.ko /system/lib/modules adb shell insmod /system/lib/modules/v4l2loopback.ko # 创建虚拟设备节点 adb shell mknod /dev/video99 c 81 0 ``` **数据输入**: ```bash adb forward tcp:8080 tcp:8080 ffmpeg -i input.mp4 -f v4l2 /dev/video99 # 通过网络传输视频流 ``` --- #### **3. 框架层劫持(Xposed/Magisk模块)** **推荐工具**: - **Xposed模块**:`VirtualCameraForAndroid` - **Magisk模块**:`Camera Redirector` **实现逻辑**: - Hook `CameraService::connect()`方法 - 将物理摄像头ID替换为虚拟设备ID(如`/dev/virtual_cam0`) --- ### **三、免Root替代方案** #### **1. Android虚拟摄像头API(限Android 10+)** ```java // 注册虚拟摄像头 VirtualCameraConfig config = new VirtualCameraConfig.Builder() .setDisplayName("VirtualCam") .setSensorOrientation(90) .build(); VirtualCamera virtualCamera = device.createVirtualCamera(config); ``` #### **2. Scrcpy反向投屏** ```bash scrcpy --v4l2-sink=/dev/video20 # 将手机屏幕转为虚拟摄像头 ``` --- ### **四、开发资源** 1. **开源项目参考**: - [Android Virtual Camera](https://github.com/arthenica/virtual-camera) - [v4l2loopback安卓移植版](https://github.com/warren-bank/android-v4l2loopback) 2. **调试工具**: - `dumpsys media.camera`:查看摄像头调用栈 - `strace -e trace=file camerademo`:追踪摄像头设备访问 --- ### **注意事项** 1. **兼容性问题**:不同厂商的HAL实现差异大(如高通/MTK/Exynos) 2. **性能损耗**:软件编码可能导致帧率下降(建议分辨率≤720p) 3. **安全风险**:系统级修改可能触发DRM保护或支付类APP风控 建议优先测试**Magisk模块方案**,其对系统侵入性较低。如需深度定制,可参考AOSP代码中`frameworks/av/services/camera/libcameraservice`实现逻辑。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值