首页 > 其他分享 >文件重定位简单实现和对抗

文件重定位简单实现和对抗

时间:2022-09-28 22:14:46浏览次数:47  
标签:定位 src int fd 文件 path open 对抗

文件重定向是一个文件重定位到另外一个文件。重定向后,当一个文件的发生打开,读写这些行为,就会变成另外一个文件的打开,读写。

文件重定向多用于过风控,改机,多开等场景中。

实现

作为实现重定向的一方,有许多实现方式,下面的例子是用frida脚本hook libc.so下的open函数,在open函数被调用的时候,根据文件名来判断是否对打开的重定向,最后将文件描述符返回。

function strcmp(str1,str2){
    let ret = -1;

	for(let i = 0; ;i++){
		let ch1 = str1.add(i).readU8();
		let ch2 = str2.add(i).readU8();
		
		if(ch1 == 0 && ch2 == 0){
		    ret = 0;
			break;
		}
		
		if(ch1 != ch2){
		    ret = -1;
		    break;
		}
		
	}
	
	return ret;
}


function redirect(src,dest){
    const openPtr = Module.getExportByName('libc.so', 'open');
    const open = new NativeFunction(openPtr, 'int', ['pointer', 'int']);
    Interceptor.replace(openPtr, new NativeCallback((pathPtr, flags) => {
        const path = pathPtr.readUtf8String();
        
        const originPath = Memory.allocUtf8String(src)
        let currentPath = Memory.allocUtf8String(path)
        let fd = -1
        if(strcmp(currentPath,originPath) == 0){
           console.warn('redirect file "' + path + '" to "' + dest + '"');
           let targetPath = Memory.allocUtf8String(dest)
           fd = open(targetPath, flags);
        }
        else{
            console.log('open file "' + path + '"');
            fd = open(pathPtr, flags);
        }
        return fd;
    }, 'int', ['pointer', 'int']));

}

redirect("/proc/cpuinfo","/data/data/com.luoye.fileredirectdetect/cpuinfo")

经过hook之后,当app打开/proc/cpuinfo,文件路径就被重定向到了自定义的文件路径。open函数返回的是新的文件的文件描述符。

对抗

既然hook之后返回的是新的文件的文件描述符,那么,对抗方就可以打开需要检测的文件,然后调用readlink函数反推文件路径,如果readlink返回的文件路径和打开的文件不一致,那么说明打开的文件被重定位到其他文件去了。

/**
 * 检查文件是否被重定位
 * @src_path 要检查的文件
 * @new_path 被重定位到的路径
 * @return 0 没有重定位;1 被重定位
 */
int checkFileRedirect(const char *src_path,char *new_path,size_t max_len) {
    int src_fd = open(src_path,O_RDONLY);
    if(src_fd < 0){
        return 0;
    }
    int ret = 0;
    char link_path[128] = {0};
    snprintf(link_path, sizeof(link_path), "/proc/%d/fd/%d", getpid(), src_fd);
    char fd_path[256] = {0};
    int link = readlink(link_path, fd_path, sizeof(fd_path));

    if(link < 0){
        return 0;
    }

    size_t len = strnlen(fd_path,256);

    if(len && strncmp(fd_path,src_path,256) != 0) {
        strncpy(new_path, fd_path,max_len);

        ret = 1;
    }

    if(src_fd > 0) {
        close(src_fd);
    }

    return ret;
}

下图是在多开软件中检测到的路径重定向结果:

当然这只是提供的一个思路,文件重定位可以有其他实现,对抗也可以有其他实现,想要做得更好,需要更多的想象力。

标签:定位,src,int,fd,文件,path,open,对抗
From: https://www.cnblogs.com/luoyesiqiu/p/file_redirect.html

相关文章

  • php-fpm指定配置文件及php相关配置命令
    [root@hostnamecentos7sbin]#./php-fpm-c/usr/local/php/etc/php.ini-y/usr/local/php/etc/php-fpm.conf ......
  • Linux开发环境搭建与使用——Linux 目录结构及文件
    在windows平台下,打开“计算机”,我们看到的是一个个的盘符:在Linux下,我们是看不到这些盘符,我们看到的是文件夹(目录):在早期的UNIX系统中,各个厂家各自定义了自己的UNIX系......
  • NET6 web项目读取 appsettings配置文件
    可以在appsettings中配置数据量连接字符串等数据,便于项目发布后的配置首先,创建ConfigHelper类namespaceTestProject.services{publicclassConfigHelper{......
  • CPU 占用过高定位分析
    1、top命令查看占用cpu高的进程2、jps或者ps-ef命令查看该进程相关信息3、通过进程编号(pid)查询占用CPU高的线程//ps-mp进程编号-oTHREAD,tid,time......
  • vue 入口文件使用 Element 的 confirm
    引入ElementUI,单独引入文件的都能使用importElementUIfrom'element-ui';Element.MessageBox.confirm('是否要跳转段落?','提示',{confirmButtonText:'是',......
  • 关于文件下载时服务端http header的设置
    最近想要实现通过浏览器下载html文件时直接打开,而不是下载的功能,了解了下这方面相关的几个header设置项,简单记录下。主要是content-type和content-disposition这两项,这两......
  • 虚拟机挂载到开发板的脚本文件,可以指定挂载目录,能自动设置开发板的ip
    虚拟机挂载到开发板的脚本文件,可以指定挂载目录,能自动设置开发板的ip:echo-e"未占用IP\n">ip#把ip重定向到ip文件里,作为记录src=10.221.0.71:/home/wencong#虚拟机需......
  • Linux磁盘管理与文件系统
    了解磁盘盘片:硬盘有多个盘片,每盘片2面磁头:每面一个磁头扇区:盘片被分为多个扇形区域,每个扇区存放512字节的数据,硬盘的最小存储单位磁道:同一盘片不同半径的同心圆,......
  • Julia生成的csv文件中文内容打开后乱码
    Translator  Julia语言生成csv的代码片段是这样滴:  打开的csv文件是这样滴  解决方法:用notepad++打开,更改encoding方式为UTF-8BOM,之后用excel打开......
  • 文件相关命令
    一、文件目录类pwd指令基本语法:pwd功能:显示当前工作的绝对目录ls指令基本语法:ls[选项][目录或者文件]常用选项-a显示所有文件及目录(.开头的隐藏文件也会列出)......