对抗静态分析——番外:文件操作检测

1.文章难易度【★★★】
2.文章作者:penguin_wwy
3.本文参与 i春秋社区原创文章奖励计划,未经许可禁止转载
4.阅读基础:linux

【预备~~~起】
老子科二考挂了,哈哈哈哈哈哈哈哈哈哈
060847v9l9l491l4lx24x2.jpg

【一二三四~~~】
这篇番外主要讲的是一个Linux的特性——Inotify。这个东西的主要作用是检测文件行为,比如读取、写入、创建等等。主要有以下几个API:

int inotify_init(void);

 

int inotify_init1(int);


这两个API都是用于初始化inotify,根据Linux一切皆文件的设计观点,返回的也自然是文件描述符。第一个inotify_init(void)等同于inotify_init1(0)。除此之外还可以设置下列标志位

#define IN_CLOEXEC O_CLOEXEC

/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */

#define IN_NONBLOCK O_NONBLOCK

 

第一个IN_CLOEXEC表示对新文件描述符设置执行后关闭,第二个IN_NONBLOCK表示对新文件描述符设置O_NONBLOCK。当初始化执行失败时返回-1,并设置相应的errno。

int inotify_add_watch(int, const char*, uint32_t);


初始化完毕后设置监视,也就是添加你需要监视的文件(目录)以及你想关心的操作事件(读取、写入)。注意的是对于目录的监视不包含监视目录的子目录,监视过程不是递归的。函数的第一个参数是前一步初始化返回的文件描述符,第二个是文件或目录,最后一个是确定监视事件的监视掩码(watch mask),有以下几种

#define IN_ACCESS 0x00000001 //从文件中读

/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */

#define IN_MODIFY 0x00000002 //写入文件中

#define IN_ATTRIB 0x00000004 //文件的元数据(所有者、权限、扩展属性)

#define IN_CLOSE_WRITE 0x00000008 //写入模式打开

#define IN_CLOSE_NOWRITE 0x00000010 //未曾以写入模式打开

/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */

#define IN_OPEN 0x00000020 //文件已打开

#define IN_MOVED_FROM 0x00000040 //文件从监视目录中删除

#define IN_MOVED_TO 0x00000080 //文件已添加到监视目录中

#define IN_CREATE 0x00000100 //文件已在监视目录创建

/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */

#define IN_DELETE 0x00000200 //文件已从监视目录删除

#define IN_DELETE_SELF 0x00000400 //监视对象本身被删除

#define IN_MOVE_SELF 0x00000800 //监视对象本身被删除

#define IN_UNMOUNT 0x00002000 //文件系统被unmount

 

#define IN_Q_OVERFLOW 0x00004000 //在内核中,事件的数据超过了max_events

#define IN_IGNORED 0x00008000 //文件已被删除

#define IN_CLOSE (IN_CLOSE_WRITE | IN_CLOSE_NOWRITE)

#define IN_MOVE (IN_MOVED_FROM | IN_MOVED_TO)

/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */

#define IN_ONLYDIR 0x01000000 //Only watch the path if it is a directory

#define IN_DONT_FOLLOW 0x02000000 //Do not follow a sym link

#define IN_EXCL_UNLINK 0x04000000

#define IN_MASK_ADD 0x20000000 //Add to the mask of an already existing watch

/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */

#define IN_ISDIR 0x40000000 //Event occurred against dir

#define IN_ONESHOT 0x80000000 //Only send event once

 

最后还有一个

#define IN_ALL_EVENTS (IN_ACCESS | IN_MODIFY | IN_ATTRIB | IN_CLOSE_WRITE |   IN_CLOSE_NOWRITE | IN_OPEN | IN_MOVED_FROM |   IN_MOVED_TO | IN_DELETE | IN_CREATE | IN_DELETE_SELF |   IN_MOVE_SELF)

 

表示所有合法事件
inotify_add_watch执行成功会返回一个新的监视描述符,失败返回-1

结构体inotify_event描述了inotify事件

struct inotify_event {

 __s32 wd;

 __u32 mask;

