随着网络的普及,我们的生活越来越方便,但是网络安全也成了很多人面临的一个问题。特别是那些有着商业数据的企业电脑,更要注意上网安全常识,不然病毒会对我们造成严重的威胁。
免责声明:本文纯属虚构,本站提供安全工具、程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负!

星期天的早晨,在睡梦中意淫了一晚上杨尼美的刘尼玛被一阵突如其来的电话铃声所惊醒,不得不骂骂咧咧的爬起来接电话,结果一看号码居然是主管打来的,刘尼玛的瞌睡顿时全醒了,主管在电话中把他劈头盖脸的一顿臭骂。
起因是两天前主管安排刘尼玛去生意伙伴那里取一些资料,并向老总申请了公司的移动硬盘,结果老总今天使用硬盘的时候,杀毒软件报警,从里面查出来200多个木马,气急败坏的老总用谁也听不懂的家乡土话骂了主管的七舅老爷和八姨夫等等各种八竿子打不着的亲戚,憋了一肚子火憋得蛋疼的主管在挨完骂之后立马把电话打给了罪魁祸首刘尼玛,于是刘尼玛的各种八竿子打不着的亲戚外加十八代祖宗也被牵连了…
放下电话的刘尼玛冷汗直流,浑身哆嗦了好久,好不容易稍微平静之后,他手抖着点上了一支烟,却突然发觉内裤湿了,不知是刚才吓尿了还是昨晚梦见和杨尼美用各种姿势翻云覆雨的时候弄湿的。
他恐惧的原因不是因为工作中犯了错误被K了,而是这些木马病毒本身就是身为商业间谍的他故意种进去的,只是因为公司安装了强大的企业版杀毒软件,已经做过免杀的木马还是被查了出来。
“还好没有被发觉,他们都认为我是不小心中的毒”,刘尼玛擦了一把冷汗,一边自言自语一边用密码给总部发了一条信息.
0×01 永远跟不上的大牛脚步
我是总部的Q博士,因为刘尼玛的木马程序被全部查杀,所以他需要一个永远不可能被杀毒软件查到的木马,这个任务自然又落到了我的身上。
刘尼玛碰到的难题并不让我感到意外,杀毒技术的进步使得木马的寿命越来越短了,但是有一群大牛在一直引领着技术革新的潮流,他们总有办法躲过杀毒软件的追杀.
当还是小菜的我好不容易用vb写出第一个木马,加载到注册表开机启动时,大牛嗤之以鼻,他说现在我们都玩进程注入了,这个早过时了;
当我好不容易鼓捣成功dll木马,准备庆贺的时候,大牛又给我泼了一盆冷水,他说现在是bootkit和rootkit的时代,传统的木马已经进历史的垃圾堆了;
当我狂啃下了一堆内核书籍,终于知道rootkit是怎么回事的时候,大牛用嘲笑加可怜的眼神看着我说,你又晚了一步,我们都玩硬件了…
好吧,晚了就晚了,再晚也得跟着走,否则会更落后,现在我们开始探究硬件木马的原理:
硬件木马目前已经发展出了很多种,有截取显卡输出的视频信号并发射的,有植入摄像头悄悄记录的,最常见的是键盘记录器,将键盘偷偷接入键盘记录器,再将记录器插在主机上,就能记录从键盘上输入的数据,比如账号密码,聊天记录等等,而任何杀毒软件都不会检测到。
我们先从键盘的插口开始,我这里没有usb的键盘,所以只研究了ps2口,但usb口的与之类似. ps2口一共有6个针脚: clock时钟、GND接地、DATA数据和5V的供电,剩余的两个是没有使用的保留口,排列顺序如下图所示:

在 计算机主机上的ps2是母口的,因此排列顺序与上图正好相反. 这6根线中只有Data和Clock用于数据传输,这样看来键盘记录器的原理其实并不复 杂,我们需要一块微控制器和一个存储器,微控制器从键盘的data针脚读取输入数据,存入存储器之后,再通过主机ps2插口上的data输出,如下图所 示:

