引言

Mirai事件一经曝出,立即引领了一轮研究IoT设备的热潮。目前,对Mirai的报告大多只是在对其功能实现上的介绍,却很少提及如何实现IoT设备程序开发的测试环境。本文在对Mirai的源码研究的基础上,实现了一个比较简单的IoT设备开发编译环境。该工具能自动配置交叉编译环境,使其可以满足简单的物联网开发测试。

编译环境搭建

采用脚本的方式,在git中为config.sh,可自动安装交叉编译工具安装包,并将可执行目录配置到环境变量中。具体步骤如下,采用wget到固定的网站上下载交叉编译安装包(需要其他交叉编译工具包,可自行添加),解压即可用,不用对安装包进行编译安装,并将安装包可执行文件目录写入/etc/profile的末尾,最后使用source /etc/profile使其生效,如未生效,手动执行命令source /etc/profile即可。

编译脚本

编译脚本在git上为build.sh,可根据情况对bot文件进行编译。编译分为release模式和debug模式,release模式对bot文件进行交叉编译,使其适用于不同的嵌入式架构;debug模式直接对bot文件进行编译,并在debug程序运行的过程中会打印出调试信息。

测试环境

小米路由器3一台,选择它,是因为它可以方便地安装SSH插件,具体的方法,可参照:

https://jingyan.baidu.com/article/624e7459ae65e834e8ba5afd.html

登陆上小米路由器,如图所示:

测试方法

下载该项目程序,git地址为:https://github.com/scu-igroup/IoT_bot

git上主要存放的是bot客户端程序,其中config.sh为交叉编译环境自动配置脚本,build.sh为程序编译脚本,需要先运行config.sh搭好交叉编译环境,才能对bot程序进行编译。

客户端程序编译及运行:

本项目的文件相当于实现了一个简单的是客户端,先在bot目录下的include.h中更改要连接的IP和port。运行build.sh 脚本编译程序,如:./build.sh debug

即可在debug目录下编译好所要的程序。由于小米路由器的CPU采用的是MIPS架构,系统为Linux,在测试过程中,只有用mipsel-gcc编译的程序才能正常运行,下面会做详细说明。因此,不同CPU架构的IoT设备,需要用对应的交叉编译工具,才能编译出能正常运行的可执行程序。下图中,即为编译出的适应于不同架构的可执行程序。

对于如何判断某个IoT设备适用哪种可执行程序,通过看路由器的cpuinfo,就可以知道cpu model的架构,为MIPS;通过查看路由器的系统版本,为linux2.6.36,即可查知该系统支持的库函数,在程序开发的时候,查明所用的库函数该系统是否支持非常重要,以免引起程序意外退出。如下图所示为小米路由器的cpuinfo和系统版本信息。

编译好程序后,在debug目录下找到./mirai.mipsel程序,用scp命令将该程序投放到路由器的tmp目录下(小米路由器支持scp命令,其他的IoT可能不支持,需要探测其支持的命令工具),运行该程序,如下图:

遇到的问题:

在投放可执行程序过程中,需要注意CPU是大端存储还是小端存储的问题,在实验过程,采用mips-gcc编译的程序,直接运行,会报如下错误:

排查后才知道,mips-gcc编译出的为大端存储的可执行程序;mipsel-gcc编译出的为小端存储的可执行程序。小米路由器为小端存储,故用mipsel-gcc编译的程序才能正常执行。

服务端程序:

服务端比较简单,采用的是现成的工具,找一台Linux主机(虚拟机即可),安装nc工具(精悍的小工具),在centos系统下可直接安装: yum install nc

在客户端程序已运行的情况下,运行:nc –l 9999  //监听9999端口

只要客户端运行该IP下的9999端口,即可建立通信。

服务端程序运行图为:

总结

该测试程序是在Mirai源码的基础上做的裁剪,已删除攻击模块,目的在于做一个针对IoT设备的程序开发测试。总的来说,Mirai到目前为止都还是一款先进的物联网程序,值得大家深入研究,并做相应的测试。最后,不足之处,大家多多提出来一起讨论。

最新文章

  1. WCF入门简单教程(图文) VS2010版
  2. jsp发布:Could not publish server configuration: null. java.lang.NullPointerException
  3. 数组map()方法和filter()方法及字符串startsWith(anotherString)和endsWith(anotherString)方法
  4. NET RichTextBox控件如何可以插入图像
  5. 事务复制-大批量DEL操作
  6. Linux提供两个格式化错误信息的函数
  7. struts的DevMode模式
  8. CentOS 7 下引导 Windows7 启动
  9. android webview js交互 第一节 (java和js交互)
  10. hadoop搭建杂记:Linux下JDK环境变量的设置(三种配置环境变量的方法)
  11. spring的aop详解
  12. 序列化与transient
  13. selenium获取百度账户cookies
  14. mysql新增用户并开启远程连接
  15. nodejs+mysql入门实例(删)
  16. 20 Interesting WPF Projects on CodePlex
  17. HTML的基础知识
  18. leetcode 39. Combination Sum 、40. Combination Sum II 、216. Combination Sum III
  19. OWASP SSL 高级审查工具
  20. C,C++经典问题

热门文章

  1. 【树形dp】7.14城市
  2. Python常见文件操作的函数示例
  3. leetcode-1-basic
  4. H5系列之地理位置(必知必会)
  5. FFT-hdu题目练习
  6. IOS 自动布局-UIStackPanel和UIGridPanel(三)
  7. pytest分布式执行(pytest-xdist)
  8. ubuntu ssh连接服务器保持长时间不断
  9. 【转】SQL索引一步到位
  10. 【HTML/XML 2】XML基础知识点总结