 __u32 cookie;

/* WARNING: DO NOT EDIT, AUTO-GENERATED CODE - SEE TOP FOR INSTRUCTIONS */

 __u32 len;

 char name[0];

};

 

wd表示监视描述符,mask为监视事件掩码,name保存和路径相关的文件名,len为name中的有效长度(name中可以通过填充无效字符来保持对齐)

除了上述内容之外,当完成添加监视后,可以通过select或者poll来监视它,通过read读取获得结果。

【二二三四~~~】
我们来实际操作一下。前面提到过在APK中通过native层代码对APK加固或者执行核心程序,在对应APK的lib文件夹下会有我们的so文件。我们可以检测lib目录,检测有没有其他程序想进入该文件夹,拷贝读取等操作走我们的so文件。创建一个APK,就叫Inotify,Java层代码就不写了

native开始函数

JNIEXPORT void JNICALL

Java_com_example_inotify_MainActivity_runInotify(JNIEnv *env, jobject instance) {


    // TODO

    ALOGD("Task ============== Start");

    runInotify();


}

 

runInotify是我们的主要函数

void runInotify() {

    keep_running = 1;

    if (signal(SIGINT, signal_handle) == SIG_IGN) {

        signal(SIGINT, SIG_IGN);

    }


    int fd;

    fd = inotify_init();//初始化

    if (fd == -1) { //错误处理

        ALOGE("inotify_init error");

        switch (errno){

            case EMFILE: ALOGD("errno: EMFILE");break;

            case ENFILE: ALOGD("errno: ENFILE");break;

            case ENOMEM: ALOGD("errno: ENOMEM");break;

            default: ALOGD("unkonw errno");

        }

        return;

    }

 

    int wd;

    wd = inotify_add_watch(fd, "/data/data/com.example.inotify/lib", IN_ALL_EVENTS); //添加监视

    if (wd == -1) { //错误处理

        ALOGE("inotify_add_watch");

        switch (errno) {

            case EACCES: ALOGD("errno: EACCES");break;

            case EBADF: ALOGD("errno: EBADF");break;

            case EFAULT: ALOGD("errno: EFAULT");break;

            case EINVAL: ALOGD("errno: EINVAL");break;

            case ENOMEM: ALOGD("errno: ENOMEM");break;

            case ENOSPC: ALOGD("errno: ENOSPC");break;

            default: ALOGD("unkonw errno");

        }

        return;

    }


    while (keep_running) {

        if (event_check(fd) > 0) {

            read_event(fd);

        }

    }

    return;

}

 

初始化,然后对/data/data/com.example.inotify/lib添加监视,事件设置为所有
event_check函数调用select的进行监视操作

int event_check(int fd) {

    fd_set rfds;

    FD_ZERO(&rfds);

    FD_SET(fd, &rfds);


    return select(FD_SETSIZE, &rfds, NULL, NULL, NULL);

}

 

read_event读取inotify事件

int read_event(int fd) {

    char buffer[16384] = {0};

    size_t index = 0;

    struct inotify_event *ptr_event;


    ssize_t r = read(fd, buffer, 16384);

    if (r <= 0) {

        ALOGE("read_event");

        return r;

    }


    while (index < r) {

        ptr_event = (struct inotify_event *)&buffer[index];

        ALOGD("wd = %d mask = %d cookie = %d len = %d dir = %s\n",

        ptr_event->wd, ptr_event->mask, ptr_event->cookie, ptr_event->len,

              (ptr_event->mask & IN_ISDIR) ? "yes" : "no");

        if (ptr_event->len)

            ALOGD("name = %s", ptr_event->name);

        index += sizeof(struct inotify_event) + ptr_event->len;

    }

    return 0;

}

 

下面执行看看效果,首先开一个cmd窗口查看log
072451td5urld65tkr4qgl.png
然后我们再开一个cmd窗口到lib目录下执行操作
072530c1gqbcgetf2ueczz.png
先输入ls
072553vb43s3iek11bnaka.png
log窗口有反应了
072637v8mmbyil21uld9mh.png
再试试rm 删除当前的so文件
072659htsms5xq5lfp92wt.png
name字符串输出了libnative-lib.so
实验成功。
【三二三四~~~】
前面实验的对lib目录监控只是一方面,事实上我们可以对更对的比如解密完落地的dex,so监控或者各类资源文件监控达到对抗阻止破解的目的。Inotify同时也是双刃剑,破解方也可以记录APK目录下各类文件的操作顺序,达到某些目的。