实际上对主机的输出并不一定仍然用ps2口,usb或者串口都可以.
看完上图,也许有人会说这实现起来很难,可能需要用到电路板、电阻、电容等一系列元件和丰富的无线电知识,在很久以前这或许是事实,但现在我们有一个新玩意儿,可以让你在连焊接都不用的情况下就实现上面的设计,它就是arduino.
0×02 什么是Arduino
Arduino 实际上就是一种开发板,将微控制器和必需的元件集成在一块电路板上,扩展出完善的接口和针脚,就可以接上各种各样的传感器,完成你心中的设计,你也可以把 它理解成一种电子积木,因为它不需要焊接,也不需要高深的无线电知识,只需要编程基础和基本的电路知识即可。
Arduino 不需要知道各种硬件的底层知识,这些底层的调用都已经提前帮你实现好了,而且它使用的是c语言而不是汇编,配有一个官方的IDE和各种硬件的调用库,你只 需要按照你自己的设计插接好各种硬件,就可以开始编写程序了,编写完之后烧写入微控制器(在arduino中这称为下载),它们会自动开始运行。
Arduino本身是一种开源硬件,电路图是公开的,现在官方的和扩展出的各种arduino板子加起来已经有上百种,但其中最基本的仍然是UNO和它的升级版Leonardo,上图就是UNO和Leonardo,我们的设计是基于Leonardo的.
Aduino的官方网站:http://www.arduino.cc,要进行下面的内容,请在此下载arduino的官方IDE并安装,在IDE安装目录的drivers子目录中,有烧写arduino所需要的usb转串口驱动,必须要先安装驱动才能开始编程.
(有关arduino的其他具体细节请自行google,这里只做基本介绍)
0×03 连接硬件
Arduino 的右边有一排针脚,从0到13,除了0和1被RX和TX占用之外,其余的都可以用来扩展各种硬件,我们先把PS2的键盘和arduino连起来:
首先准备四根杜邦线,为了避免混淆,我采用和前面原理图中一样的颜色,把红线从键盘PS2口的5V针脚接入板子上左侧的5V针脚,把两端的GND用 黑线连接起来,黄线从Clock针脚接入板子上的3号针脚,棕黄色线从DATA针脚接入板子上的5号针脚(3号和5号并不是确定的,在后面我们编写的程序 中定义几号针脚,这里就接几号):


然后将arduino的miniUSB输出连接到电脑上的USB口,在电脑上安装USB转串口驱动,打开arduino IDE,在设置中设定好串口号,开始编写程序。

0×04 键盘输入的原理
在编写程序之前,先要了解键盘和计算机之间是如何传输数据的。通 过前面的内容,我们已经知道键盘与计算机之间其实是通过四根线连接的,除去电源和接地,起作用的实际上是时钟和数据,它们同时向计算机发送电信号. 而要将数据发送给计算机,键盘会同时检查这两根线路,只有确认它们都处于高位时,键盘才会发送数据,只要其中有一根处于低位,键盘就会认为其他设备正在发 送数据,从而继续等待。
从键盘所发出的数据是一个11位的结构,如下图所示:

起 始位的值一直固定为0,后面有8个数据位,这就是每按下一个键所发送的数据了,在每当时钟脉冲下降时就会从最小显著位开始发送,直到最高显著位为止,按下 不同的键,各个时钟脉冲下降的规律也会不同,时钟脉冲的校验值每当脉冲到达一次低位就与1进行一次左移运算,同时每当数据脉冲与时钟脉冲同时到达高位时, 二者的校验值就进行一次按位或运算,最后循环运算的结果就是所发送给计算机的按键值。
在数据位后面跟着的是一个奇偶校验位和一个停止位,停止位的值总是1,这两个值其实是可以忽略的。
这里用一段示例的demo程序来说明
1. /* 2. * ps2.h 3. */ 4. 5. #include"Arduino.h" 6. 7. class PS2 8. { 9. public: 10. PS2(intclk, int data); 11. unsigned char read(void); 12. private: 13. int_ps2clk; 14. int_ps2data; 15.}; 16. 17./* 18.* ps2.cpp 19.*/ 20.#include"ps2.h" 21. 22.PS2::PS2(int clk, intdata) //初始化,设置时钟和数据位的针脚 23.{ 24. _ps2clk = clk; 25. _ps2data = data; 26.} 27. 28.unsigned charPS2::read(void) 29.{ 30. unsigned char data = 0×00; 31. unsigned char i; 32. unsigned char bit = 0×01; 33. 34. pinMode(_ps2clk, INPUT); 35. digitalWrite(_ps2clk, HIGH); 36. pinMode(_ps2data, INPUT); 37. digitalWrite(_ps2data, HIGH); //以上把时钟和数据均设置为高位,开始接受输入 38. delayMicroseconds(50); 39. while (digitalRead(_ps2clk) ==HIGH) 40. ; 41. delayMicroseconds(5); 42. while (digitalRead(_ps2clk) ==LOW) //起始位的部分什么也不做,直接跳过 43. ; 44. for (i=0; i < 8; i++) //循环读取数据位 45. { 46. while(digitalRead(_ps2clk) ==HIGH) 47. ; 48. if(digitalRead(_ps2data)==HIGH) //当时钟和数据线路均为高位时开始计算 49. { 50. data =data