【小结~~~】
对抗静态分析这个系列写着写着就超纲了,不过我个人觉得动态静态都是相辅相成的一环套一环,穿插在一起更有利于理解。这个系列我个人觉得差不多了,最多再有个一两篇的内容。之后写什么我也不太确定,有什么想看的关于移动安全的,或者关于逆向,源码分析方面的可以写评论,我量(kan)力(xin)而(qing)行。就酱

 更多安全技术、精品好文、白帽黑客大佬尽在:http://bbs.ichunqiu.com/portal.php

转载于:https://my.oschina.net/ichunqiu/blog/811896

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 基于信息系统体系对抗STK基础仿真应用的目的是利用信息系统构建一个与STK(Satellite Tool Kit)相对抗的仿真环境。STK是一种广泛使用的航天器轨道设计和分析工具,而基于信息系统体系的仿真应用则是通过构建信息系统体系,模拟和对抗STK的功能和性能。 信息系统体系对抗STK基础仿真应用的关键是通过信息系统的各个组成部分,如计算机硬件、操作系统、数据库等,来构建一个仿真环境。在这个仿真环境中,我们可以使用STK的相关功能和性能进行模拟,并对其进行对抗分析和评估。 例如,我们可以使用信息系统体系中的计算机硬件和操作系统来模拟STK的计算和运行环境。通过模拟STK的计算和运行过程,我们可以了解其性能和瓶颈,并进一步研究如何改进和优化。 另外,通过信息系统体系中的数据库和存储系统,我们可以模拟和存储STK的相关数据,如航天器的轨道数据、通信数据等。这些数据可以用于对抗STK的相关功能进行仿真和分析,从而评估其性能和稳定性。 基于信息系统体系对抗STK基础仿真应用还可以与其他相关的信息系统集成,以扩展仿真环境的功能和应用。例如,可以将其他仿真工具、通信系统、数据分析工具等集成到这个仿真环境中,以拓展对STK的仿真和对抗能力。 综上所述,基于信息系统体系对抗STK基础仿真应用是一种通过构建信息系统体系来模拟和对抗STK的功能和性能的方法。通过这种仿真应用,我们可以了解和评估STK的性能,并寻找改进和优化的方法。 ### 回答2: 基于信息系统体系的对抗STK基础仿真应用可以通过PDF文件形式进行描述和介绍。信息系统体系是指一套由计算机硬件和软件组成的系统,用于收集、处理、存储和传递信息。STK(Systems Tool Kit)是一个广泛应用于航天领域的工程软件,它集成了各种功能模块,可以用于建模、仿真和分析航天器运行、导航和姿态控制等。 在对抗STK基础仿真应用中,信息系统体系起着重要的作用。首先,信息系统可以提供对STK的支持,例如安装和配置STK软件,确保其正常运行。其次,信息系统可以用于存储和管理STK的仿真数据,包括输入数据、模型数据和输出数据等,以便于后续的分析和查阅。此外,信息系统还可以用于与STK进行数据交互,例如从其他系统中导入数据,或者将仿真结果导出到其他系统中进行进一步处理。 基于信息系统体系的对抗STK基础仿真应用具有多个优势。首先,信息系统可以提供更高效的数据管理和处理能力,加快仿真过程。其次,信息系统可以提供更好的数据安全性,确保仿真数据的保密性和完整性。此外,信息系统还可以提供更多的功能模块和工具,拓展STK的应用范围,实现更复杂的仿真场景。 总而言之,基于信息系统体系的对抗STK基础仿真应用通过提供安装配置、数据存储管理和数据交互等功能,可以提升STK仿真的效率和安全性,拓展其应用范围,为航天领域的仿真建模和分析工作提供有力支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值