记一次Linux服务器上查杀木马经历

开篇前言

Linux服务器一直给我们的印象是安全、稳定、可靠,性能卓越。由于一来Linux本身的安全机制,Linux上的病毒、木马较少,二则由于宣称Linux是最安全的操作系统,导致很多人对Linux的安全性有个误解:以为它永远不会感染病毒、木马;以为它没有安全漏洞。所以很多Linux服务器都是裸奔的。其实在这次事件之前,我对Linux的安全性方面的认识、重视程度也是有所不足的。系统的安全性是相对而言的,没有绝对的安全,风险无处不在。

案例描述

我们在云端(中信国际电讯CPC)的一台Linux 应用服务器时不时出现网络中断情况,最开始反馈到系统管理员和网络管理员哪里,以为是网络方面的问题。在监控系统后,发现在一些时间段出现高流量的情况,分析发现这台Linux服务器只安装了Tomcat应用程序,没有任何其它应用程序。产生如此大的流量很不正常,而且出现网络中断的时刻,就是系统产生高流量的时刻。当然这些都是我后来才了解到的一些情况,我没有这台服务器的权限,系统管理员找我看看能分析出啥问题,所以将root账号权限给了我。

案例分析

我连接到服务器后,运行ifconfig命令,检查网卡的发送、接收数据情况,如下所示,网卡eth0累计发送了12.3TB的数据。这明显不太正常,显然有应用程序一直在往外发包。我特意对比了另外一台正常的服务器后,验证了这个事实。

那么是那个应用程序在一直往外发送包呢? 我首先检查了Linux系统日志,发现了一些错误、告警信息。但是作用不大。于是在服务器上安装了NetHogs应用程序,实时监控Linux进程的网络带宽占用情况。

监控过程确实发现了一些异常情况的进程:

1:/home/WDPM/Development/WebServer/apache-tomcat-7.0.61/cmys 一直在往外发包

2:/usr/bin/bsd-port/agent 一直在往外发包。

3:./cmys一直在往外发包

4:不时出现下面大量异常进程

[root@LNX17 /]# ps -ef | grep getty
root      2012     1  0 May22 tty2     00:00:00 /sbin/mingetty /dev/tty2
root      2014     1  0 May22 tty3     00:00:00 /sbin/mingetty /dev/tty3
root      2018     1  0 May22 tty4     00:00:00 /sbin/mingetty /dev/tty4
root      2020     1  0 May22 tty5     00:00:00 /sbin/mingetty /dev/tty5
root      2022     1  0 May22 tty6     00:00:00 /sbin/mingetty /dev/tty6
root     13835 32735  0 01:02 pts/0    00:00:00 grep getty
[root@LNX17 tmp]# ll /usr/bin/bsd-port/
total 2324
-rwxr-xr-x. 1 root root 1135000 Jul 17 08:28 agent
-rwxr-xr-x. 1 root root       4 Jul 17 08:28 agent.conf
-rw-r--r--. 1 root root      27 Jul 21 12:42 cmd.n
-rw-r--r--. 1 root root      73 Aug 21 21:30 conf.n
-rwxr-xr-x. 1 root root 1223123 Aug 21 04:08 getty
-rwxr-xr-x. 1 root root       5 Aug 21 04:08 getty.lock

搜索/usr/bin/bsd-port/agent等进程相关资料,发现很多关于木马、后门方面的文章,严重怀疑服务器被挂马了。手工杀进程或手工删除/home/WDPM/Development/WebServer/apache-tomcat-7.0.61/cmys文件,发现不过一会儿,又会出现相同的进程和文件。于是下载安装了AVG ANTIVIRUS FREE – FOR LINUX这款杀毒软件,但是启动服务失败,不想折腾,于是安装了ClamAV 杀毒软件

ClamAV介绍

ClamAV是一个在命令行下查毒软件,因为它不将杀毒作为主要功能,默认只能查出您计算机内的病毒,但是无法清除,至多删除文件。ClamAV可以工作很多的平台上,但是有少数无法支持,这就要取决您所使用的平台的流行程度了。另外它主要是来防护一些WINDOWS病毒和木马程序。另外,这是一个面向服务端的软件。

下载ClamAV安装包

ClamAV的官方下载地址为http://www.clamav.net/download.html 我直接使用wget下载源码安装文件。

[root@LNX17 tmp]# wget http://nchc.dl.sourceforge.net/project/clamav/clamav/0.97.6/clamav-0.97.6.tar.gz
--2015-08-21 21:58:36--  http://nchc.dl.sourceforge.net/project/clamav/clamav/0.97.6/clamav-0.97.6.tar.gz
Resolving nchc.dl.sourceforge.net... 211.79.60.17, 2001:e10:ffff:1f02::17
Connecting to nchc.dl.sourceforge.net|211.79.60.17|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 14765896 (14M) [application/x-gzip]
Saving to: “clamav-0.97.6.tar.gz”
 
100%[==============================================================>] 14,765,896   652K/s   in 71s     
 
2015-08-21 21:59:48 (204 KB/s) - “clamav-0.97.6.tar.gz” saved [14765896/14765896]
 
[root@LNX17 tmp]# wget http://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.7/zlib-1.2.7.tar.gz
--2015-08-21 22:00:24--  http://nchc.dl.sourceforge.net/project/libpng/zlib/1.2.7/zlib-1.2.7.tar.gz
Resolving nchc.dl.sourceforge.net... 211.79.60.17, 2001:e10:ffff:1f02::17
Connecting to nchc.dl.sourceforge.net|211.79.60.17|:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 560351 (547K) [application/x-gzip]
Saving to: “zlib-1.2.7.tar.gz”
 
100%[=============================================================>] 560,351      287K/s   in 1.9s    
 
2015-08-21 22:00:26 (287 KB/s) - “zlib-1.2.7.tar.gz” saved [560351/560351]

1、zlib-1.2.7.tar.gz安装

[root@LNX17 tmp]# tar xvzf zlib-1.2.7.tar.gz
[root@LNX17 tmp]# cd zlib-1.2.7
[root@LNX17 zlib-1.2.7]# ./configure 
Checking for gcc...
Checking for shared library support...
Building shared library libz.so.1.2.7 with gcc.
Checking for off64_t... Yes.
Checking for fseeko... Yes.
Checking for strerror... Yes.
Checking for unistd.h... Yes.
Checking for stdarg.h... Yes.
Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf().
Checking for vsnprintf() in stdio.h... Yes.
Checking for return value of vsnprintf()... Yes.
Checking for attribute(visibility) support... Yes.
Looking for a four-byte integer type... Found.
[root@LNX17 zlib-1.2.7]# make && make install
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -c -o example.o test/example.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o adler32.o adler32.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o crc32.o crc32.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o deflate.o deflate.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o infback.o infback.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o inffast.o inffast.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o inflate.o inflate.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o inftrees.o inftrees.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o trees.o trees.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o zutil.o zutil.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o compress.o compress.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o uncompr.o uncompr.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o gzclose.o gzclose.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o gzlib.o gzlib.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o gzread.o gzread.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN   -c -o gzwrite.o gzwrite.c
ar rc libz.a adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o 
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o example example.o -L. libz.a
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -c -o minigzip.o test/minigzip.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o minigzip minigzip.o -L. libz.a
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/adler32.o adler32.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/crc32.o crc32.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/deflate.o deflate.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/infback.o infback.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/inffast.o inffast.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/inflate.o inflate.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/inftrees.o inftrees.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/trees.o trees.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/zutil.o zutil.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/compress.o compress.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/uncompr.o uncompr.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/gzclose.o gzclose.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/gzlib.o gzlib.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/gzread.o gzread.c
gcc -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -DPIC -c -o objs/gzwrite.o gzwrite.c
gcc -shared -Wl,-soname,libz.so.1,--version-script,zlib.map -O3  -fPIC -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o libz.so.1.2.7 adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo  -lc 
rm -f libz.so libz.so.1
ln -s libz.so.1.2.7 libz.so
ln -s libz.so.1.2.7 libz.so.1
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o examplesh example.o -L. libz.so.1.2.7
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o minigzipsh minigzip.o -L. libz.so.1.2.7
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -D_FILE_OFFSET_BITS=64 -c -o example64.o test/example.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o example64 example64.o -L. libz.a
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -I. -D_FILE_OFFSET_BITS=64 -c -o minigzip64.o test/minigzip.c
gcc -O3  -D_LARGEFILE64_SOURCE=1 -DHAVE_HIDDEN -o minigzip64 minigzip64.o -L. libz.a
cp libz.a /usr/local/lib
chmod 644 /usr/local/lib/libz.a
cp libz.so.1.2.7 /usr/local/lib
chmod 755 /usr/local/lib/libz.so.1.2.7
cp zlib.3 /usr/local/share/man/man3
chmod 644 /usr/local/share/man/man3/zlib.3
cp zlib.pc /usr/local/lib/pkgconfig
chmod 644 /usr/local/lib/pkgconfig/zlib.pc
cp zlib.h zconf.h /usr/local/include
chmod 644 /usr/local/include/zlib.h /usr/local/include/zconf.h

2:添加用户组clamav和组成员clamav

[root@LNX17 zlib-1.2.7]# groupadd clamav
[root@LNX17 zlib-1.2.7]# useradd -g clamav -s /bin/false -c "Clam AntiVirus" clamav
[root@LNX17 zlib-1.2.7]#

3:安装Clamav-0.97.6

[root@LNX17 tmp]# tar xvzf clamav-0.97.6.tar.gz
[root@LNX17 tmp]# cd clamav-0.97.6
[root@LNX17 clamav-0.97.6]# ./configure --prefix=/opt/clamav  --disable-clamav
[root@LNX17 clamav-0.97.6]# make
[root@LNX17 clamav-0.97.6]# make install

配置Clamav

1:创建目录

[root@LNX17 clamav-0.97.6]# mkdir /opt/clamav/logs 
 
[root@LNX17 clamav-0.97.6]# mkdir /opt/clamav/updata

2:创建文件

[root@LNX17 clamav-0.97.6]# touch /opt/clamav/logs/freshclam.log
[root@LNX17 clamav-0.97.6]# touch /opt/clamav/logs/clamd.log
[root@LNX17 clamav-0.97.6]# 
 
[root@LNX17 clamav-0.97.6]# cd /opt/clamav/logs
[root@LNX17 clamav]# cd logs
[root@LNX17 logs]# ls
clamd.log  freshclam.log
[root@LNX17 logs]# ls -lrt
total 0
-rw-r--r--. 1 root root 0 Aug 21 22:10 freshclam.log
-rw-r--r--. 1 root root 0 Aug 21 22:10 clamd.log

3:修改属主

[root@LNX17 logs]# chown clamav:clamav clamd.log 
[root@LNX17 logs]# chown clamav:clamav freshclam.log 
[root@LNX17 logs]# ls -lrt
total 0
-rw-r--r--. 1 clamav clamav 0 Aug 21 22:10 freshclam.log
-rw-r--r--. 1 clamav clamav 0 Aug 21 22:10 clamd.log
[root@LNX17 logs]#

4:修改配置文件

#vi /opt/clamav

/etc/clam.conf
# Example 注释掉这一行. 第8 行

LogFile /opt/clamav/logs/clamd.log 删掉前面的注释目录改为/opt/clamav/logs/clamd.log

PidFile /opt/clamav/updata/clamd.pid 删掉前面的注释路径改为/opt/clamav/updata/clamd.pid

DatabaseDirectory /opt/clamav/updata 同上

#vi /opt/clamav

/etc/clamfreshclam.conf , 将Example 这一行注释掉。否则在更新反病毒数据库是就有可能出现下面错误

[root@LNX17 clamav]# /opt/clamav/bin/freshclam

ERROR: Please edit the example config file /opt/clamav/etc/freshclam.conf

ERROR: Can’t open/parse the config file /opt/clamav/etc/freshclam.conf

clip_image005

5:升级病毒库

[root@LNX17 etc]# /opt/clamav/bin/freshclam

ERROR: Can’t change dir to /opt/clamav/share/clamav

出现上面错误,直接创建一个文件夹并授权给clamav用户即可。

[root@LNX17 etc]# mkdir -p /opt/clamav/share/clamav
[root@LNX17 etc]# chown clamav:clamav /opt/clamav/share/clamav
[root@LNX17 etc]# 
 
[root@LNX17 etc]# /opt/clamav/bin/freshclam
ClamAV update process started at Fri Aug 21 22:42:18 2015
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.97.6 Recommended version: 0.98.7
DON'T PANIC! Read http://www.clamav.net/support/faq
nonblock_connect: connect timing out (30 secs)
Can't connect to port 80 of host database.clamav.net (IP: 211.239.150.206)
Trying host database.clamav.net (120.29.176.126)...
nonblock_recv: recv timing out (30 secs)
WARNING: getfile: Download interrupted: Operation now in progress (IP: 120.29.176.126)
WARNING: Can't download main.cvd from database.clamav.net
Trying again in 5 secs...
ClamAV update process started at Fri Aug 21 23:03:32 2015
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.97.6 Recommended version: 0.98.7
DON'T PANIC! Read http://www.clamav.net/support/faq
Downloading main.cvd [100%]
main.cvd updated (version: 55, sigs: 2424225, f-level: 60, builder: neo)
Downloading daily.cvd [100%]
daily.cvd updated (version: 20817, sigs: 1537382, f-level: 63, builder: neo)
Downloading bytecode.cvd [100%]
bytecode.cvd updated (version: 268, sigs: 47, f-level: 63, builder: anvilleg)
Database updated (3961654 signatures) from database.clamav.net (IP: 219.94.128.99)

由于ClamAV不是最新版本,所以有告警信息。可以忽略或升级最新版本。病毒库需要定期升级,例如我第二天升级病毒库

[root@LNX17 ~]# /opt/clamav/bin/freshclam
ClamAV update process started at Mon Aug 24 10:10:25 2015
WARNING: Your ClamAV installation is OUTDATED!
WARNING: Local version: 0.97.6 Recommended version: 0.98.7
DON'T PANIC! Read http://www.clamav.net/support/faq
main.cvd is up to date (version: 55, sigs: 2424225, f-level: 60, builder: neo)
Downloading daily-20818.cdiff [100%]
Downloading daily-20819.cdiff [100%]
Downloading daily-20820.cdiff [100%]
Downloading daily-20821.cdiff [100%]
Downloading daily-20822.cdiff [100%]
Downloading daily-20823.cdiff [100%]
Downloading daily-20824.cdiff [100%]
Downloading daily-20825.cdiff [100%]
Downloading daily-20826.cdiff [100%]
Downloading daily-20827.cdiff [100%]
Downloading daily-20828.cdiff [100%]
Downloading daily-20829.cdiff [100%]
daily.cld updated (version: 20829, sigs: 1541624, f-level: 63, builder: neo)
bytecode.cvd is up to date (version: 268, sigs: 47, f-level: 63, builder: anvilleg)
Database updated (3965896 signatures) from database.clamav.net (IP: 203.178.137.175)

6:ClamAV 使用

可以使用/opt/clamav/bin/clamscan -h查看相应的帮助信息

· 扫描所有用户的主目录就使用 clamscan -r /home

· 扫描您计算机上的所有文件并且显示所有的文件的扫描结果,就使用 clamscan -r /

· 扫描您计算机上的所有文件并且显示有问题的文件的扫描结果,就使用 clamscan -r –bell -i /

执行下面命令扫描根目录下面的所有文件。如下所示:56个文件被感染了。基本上都是Linux.Trojan.Agent和Linux.Backdoor.Gates等。

/opt/clamav/bin/clamscan -r –bell -i

手工删除这些文件。然后重新扫描一下,发现木马已经被清理完成。但是按照网上资料进一步查找发现木马启动程序

[root@LNX17 ~]# cd /etc/init.d/
[root@LNX17 init.d]# ls Db*
DbSecurityMdt  DbSecuritySpt
[root@LNX17 init.d]# ls sel*
selinux
[root@LNX17 init.d]# more selinux 
#!/bin/bash
/usr/bin/bsd-port/getty
[root@LNX17 init.d]# more DbSecuritySpt 
#!/bin/bash
/home/WDPM/Development/WebServer/apache-tomcat-7.0.61/cmys
[root@LNX17 init.d]# more DbSecurityMdt 
#!/bin/bash
/root/cmy6
[root@LNX17 init.d]# more DbSecurityMdt 
#!/bin/bash
/root/cmy6
[root@LNX17 bin]# ls bsd*
 
agent.conf cmd.n conf.n getty.lock
 
[root@LNX17 bin]# cd bsd-port/
 
[root@GETLNX17 bsd-port]# ls
 
agent.conf cmd.n conf.n getty.lock
 
[root@LNX17 bsd-port]# more agent.conf 
 
3341
 
[root@LNX17 bsd-port]# more getty.lock 
 
1013
 
[root@LNX17 bsd-port]# cd ..
 
[root@LNX17 bin]# rm -rf bsd-port

此时在用nethogs监控进程的网络流量,发现已经没有异常进程了,应该算是彻底清除了。

 

关于Linux.Backdoor.Gates,看到一篇介绍资料了相关内容:Linux.BackDoor.Gates.5——又一针对Linux的木马, 具体内容如下所示:

——————————————————————————————————————————

某些用户有一种根深蒂固的观念,就是目前没有能够真正威胁Linux内核操作系统的恶意软件,然而这种观念正在面临越来越多的挑战。与4月相比,2014年5月Doctor Web公司的技术人员侦测到的Linux恶意软件数量创下了新纪录,六月份这些恶意软件名单中又增加了一系列新的Linux木马,这一新木马家族被命名为Linux.BackDoor.Gates。

在这里描述的是恶意软件家族Linux.BackDoor.Gates中的一个木马:Linux.BackDoor.Gates.5,此恶意软件结合了传统后门程序和DDoS攻击木马的功能,用于感染32位Linux版本,根据其特征可以断定,是与Linux.DnsAmp和Linux.DDoS家族木马同出于一个病毒编写者之手。新木马由两个功能模块构成:基本模块是能够执行不法分子所发指令的后门程序,第二个模块在安装过程中保存到硬盘,用于进行DDoS攻击。Linux.BackDoor.Gates.5在运行过程中收集并向不法分子转发受感染电脑的以下信息:

CPU核数(从/proc/cpuinfo读取)。

CPU速度(从/proc/cpuinfo读取)。

CPU使用(从/proc/stat读取)。

Gate’a的 IP(从/proc/net/route读取)。

Gate’a的MAC地址(从/proc/net/arp读取)。

网络接口信息(从/proc/net/dev读取)。

网络设备的MAC地址。

内存(使用/proc/meminfo中的MemTotal参数)。

发送和接收的数据量(从/proc/net/dev读取)。

操作系统名称和版本(通过调用uname命令)。

启动后,Linux.BackDoor.Gates.5会检查其启动文件夹的路径,根据检查得到的结果实现四种行为模式。

如果后门程序的可执行文件的路径与netstat、lsof、ps工具的路径不一致,木马会伪装成守护程序在系统中启动,然后进行初始化,在初始化过程中解压配置文件。配置文件包含木马运行所必须的各种数据,如管理服务器IP地址和端口、后门程序安装参数等。

根据配置文件中的g_iGatsIsFx参数值,木马或主动连接管理服务器,或等待连接:成功安装后,后门程序会检测与其连接的站点的IP地址,之后将站点作为命令服务器。

木马在安装过程中检查文件/tmp/moni.lock,如果该文件不为空,则读取其中的数据(PID进程)并“干掉”该ID进程。然后Linux.BackDoor.Gates.5会检查系统中是否启动了DDoS模块和后门程序自有进程(如果已启动,这些进程同样会被“干掉”)。如果配置文件中设置有专门的标志g_iIsService,木马通过在文件/etc/init.d/中写入命令行#!/bin/bash\n<path_to_backdoor>将自己设为自启动,然后Linux.BackDoor.Gates.5创建下列符号链接:

ln -s /etc/init.d/DbSecuritySpt /etc/rc1.d/S97DbSecuritySpt

ln -s /etc/init.d/DbSecuritySpt /etc/rc2.d/S97DbSecuritySpt

ln -s /etc/init.d/DbSecuritySpt /etc/rc3.d/S97DbSecuritySpt

ln -s /etc/init.d/DbSecuritySpt /etc/rc4.d/S97DbSecuritySpt

如果在配置文件中设置有标志g_bDoBackdoor,木马同样会试图打开/root/.profile文件,检查其进程是否有root权限。然后后门程序将自己复制到/usr/bin/bsd-port/getty中并启动。在安装的最后阶段,Linux.BackDoor.Gates.5在文件夹/usr/bin/再次创建一个副本,命名为配置文件中设置的相应名称,并取代下列工具:

/bin/netstat

/bin/lsof

/bin/ps

/usr/bin/netstat

/usr/bin/lsof

/usr/bin/ps

/usr/sbin/netstat

/usr/sbin/lsof

/usr/sbin/ps

木马以此完成安装,并开始调用基本功能。

执行另外两种算法时木马同样会伪装成守护进程在被感染电脑启动,检查其组件是否通过读取相应的.lock文件启动(如果未启动,则启动组件),但在保存文件和注册自启动时使用不同的名称。

与命令服务器设置连接后,Linux.BackDoor.Gates.5接收来自服务器的配置数据和僵尸电脑需完成的命令。按照不法分子的指令,木马能够实现自动更新,对指定IP地址和端口的远程站点发起或停止DDoS攻击,执行配置数据所包含的命令或通过与指定IP地址的远程站点建立连接来执行其他命令。

此后门程序的主要DDoS攻击目标是中国的服务器,然而不法分子攻击对象也包括其他国家。下图为利用此木马进行的DDoS攻击的地理分布:

参考资料:

http://blog.csdn.net/liukeforever/article/details/38560363

http://vekergu.blog.51cto.com/9966832/1619266

http://blog.csdn.net/liukeforever/article/details/38560363

http://bbs.appstar.com.cn/thread-10205-1-1.html

http://yangrong083.blog.163.com/blog/static/113406097201371235159424/

记一次Linux服务器上查杀木马经历,首发于博客 – 伯乐在线

危险的文件夹上传框

分享一篇老文章。前些年在 ASRC 上的看了一篇文章「Html5新功能上的ui-redressing」后,写的一些改进方案。

文件对话框

文件上传对话框是一直以来就存在的网页控件。

到了 HTML5 时代,增加了更多的功能,例如支持文件多选。Chrome 甚至还支持「上传文件夹」这一私有特征:

<input type="file" webkitdirectory />

在给用户方便的同时,其安全隐患也逐渐出现。用户平时在下载时,理所当然的弹出的是保存对话框,因此常常不仔细看就做出了选择。

这极有可能被攻击者所利用。一些恶意网站在用户点击下载时,故意弹出一个上传对话框。只要用户一疏忽,就把选中的文件夹给上传了!

下载对话框

上传对话框

当然,仅仅依靠默认的上传,这种攻击方式仍有较大难度。因为整个文件夹可能非常大,上传需要很久的时间。

如果用户等了半天也没看见下载进度,或许就会刷新重试,甚至放弃了。

选择即授权

然而,HTML5 带来了一个新的规范 —— File API,允许脚本访问文件。

但由于沙箱限制,脚本无法访问任何一个本地文件,除非用户主动授权。如何授权?最常见的,就是「上传对话框」了。

事实上,如今的上传对话框,早已不是从前「选择哪个文件」的功能,而是「允许脚本访问哪个文件」的权限申请!只不过界面上没有提示罢了。

例如,一个传统的文件上传控件。当用户选中文件后,即可通过 File API 读取文件内容:

<input id="dialog" type="file" />
<script>
    dialog.onchange = function(e) {
        var reader = new FileReader();
        reader.onload = function() {
            console.log(this.result);
        };
        reader.readAsText(this.files[0]);
    };
</script>

或许你已注意到,File 位于files[]而不是file,这正是给文件夹预留的!

在 Chrome 里,上传控件只要加上 webkitdirectory 属性,就变成文件夹选择框。这时一旦用户选中某个文件夹,瞬间就赐予脚本访问整个文件夹的权限!

<input id="dialog" type="file" webkitdirectory />
<script>
    dialog.onchange = function(e) {
        var files = this.files;
        var table = {};

        for (var i = 0; i < files.length; i++) {
            var f = files[i];
            var dt = new Date(f.lastModified);

            table[i] = {
                path: f.webkitRelativePath,
                size: f.size,
                modified: dt.toLocaleString()
            };
        }

        console.table(table);
    };
</script>

演示

于是,用户本想将文件保存在桌面上,结果却将桌面上的所有资料,被攻击者的脚本拿到!

优化上传

一旦脚本可主动访问,我们可以用更灵活的方式处理这些文件,无需再用传统落后的方式上传。我们可以直接在前端分析出「有价值」的文件,例如:

  • 备注文件、脚本、批处理、电子表格等,很可能存有一些敏感信息,而且体积小价值大,优先将其上传;
  • 图片则可通过 canvas 缩放,先传较小的缩略图。当接收端发现有意义时,再传输原文件。
  • 对于一些体积较大但意义不大的文件,则可以直接忽略。

由于 HTTP 上传是没有压缩的,因此在传输文本文件时效率很低。我们可以借助 Flash 内置的LZMA压缩算法,极大提升传输效率。如果不支持 Flash,也可以使用asm.js版的 LZMA 压缩器,配合Worker线程在后台压缩和传输。

同时,将多个小文件合并后再压缩,可进一步提高压缩率。再多开几个连接,上传速度即可大幅提升。

续点上传

不过即使再优化,仍有传不完的可能。因此,我们得将没传完的内容储存起来,当用户再次回来时,继续传输。

得益于 HTML5 的 Storage API,这不难实现。

事实上,当用户授权了某个文件夹时,我们首先要做的不是发送,而是读出文件夹内容,立即备份到 Storage 里。毕竟,文件的读取需要用户主动配合,是非常珍贵的;而访问 Storage 则无需任何条件。

当备份完成后,再从 Storage 里读取、发送、删除。这样,即使中途页面刷新或关闭了,下次回来时,仍能从 Storage 中继续。

考虑到每个域的 Storage 容量有限,我们可以使用iframe嵌入多个不同域的页面,然后通过postMessage进行数据的分发和汇总,这样就不受容量限制了。

当然,能不能无限容量还得看浏览器策略,不然硬盘会被撑满

将数据存放在 Storage 里还有另一个好处,即使用户永不回来,但数据仍持久保存着。只要以后一旦进入其他的站点,只要是我们可控的,仍有机会继续上传。(例如将用户引到我们布置了 XSS 的站点上)

延长上传

在之前《延长 XSS 生命期》 中介绍过,可以使用各种黑魔法来提升脚本有效期。

利用这个原理,即使当前页面关闭,其他关联的页面也能继续上传。事实上,除了文中提到的方法,如今还有一个新的 API —— SharedWorker,它可以让 Worker 共享于多个页面,只要有一个存在,线程就不会停止。可以让续点时丢失的数据更少。

视觉欺骗

由于上传控件有着独特的界面,如何才能让用户主动去点呢?万能的方法是点击劫持(Clickjacking)。

不过本场景无需这么麻烦,只需简单的调用控件的click方法就可以了。

<a href="ed2k://|file|xxxxxxxxxx.avi" id="download">高速下载</a>
<script>
    var uploader = document.createElement('input');
    uploader.type = 'file';
    uploader.webkitdirectory = true;

    download.onclick = function(e) {
        uploader.click();       // 弹出授权对话框
        e.preventDefault();     // 屏蔽下载对话框
    };
</script>

演示

我们将屏蔽超链接的默认行为,将其传递给上传控件,即可召唤出「文件夹授权」对话框了!

同时,为了不让眼亮的人发现对话框上的破绽,我们使用一些第三方的下载方式,例如电驴、迅雷等等,让人们误以为就是这样的。

当然,这只是一个小例子。只要页面做的真实,下载内容引人入胜,用户自然就会中招。

后记

本以为 webkitdirectory 的这个私有属性很快就会放弃,至少是更强的安全提示。不过至少现在也没更新,因此上网时还是要多加留心,看清楚了再做决定。

当然,这篇只是最早的「交互欺骗」探索。事实上,深入挖掘会发现可利用点远不仅此。

如今的浏览器在视觉、音频上的体验已经非常完善,攻击者甚至可以在网页里,高度模拟一个本地应用的交互效果。让用户误以为是浏览器之外的程序弹出的界面,从而进行钓鱼。

危险的文件夹上传框,首发于博客 – 伯乐在线

甲骨文:不行,你不能看我们的源代码!

【伯乐在线导读】:是人写的软件,都不可避免有漏洞。而发现漏洞的,并不只是软件开发商,也有独立第三方机构或个人。所以,业界不少知名公司有对外的漏洞悬赏计划,比如:Facebook谷歌Twitter、微软、Paypal。

咦,为啥小编没听过甲骨文的漏洞悬赏计划呢?各位接着往下看。

8月10日,甲骨文 CSO(首席安全官)Mary Ann Davidson 在企业博客上发布一篇文章,怒斥客户通过逆向工程看源码找漏洞的行为。这篇文章在 Reddit 引发大量讨(tu)论(cao),本文末尾摘录的 3 条。该文因争议太大,后来被删,不过有 谷歌快照 & 时光机存档了。

下面是伯乐在线翻译组黄小非的全文翻译。

Mary Ann Davidson

No, You Really Can’t | 不行,就是不让你看

我最近已经写了很多东西了。其中一些是和我姐姐一起,使用笔名Maddi Davidson写的凶案悬疑小说。最近,我们一直在写一些较短的凶杀故事,尝试用一些新主意来“杀死”故事中的被害者(诚实地说,在现实中我真会去想怎么把这些凶杀情节实践到那些连车距都保持不好的白痴司机身上)。

对于我来说,写悬疑小说真的比我写其他类型的东西要有趣得多。最近我发现,企图通过逆向工程来挑我们毛病的客户人数显著地增加了(诶,大大叹口气吧)。所以你也就不难理解为什么我近来大量给客户写信,都是以这样的内容来开头:“Hi~, Howizt,你好”(译注:看似很友好客套),可是结尾却变成了:“请您遵循许可证协议,不要再对我们进行逆向工程看源码了。”

我能理解,在我们生活的世界上,几乎每天都有人在说数据出了问题,然后还会有超级无敌多的匿名入侵记录,这一定是敌对分子搞破坏造成的。所以,在系统安全技术方面人们总是想再往前多走一步。不过,在你整装待发准备多走这一步之前,你要知道,其实客户已经标定了关键系统,对敏感数据进行了加密,该打的补丁都打上了,而且也配备了各种配套产品,并且还用了工具来锁定配置确保其不会被篡改——总而言之,在你尝试挖掘 0-day 大漏洞之前,系统在常规情况下已经非常安全了。事实上,如果该做的常规措施都做到了,大部分的数据隐患都可以被消除,这个事实听上去一点儿也不性感吧,但事实就是这样,通常情况下那些用 0-day 级别漏洞来产生的“无敌高级持续性系统威胁“的案例并非真的存在!所以无论是你自己去打理服务器,还是说你的云服务供应商帮你去鼓捣,把基本的安全实践工作做好非常必要(,其余的事情你就不用去考虑了)

纵使认为供应商都应该是业界良心(会对他们的开发软件产品的方式负责),你还是有很多东西需要确认,而不能只用漏洞扫描工具一扫了之。客户能做的事情可多着呢,额滴神啊(千万别说你不知道该做什么),客户可以询问供应商,问问他们采用了哪些安全认证规程,或者查查看他们的产品有没有行业认证(例如像 Good Housekeeping 质量担保图印,或者 FIPS-140 认证这样的计算机信息安全通用标准认证)。大多数供应商,至少是我知道的最大的那几个供应商,目前会采用相当完备的安全规程(我之所以知道这些信息,是因为我们在技术大会上会相互交换技术资料并作比较)。作为客户,在安全方面孜孜不倦当然是好事,不过如果客户总是想着:“嘿,我认为我应该帮供应商做点儿什么,所以让我来看看他们的源代码有什么漏洞没有”,这样就不是什么好事了。即使是面对如下的情况,这也不是什么好事:

  • 漏洞扫描工具报警:客户其实没有能力去分析被报警的部分是否是在安全控制范围之内的,更何况这种报警往往还都是“虚假警报“(false positive)
  • 即使发现问题,客户也没有能力去自己给问题开发补丁程序——因为只有供应商才有能力开发补丁程序
  • 客户在使用静态工具分析源代码时,实际上很可能已经触犯了许可证协议条例(条例规定不能对源代码进行任何操作)

我来开门见山地说吧:我认为很多时候说”客户使用逆向工程技术”这句话其实并不准确,因为真正的逆向工程操作是由客户聘用的顾问来做的,这些顾问运行一下逆向工具,逆向出一堆代码,用打印机打印出一大坨,往客户面前一撂,接下来客户就会把这一大坨送给我们。我现在已经注意到,给我们送来的所谓漏洞扫描报告根本就不是“证明这里或者那里有问题”的清晰报告,不管是采用动态分析还是静态分析,漏洞扫描报告完全不体现漏洞存在的真正证据。通常情况下,这些报告就跟一缕蒸汽一样(扑朔迷离又没有价值)。

没事儿找事。(是的,我打算一直这么说:没事找事。) 这就是为什么我们要求客户举报每一个所谓”问题“时,都必须填写服务申请(而不是仅仅把漏洞报告扔给我们就完事儿了),同时还要提供概念性的证据(确实有一些工具能做到这一点)。

通过我们自己的分析,如果我们真的认定扫描报告的结果只可能来自于逆向工程(我们至少遇到过一次以上这种案例,因为报告上“很聪明地”写了:“通过对Oracle XXXXXX 软件的静态分析……”),那么我们就会立刻给“有罪”的客户写信,并同时给为“有罪客户”提供咨询的“有罪顾问”另去一封信件,提醒他们已经触犯了Oracle许可证协议中禁止使用逆向工程的条款,所以不要再这么做了。(用正规的法律语言来说,Oracle许可证协议上的条款是这么写的:“用户不得进行逆向工程,反汇编,反编译,以及任何从程序中获得源代码的尝试”,我们在给客户的警告信中就会引用这个条款)。哦,我们还会要求客户/顾问销毁从逆向工程得来的结果,并要求他们确认他们执行了销毁。

为什么我要强调确认销毁呢?最主要的原因是,我要把这个事情做得板上钉钉。我可不想为了“你们触犯了许可协议”,“不我没有”,“有的,就就是有”,“不,我们没有”这种来回扯皮的话浪费时间。我宁愿花更多我自己的时间,以及团队的时间,去帮助提升开发代码的质量,而不是和人们去讨论用户许可证协议细节问题

现在我需要重申一下,我在这里并不是要用许可证协议来打压用户。我其实更想说的是,“我不让你去分析代码,是因为我自己会去分析。分析代码是我的工作,我们很擅长我们的工作。我们能切实对代码进行分析,并弄清楚真正的情况是什么,而第三方咨询机构或者其他工具软件则做不到。无论在何种级别上,这些工具软件找出来的所谓‘漏洞’几乎 100% 都是‘误报’。所以不要再浪费你的时间了,那些工具里面的小绿人报警帮不了你任何忙。” 我不是要逃避我对客户应尽的运维责任,我仅仅是想避免那些痛苦、烦躁又让双方都非常不爽的过程。

基于上述原因,我想解释一下 Oracle 实施用户许可证条款(尤其是关于逆向工程的条款)的目的,其实这个目的非常符合逻辑也非常符合直觉,那就是:“我们告诉你我们的底线在哪儿,一旦你越过了,我们就对你不客气。”  附注:我在日常与人交谈时偶尔会用到 stare decisis(译注:拉丁文,意思是“照章办事”)这种法律专业词汇(不过我的狗完全不懂拉丁语,它只明白夏威夷语),不过我毕竟不是律师(译注:作者的意思是,他的观点并不能代表Oracle对这些问题的官方司法解释)。所以,当你有什么疑问的时候,参照 Oracle 许可证条款原文就好了,原文比我在这篇文章里写的要准确严格得多。

 

依照上面说的那些原则,我列出一些 FAQ 问答形式的文字,用来做为解释:

问:什么是逆向工程?

答:总的来说,我们(Oracle)的代码都是编译(是的,我知道有些代码是解释型的)以后(以可执行的方式)交付使用的。客户拿到的是可运行的代码,而不是代码在“被开发”时的形式。用户绝大多数时候只需要运行代码,而不需要了解代码是怎么拼凑在一起工作的。这样做的理由很多,例如事实上,我们的源代码是非常宝贵的知识财富,受知识产权法保护(所以我们会对能够接触到源代码的人群设置重重限制,就是为了保护源码的知识产权)。Oracle许可证协议限制了你只能使用交付形式的代码,这一限制隐含着一个事实概念,那就是你不能够反编译,反汇编,不允许把故意做扰乱处理的代码复原,不允许用任何其他形式的将代码从可执行形式转变会原始形式。尽管对于这些限制会有一些特别注释,但是也绝对不会出现“只要你是在寻找代码漏洞就万事大吉”这种例外情况。

所以说,如果你要尝试把我们卖给你的代码转变成与我们卖给你时不同的形式——比如,转变成在我们写这些代码,并且还没有通过对他们进行加工然后卖给你的那种形式,那么你就很可能是在逆向工程了。不!要!这!么!做!

 

问:Oracle关于提交安全漏洞的协议是怎么规定的呢(是不是允许使用工具呢?)

答:我们需要客户针对每一个漏洞做一个上报申请,并提供测试用例,证明你所谓的安全漏洞是可被侦测到的。我们之所以采取这种策略的原因,是为了筛除大量采用安全工具软件扫描得出的不准确的漏洞信息(也就是误判的漏洞信息)。

 

问:为什么你们(Oracle)要去找那些客户的顾问的麻烦呢?客户的顾问又没跟Oracle签什么许可证协议。

答:顾客是同Oracle签订过许可证协议的,那么由顾客雇佣的顾问就因此具有了连带签订许可证协议的法律关系。要不然的话,岂不是每个受雇于客户的顾问都可以说(注意,下面是法律咒语):“甲方甲方能力差,顾问顾问最牛叉,甲方不能我偏能,我想干啥就干啥”。

 

问:如果真的有用户发现了安全漏洞,Oracle会怎么处理的呢?

答:每当被问到这个问题的时候,我的第一反应是拒绝的。因为我想再次重申,用户不应该也不允许对我们交付的代码进行逆向工程。然后,如果真的有客户发现了货真价实的安全漏洞,我们就一定会去修复。我们不喜欢从用户那里发现漏洞(我知道这种说法很可能得罪人),但是如若真的发现了问题,我们也不能熟视无睹。然而,(从另一种角度看)我们去修复错误,也是在保护我们其他的客户,因为一旦我们修复了错误,其他客户的错误也同时得到了修改。不过,我们是不会给上报漏洞的客户(如果他们真的是通过逆向工程来发现漏洞的)提供专门(一次性)补丁的。在发布的公告中,我们也不会(给违规上报者)提供任何赞誉。所以你就不要指望我们会对你说:“感谢你破坏了我们的许可证协议“了。

 

问:现在的反编译产品越做越好,上手也越来越容易,所以说是不是以后的某一天逆向工程就变得OK了?

答:啊,不会的。我们对于逆向工程的反对是基于保护知识产权的立场的, 我们并不是要证明“我们把聪明才智都发挥在阻止我们的客户发现我们安全漏洞上,即使发现了漏洞我们也不修复”。我们鼓励客户在可执行代码上使用工具进行评估,只是说不要去逆向工程就可以了。从这一点来看,用户通过使用第三方工具或者服务来发现问题也是有可能得到我们的优质服务的,只要你跟你的工具开发商或者服务供应商确认一下:a) 工具的工作原理是什么 b) 他们是否实施了逆向工程来达到目的。不管他们说得怎么天花烂坠,你只要记住,问题正确的答案就只有几种情况:“不,我们没有做”;“是的,你做了”;“没做”;“做了”。(译注:其他的答案都是忽悠你的或者是废话)

 

问:不过我的 编码顾问/第三方漏洞扫描软件 真的很牛。你们Oracle就不能把我提交的400页的漏洞扫描报告好好分析一下吗?

答:嘿,哥们儿。我觉得我说这件事情已经说了这么多遍,我都快成说唱歌手了:我们Oracle自己有自己的代码静态分析工具(而且是我们自己开发的),我们自己会分析!外面的那些垃圾工具真的是不准确到离谱啊!(有的时候误判率居然达到了100%,或接近100%),况且用软件工具扫描这件事情本身并不重要。重要的是你要有分析扫描结果的能力,诸如此类。如果我们花时间去判断客户或者他们的顾问的指指点点,分析那些毫无意义的东西,那完全就是一种浪费。我们应该把我们的时间花在刀刃上,也就是说,花在去找那些真正的漏洞上面去。

 

问:是不是一旦有人发现了真正的漏洞存在,你们就会说他们是通过逆向工程才找到的啊?

答:诶,我可是冒着被人骂啰嗦的风险再跟你们说一次:不,不是的。就好比如果有人家里的门或者窗户没锁,那么你直接进入就不算非法闯入。虽然我们不敢说用过市面上每一款的扫描工具。不过我们确实要求开发组(连带包括云端开发和内部开发机构)多用漏洞扫描工具,我们过去几年在工具使用方面已经取得了长足的进步(看看我们的指标数据就知道了),并且我们把跟踪工具的使用纳入到了“Oracle软件安全确认规程”当中。我们强迫——我的意思是“要求”——开发团队使用漏洞扫描工具,是因为我们非常愿意(当然我们的客户也非常愿意)尽可能早地发现并修复各种问题。

业界有云:没有一种工具是万能的。实际上几种工具加起来也达不到万能。我们做不到万能,不过这并不能说用户试图通过逆向工程来找我们的漏洞就是正确的。其实分析一个疑似的漏洞究竟是不是真正的漏洞,最关键的就是对源代码进行分析。坦率地讲,第三方软件是很难做到从源代码的角度进行分析的。随便哪个客户用逆向工程工具粗浅扫描一下,就给我们发漏洞报告,我们自然是不能接受,原因很简单,我们并不需要这样的报告。

 

问:嘿,我有个主意,干嘛不搞个bug悬赏活动呢?如果第三方帮你们找到漏洞,你们给他们奖金不就可以了?

答:诶(再次大口叹气)。Bug悬赏活动是给那些玩票儿的人准备的(玩票儿这个词儿不错吧,是不?)。好多公司把自己和安全研究员都搞得跟神经病一样,让他们来找公司产品代码中的问题,然后还坚持认为:这才是解决Bug的终极之法,就得这么干:如果你不搞Bug悬赏活动,那你就没法做到代码安全。啊,好吧,其实我们87%的安全漏洞都是我们自己找到的,我们的安全研究员会找到约3%的漏洞,剩下的漏洞则是通过用户来发现的。(这里跑个题:我今天发现,一个还挺有名气的安全研究员上报说,在某个特定的技术领域他发现了一堆所谓漏洞,希望我们引起注意——实际上我们早就发现了全部的漏洞,现在已经在着手修补,或者都搞定了。哈哈哈,这件事情笑得我胸围都变大了!)

我并不是要贬低Bug悬赏活动,只是这么做毫不符合经济学逻辑,我为什么要花钱去请一个只能解决我3%问题的人(并且还不能持续性解决问题,基本上就像打田鼠一样看一只打一只),我有这些钱还不如其再聘请一个全职雇员,让他去做一些合规的hacking,然后为我们开发出好用的工具,从而能够自动发现并解决某个特定类型的问题,这样才是正确的做法。其实这个问题就是一个“该信基督教还是该信天主教”的问题,我们当然会包容不同的宗教和文化,但是我们会用我们的方式来包容——其他人怎么做那不关我们的事。祝你们平安!
 

问:如果你不让客户去做逆向工程,万一他们生气了不买你们的东西了咋办?

答:的确我们听到过类似的说法。不过讽刺的是,就是因为他们愿意买我们更多的产品(或者使用我们的云服务),才必须跟我们签使用许可协议啊!所以他们这么想就已经是在违背许可证协议了啊。“亲爱的,如果你不让我再次背叛你的话,那么我们的爱情就能天长地久”,“啊,额,你已经违反了婚姻誓词里面‘无论如何都会天长地久’的誓言了啊,所以我们的婚姻完了”。

同客户沟通更好的方式——通常我也会这么做——就是跟他们解释我们会对我们的产品充分负责,包括我们自己会开发漏洞扫描工具。我希望用户对我们的产品和服务有信心,而不是需要老给他们写信提出警告。

 

问:好吧,你们可以说那些坏人以及竞争对手会去对Oracle的代码进行恶意逆向工程,而且也不会在乎你们的许可协议,不过还是有些客户是出于好意的吧,对于这些人你们也要限制吗?

答:Oracle许可证是为了保护知识产权的目的而存在的。而第三方扫描我们代码的行为被称之为”好意“,我觉得这种观点需要修正,任何为侵犯许可证协议的行为找借口都是不可接受的。就像是你不能跟你的配偶说:“别人家都出轨了”,这完全不是一个正当的理由,因为结婚的时候这些约束都是定好了的。

写到这里,我觉得我可以下个定论了,或者说可以拍板了。我们要求客户不能对我们的代码进行逆向工程,从而找什么安全漏洞。我们自己有源代码,我们自己会运行扫描工具分析自己的源代码(当然我们同时也会分析可执行代码),所以分析代码这件事情真的是我们的事情。我们不需要客户,或者天知道哪儿来的一个第三方机构通过逆向工程来帮我们找漏洞。最后,但是也是最重要的,Oracle许可证协议禁止你这么做。所以你们就不要去做了就对了。


* 我觉得肯定有一部分客户来回地骂我,因为这些客户已经给他们的顾问付了一大笔咨询费了。他们会觉得是因为我们(无能导致漏洞产生)让顾问们敲了他们一大笔(其实是顾问违反了许可证协议在先)。

** 我能想到的唯一的比喻是,我的书架。有的人看了我书架上的书名,就会觉得我是一个好色之人,喜欢看色情小说。并且他们还会让我解释,为什么我要买这么一堆奇奇怪怪的书。比如这些例子(这些真的是我书架上的书的名字哦)

1. 来自下方的雷霆一击(额滴亲娘,一定很劲爆)

2. 裸体经济学(“裸体主义哦!”)

3. 地狱烈火(“哇,一定更劲爆”)

4. 黎明,我们睡去(“你一定是昨天晚上运动过度了才会熬到黎明都不睡吧”)

对于这些,我的回应是,我可没义务给你们解释我对图书的品味,我也不会去真正回应这些怀疑。(不过你们如果真的感兴趣的话,我就告诉你们吧,1. 这是一本传记书籍,书的主人公是 Eugene Fluckey 舰长,第二次世界大战美国海军潜艇舰长,国会荣誉勋章获得者。2. 这真的是一本经济学书籍。3. 这是一本介绍二战期间欧洲剧院的书籍。 4. 这是一本描述珍珠港事件的作品。

***我怎么会讨厌凯恩斯(英国著名现代经济学家——译者注)呢!!! 世界上现存的渡渡鸟(一种珍稀动物,已灭绝——译者注)的数量都比凯恩斯乘数理论的支持者要多。据我所知,“渡渡鸟”和“凯恩斯乘数原理支持者”这两个词汇都能当同义词使用。

****当然,我可能有点夸张了。但也许没有。

 


补充1:摘录 Reddit 网友的吐槽:

gaggra:

这篇博文口气真是傲慢、无礼、假仁假义,我肯定该文要被甲骨文的公关撤下了,因为这真是一篇烂稿。

joeflux:

文章中指出,客户发现的漏洞数量(10%)是他们自己安全人员发现的 3 倍。他们是怎么响应的?给客户发威胁信。

 

willvarfar:

So is Oracle’s packaged-up Linux distro only “Unbreakable” in a legal sense, then? 😉

http://www.oracle.com/technetwork/topics/security/securityfixlifecycle-086982.html says 甲骨文在这篇文章说过

Oracle appreciates and values the members of the independent security research community who find vulnerabilities, bring them to our attention, and work with Oracle so that security fixes can be issued to all customers. 甲骨文赞赏并重视发现漏洞的独立安全研究社区……

So there’s some kind of disconnect going on here anyway.

补充2:

Paypal 的漏洞奖励政策有点奇葩

(曾经)要求提交漏洞的人必须年满 18 岁。2013年5月,有位 17 岁的德国小伙 Robert Kugler 提交了一个 XSS 漏洞,不过因为没满 18 岁,所以……

补充3:

Mary Ann Davidson 这篇文章在 Reddit 引发争议后,后来 Reddit 上又火了另外一篇文章《PostgreSQL: Please, security test our code!》。

甲骨文:不行,你不能看我们的源代码!,首发于博客 – 伯乐在线

亮瞎眼的特斯拉线圈

之前发过一篇用于产生电弧的马克思发生器, 那个玩意儿跟特斯拉线圈相比,就是小巫见大巫了。
尼古拉·特斯拉是一百多年前的一位发明家,他发明了交流电、无线电,制造过小型的地震,搞过巨型的人造闪电。总之他的传奇故事很多,据说是被奸商爱迪生打压以至于默默无闻,著名的电动汽车特斯拉就是为了纪念这个疯狂的科学家。

有传闻说特斯拉玩的闪电,可见范围达到几百英里,不知道真假。我等凡夫俗子,顶多利用特斯拉原理来产生个小型闪电就好了。

 

Step 1: 准备和注意事项

我们的目标是做一个1000w的中型特斯拉线圈,放电距离超过120cm,特斯拉线圈的放电距离和功率成正比。
主要材料及大概成本:
1:高压变压器 1000W 输入220V 输出 10KV
2:大量无极电容 如用0.047uf 1000v~(1600v-)的cbb电容需要准备100只左右,有大容量的高压电容请自己换算
3:直径13厘米长1米的聚氯乙烯管(壁厚0.6-1厘米),pvc管材也将就,厚0.8厘米的绝缘板材(不能是木头!最好塑料)大约2.5平米,厚0.5厘米的绝缘板材(非木!)大约1.5平米,这些都可在家庭装饰城(就是那些买涂料,板材,工具等的那种大市场里)买到
4:导线,多芯铜导线,1000v50A大约6米;10kv1A导线3米
5:耐压漆包线 内径0.5mm 900米长
6:直径0.8厘米的铜管(壁厚1mm以上)长8米,直径3厘米厚>1mm长1米的铜管可在汽车配件或五金等地买到
7:电手钻,螺丝刀,手锯,钳子等工具,普通螺丝,塑料螺丝,环氧树脂胶,钢尺等
8:用于燃气热水器的排气管(金属制作,可弯曲,直径在10厘米以上)制作后期计算得到长度.
Step 2: 电路原理图

等等,你特么是在逗我吗?我们是在做一个极其高大上的“雷公电母”设备,它的原理图怎么可能这么简单。

所以感慨一下科学的伟大吧,小小一张图就可以让你拥有神一般的力量……

 

Step 3: 装配示意图

当然,从原理图到真正的装备,还有很多路要走,这个就是装配的示意图。

Step 4: 一些相关的计算公式

1. 电弧长度: 电弧长度 L(单位:英寸); 变压器功率 P (单位 瓦特); L=1.7*sqrt(P)
2. 电容阵容量: 变压器输出电压(交流)E(单位 伏特); 变压器输出电流 I(单位 毫安); 电容器阵列最大容量C(单位 微法) ; 交流频率F(单位赫兹) C=(10^6)/(6.2832*(E/I)*F) [电容的大小涉及到与变压器功率的一个匹配问题,当电容过大时在交流上升到顶点时(即sqrt (2)*V时,电容电压过低无法击穿打火器的空气隙则打火器无法启动就无法工作,整个系统也就无从启动 ]

3. 电容阵的计算就是电容的简单串,并联,初中就学过,在此就不提了.例如当变压器功率为1000瓦时,输出电压为10000伏(交流),那么电容匹配为0.0318uf,手头有电容规格为:0.047uf 1000~,1600-,再取保险一点到 耐压 1500v~则需要电容阵列安排如下:15个电容串联成一个基本链(BC);再10个这样的基本链并联而成(J),共需要电容150个,若每支电容分压降为630v~(这样可以大幅度延长电容寿命),则: 24–BC,16–J,共需384支电容.

4. 其他: 震荡频率:F = 1/(2*Pi*sqrt(L*C))

Step 5: 制作主线圈

在特斯拉线圈的设计中主线圈采用铜管绕制成蚊香状。铜管是用于汽车,供热,中央空调中的那种管壁较厚的承压铜管。直径8毫米大约绕制9-10匝,大约需要9米,最好选用光滑无锈无伤的。

Step 6: 主线圈支架

 

这样盘成的主线圈可以适用于6英寸到8英寸的次极线圈(盘铜管很费时间,也满费劲,但是不要图快,要尽可能盘的圆滑.),还需要5毫米厚的软塑料板(非脆性塑料)做主线圈支架,将其按等距离打眼(要打成9毫米的眼,要不穿不进去) 底座选用普通中密度板就可以了,这个底座还有用,将来底下要放其它东西.也尽可能加工好,接下来把铜管和塑料支架穿起来。

Step 7: 内圈接头

 

内圈接头部分,将中密度底版在相应地方开孔引出一个接头。

再找一截铜管做为接地保险,注意,不能让它闭合!

Step 8: 电容阵列

在特斯拉线圈中,有一堆好的电容非常重要,因为所有电弧的能量都是由电容直接提供的。由于高压电容价格昂贵,所以现在普遍的做法是通过对普通无极性电容进行串联和并联来达到所需的耐压和容量。
需要准备的材料:
1.无极性电容,(聚乙烯,聚丙烯,CBB电容 等)一般常见高压电容规格主要有:1600v-0.047uf、1600v-0.068uf两种
2.电阻10兆欧(1000000ohm)
3.有机玻璃板
4.塑料螺丝

首先计算所需要的电容个数和排列方式,根据以前提到的变压器匹配计算得到电容量为0.0318uf/10kv,手头电容规格为1600v- 0.047uf, (此处注意:电容的耐压标示都是直流 ,而且电容器交流耐压与电容材质等多种因素有关,不能简单认为只要将直流耐压值除以1.414 就得到交流耐压值),从寿命和安全性角度出发,建议将每电容分压值定为450v~ 则得到整个电容阵构成为:22串一链,共14链并联,一共308支电容电阻,电阻的用途是为了当停止使用时对电容中的残留电荷进行放电,使用方法就是每支电容都要并联一支10兆的电阻(1/4~1/2W )

安全提示:若没有放电电阻,则电容阵中储备的能量将可能存在很久而对人身造成伤害!

图中显示了一个电容链,它是蛇行排布的。注意!电容之间不要紧密接触!要留有一定空隙,层与层之间要用4mm厚的有机玻璃隔离,每层包含两个链,固定使用塑料螺丝(尼龙螺丝), 每层都有各自的接口使之成为独立可使用的单元。

Step 9: 次极线圈的制作

特斯拉线圈中的次极线圈是整个特斯拉线圈中制作最耗时耗神的部分。需要如下材料:
1. 高质量漆包线,一定要买好的,尤其是目前我国的漆包线质量普遍低下,线的直径0.51mm ~ 0.57mm。
2. 聚氯乙烯管材,直径15厘米,最少2米,厚度自己感觉结实就好,一般能买到的大约在4-8mm厚。
3. 用木头制作一个绕线架(有绕线设备的土豪请无视)。用两个圆片穿在圆筒两边,再在圆片中间打眼,穿入中心轴,架到线架子里面就可以绕线了。一圈一圈的绕,大约绕900~1000匝就适合本系统了,整个绕线过程大约7-8小时。
中间休息时一定要把已绕好的部分固定好,免得前功尽弃。绕线时要注意不要使线打结,不要用两根线接起来使用。市面上够长度的漆包线不大好找,大约在500m,但是整卷的线似乎比较贵。有兴趣的朋友可以一起买一大卷分着用。

Step 10: 打火器

 

制作打火需要以下材料:
1.200mm直径pvc管材,长400mm
2.90mm长,直径20mm铜管若干
3.双头螺丝 若干(是铜管数目)两倍 

打火器其实相当于一个开关器,未打火时能量由变压器传递到电容阵,当电容阵充电完毕时两极电压达到击穿打火中的缝隙的电压时,打火器打火,此时电容阵与主线圈形成回路,完成L/C振荡进而将能量传递到次极线圈。制作步骤:
1.先将铜管打眼。
2.再在pvc管上打眼后,将铜管固定在pvc管内部 (每个铜管与铜管之间的缝隙大约控制在1mm)
3.组装好

为了根据需要调整放电缝隙,每相邻螺栓代表1mm的放电缝隙(螺栓即为接线柱)这样安装只要变换接线柱就可以很方便的根据你的设计电压进行调整了。
注意:打火器工作时将会产生很大的热量,而且往往集中在很小的面积上,所以散热设备必须很强大!一般采用小型立式风机(就那种吹婚礼拱门的),一般都在几百瓦,风量足。
只要注意在进风口加上简单的空气过滤装置防止大灰尘就可以了。
如果不加风机散热的话,特斯拉线圈工作几十秒后就可能导致打火器高温变形,加入风机后,一般可以把整个特斯拉线圈的工作时间延长至十几分钟。
另外,要经常在使用后对打火进行清理,去掉电渣和灰尘。

Step 11: 放电终端

 

在这部分的制作比较简单和随意,我这里介绍一种比较成熟和简易的制作方法,也就是最常见的圈型放电终端。
主要材料:
1. 4寸直径的燃气热水器通风管,(就是那种全金属的可弯管,家里有燃气热水器的一看便知)
2. 7寸直径的平底金属盘(用来做派的),其他类似金属物也可,关键1.平底 2.金属
3. 包裹金币巧克力的那种较厚的铝箔

首先将平底金属盘底对底用螺丝固定,接着将铝管盘成圈状,使其正好能卡在平底金属盘制作的骨架上,铝管的接口口处用铝箔封口,接线点定位在平底金属盘骨架中心,组装好成品。
至此特斯拉线圈的所有重要部分已经完成。

 

Step 12: 一些补充说明

 

关于特斯拉线圈的制作其实还有不少需要注意的事情,其中:
1:次极线圈的骨架既那个聚乙烯圆桶的饶线部分是有要求的,一般来说,饶线直径和饶线部分桶长比例在1:4左右
2:主线圈的底版可以用一些稍微便宜的材料制作,因为对它的要求不高,当然最好所有的塑料板材都能用雅克力板制作,这样有结实又漂亮
3:打火器的制作其实有很多方法,关键要注意的是a.放电部件要导热快 b.放电部件厚度要足够 c由于打火器更换频率最高,所以设计要以容易更换,价格便宜为主
4:关于高压电容,前些天见到微波炉内部有一种高压电容规格为 2100AC 1uF 且内部集成放电电阻的电容,看来如果使用这种电容也是一个不错的方案
5:关于主变压器,一般难以购买,可以去当地电子市场询问是否可以定做,如果没有,可以购买霓虹灯电源,规格为 15000V AC 50HZ 60mA 样子象个箱子,在国外特斯拉线圈爱好者中使用比较多,还有就是采购日本二手110VACin –6300vACout 变压器两个串联使用
Step 13: 亮瞎双眼的时候到了

世界各地有大量的特斯拉线圈爱好者,搞出很多炫酷的作品。

有的朋友可能又要说“然并卵”了,事实上,很多科技的突破,都是从一些莫名其妙的的发明演化而来。在自然界中,闪电拥有巨大的能量,据说地球每秒钟平均有45次闪电,如果能够抓住这些能量用来发电,那你就发财啦……

视频:

 

亮瞎眼的特斯拉线圈,首发于极客范 – GeekFan.net

DIY修炼:舵机知识扫盲

DIYer: Tod E. Kurt
GEEK指数: ★★★☆☆

1 简介

舵机控制的机器人

● 我猜你肯定在机器人和电动玩具中见到过这个小东西,至少也听到过它转起来时那与众不同的“吱吱吱”的叫声。对,它就是遥控舵机,常用在机器人技术、电影效果制作和木偶控制当中,不过让人大跌眼镜的是,它竟是为控制玩具汽车和飞机才设计的。
● 舵机的旋转不像普通电机那样只是古板的转圈圈,它可以根据你的指令旋转到0至180度之间的任意角度然后精准的停下来。如果你想让某个东西按你的想法运动,舵机可是个不错的选择,它控制方便、最易实现,而且种类繁多,总能有一款适合你呦。
● 用不着太复杂的改动,舵机就可摇身一变成为一个高性能的、数字控制的、并且可调速的齿轮电机。在这篇文章中,我会介绍舵机使用的的一些基础知识以及怎样制作一个连续运转舵机。

 

2 舵机的结构和原理

A.标准舵机图解

● 遥控舵机(或简称舵机)是个糅合了多项技术的科技结晶体,它由直流电机、减速齿轮组、传感器和控制电路组成,是一套自动控制装置,神马叫自动控制呢?所谓自动控制就是用一个闭环反馈控制回路不断校正输出的偏差,使系统的输出保持恒定。我们在生活中常见的恒温加热系统就是自动控制装置的一个范例,其利用温度传感器检测温度,将温度作为反馈量,利用加热元件提输出,当温度低于设定值时,加热器启动,温度达到设定值时,加热器关闭,这样不就使温度始终保持恒定了吗。

B.闭环反馈控制

● 对于舵机而言呢,位置检测器是它的输入传感器,舵机转动的位置一变,位置检测器的电阻值就会跟着变。通过控制电路读取该电阻值的大小,就能根据阻值适当调整电机的速度和方向,使电机向指定角度旋转。图A显示的是一个标准舵机的部件分解图。图B显示的是舵机闭环反馈控制的工作过程。

3   选择舵机

C.大扭力/微型/标准舵机

● 舵机的形状和大小多到让人眼花缭乱,但大致可以如图C所示分类。最右边身材不错的是常见的标准舵机,中间两个小不点是体积最小的微型舵机,左边的魁梧的那个是体积最大的大扭力舵机。它们都是同样的三线控制,因此你可以根据需求换个大个的或小个的。
● 除了大小和重量,舵机还有两个主要的性能指标:扭力和转速,这两个指标由齿轮组和电机所决定。扭力,通俗讲就是舵机有多大的劲儿。在5V的电压下,标准舵机的扭力是5.5千克/厘米(75盎司/英寸),转速很容易理解,就是指从一个位置转到另一个位置要多长时间。在5V电压下,舵机标准转度是0.2秒移动60度。总之,和我们人一样,舵机的个子越大,转的就越慢但也越有劲儿。
● 赶快想好你要做的东西,让我们开始动手吧。确定做什么之后,选择哪种大小的舵机(标准型、微型、绞盘型)就是小case了,你可以绅士般的从中选个最便宜的。在这个项目中,我选的就是微型系列的HexTronik公司生产的HXT500型舵机,额定数值是扭力0.8千克,转速0.10秒,只花不到4美元就搞定了。

4 舵机的支架和连接装置

 

D.多种舵盘

● 想在你的项目中用上舵机,就要满足两个条件:一是需要个能把舵机固定到基座上的支架,二是得有个能将驱动轴和物体连在一起的连接装置。支架一般舵机上就有,而且带有拧螺丝用的安装孔。如果你仅仅是测试的话,用点儿热熔胶或者双面泡沫胶带就能轻松的固定住舵机。
● 怎样连接驱动轴呢,你会发现舵机都附带了一些有孔的小东西,这就是舵盘,它可以套在驱动轴,臂上打上了些小孔。你只要用连接棒或者线把物体连到孔上,就可以将舵机的旋转运动变成物体的直线运动了,当然了,选用不同的舵盘或固定孔就能产生不同的运动啦。
● 图示的是几种不同的舵盘。前面4个白色的是舵机附带的舵盘,右边四个是用激光切割机切割塑料得到的DIY舵盘。最右边的2个是舵盘和支架的组合,如果你想实现两个舵机的组合运动,把这个舵盘的支架固定到另一个舵机的支架上就OK了。

E.普通舵盘设计

F.其他舵盘

● 制作普通舵盘对于童鞋们来说是比较容易的,先用矢量作图软件画一个多边形,这个多边形的半径和顶点数都要和舵机驱动轴匹配,这样它就能连接到驱动轴上了,其他种类的也是这样画出来的。

5   如何控制舵机

G.3线接口

● 像图所示那样,舵机有一个三线的接口。黑色(或棕色)的线是接地线,红线接+5V电压,黄线(或是白色或橙色)接控制信号端。

H.控制信号

● 控制信号(如图H)是一种脉宽调制(PWM)信号,凡是微控制器能轻松的产生这种信号。在此文中,我用的是常用的Arduino开发环境下的微控制器。
● 脉冲的高电平持续1到2毫秒(ms),也就是1000到2000微秒(µs)。在1000µs时,舵机左满舵。在2000µs时,右满舵。不过你可以通过调整脉宽来实现更大或者更小范围内的运动。
● 控制脉冲的低电平持续20毫秒。每经过20毫秒(50次每秒),就要再次跳变为高电平,否则舵机就可能罢工,难以保持稳定。不过你要是想让它一瘸一拐的跳舞,倒可以采取这种方法。

这是一个完整的Arduino设计程序,在这个程序下,舵机始终在正中间位置,控制起来很容易

I.舵机连接Arduino实验板

● 红色和黑色的线分别接到Arduino开发板的5V电源脚和接地脚上。控制线接到Arduino开发板的数字输入/输出脚9脚上。
● 用Arduino控制舵机也有不太给力的地方,就是Arduino程序把绝大部分时间都浪费在等待延迟命令上,不过童鞋们暂时不要失望,Arduino中内置有舵机函数,你可以用它内置的计数器来同时控制两个舵机(分别在9脚和10脚),是不是又豁然开朗了,这样我们不就能把节省下的编程代码干别的事情了吗。

这是一个调用了舵机函数的程序
6 舵机应用:云台网络摄像头

J.舵机控制的云台网络摄像头

● 看了这么多内容了,是不是有点迫不及待练练手的冲动,那就先来个简单的,材料就是下面这些,两个舵机、一个Arduino板、一个用来装摄像头的可转动基座。先用热胶把第一个舵机的舵盘固定到摄像头的底部,然后把第二个舵机固定到基座上,同时把它的舵盘固定到第一个舵机的一侧,最后把舵盘套到各自舵机上,哇塞,一个云台网络摄像头就这样诞生了。
● 图中是一个纯手工打造的云台网络摄像机,它用的是OpenWrt Linux系统的华硕wi-fi路由器。
● 网络摄像头和Arduino控制板都是用USB集线器连接到路由器上的。

通过Arduino的USB口同时控制两个舵机的程序

● 大致的流程是这样滴,当串口上有两个字节到来时,程序开始工作,赋给第一个字节0-180的值,让它调节摇摆舵机(调左右),同样赋给第二个字节0-180的值,让它调节倾斜舵机(调上下)。

7 如何DIY连续旋转的舵机

K.舵机的内部“解剖”结构

● 任何舵机都能变成一个双向、可调速的降速齿轮电机。通常情况下,需要驱动芯片和其他一些零件才能控制电机的转速和方向,这些部件舵机中都会附带,所以要想得到一个用到机器人上的数控连续旋转舵机,最简单也最便宜的的方法就是自己动手改造一个,哈哈,考验动手能力的时候又来了。

L.拿掉金属挡板

● 需要改动的是部分的电路模块和机械模块,电路模块中,我们要找两个阻值相同的电阻来充当电位计,机械模块中,则要去掉防止电机过速的挡板。

M.卸下塑料挡板

● 下面我们就开始吧,首先,卸开舵机外壳,HTX500舵机的外壳由3个塑料部分扣在一起。你可以用个小一字改锥或是类似的片状工具把他撬开,然后从轴上取下齿轮组,(记得标记好各个小齿轮的位置哦),再从下面小心的取出舵机的电路板。
● 舵机上有两个机械制动挡板,用尖嘴钳卸下驱动轴基座上的金属挡板(图L),用斜嘴钳卸下外壳顶部的塑料挡板(图M)。

N.焊上电阻

O.缠上胶带

● 用两个阻值相加约5 kΩ的电阻来替代5 kΩ的电位计,实际制作中,选一对2.2kΩ的电阻就能满足要求了。把电位计上的3根线焊下来,像图N那样焊到电阻上。再把这个重新组装成的家伙用绝缘胶带或是绝缘管缠好(图O),最后再和电路板一起重新塞进舵机外壳中,扣好外壳,一个改造好的舵机就呈现在我们面前了。
● 手工制作阶段到此就结束了,但是现在还能高兴的太早,因为只有找到基准点才能算是大功告成。在理想条件下,如果两个电阻完全相同,舵机就能精确的停到90度的位置上。不过呢,理想和现实总是会差那么一点点,因此舵机就没像理想中那样么精确。为了使舵机控制更精确,我们要找到一个基准点,方法是把上面编的程序灌进电路中,通过实验来看舵机究竟停在哪个角度,这个角度每个舵机都不相同,所以得出结果后要记录下来。
● 我们业余爱好者常用的舵机一般是用电位计来检测驱动轴转动到的角度,而用在工业机器人、电脑数控机床等大型系统中的舵机一般则要用旋转编码器来确定位置。光学旋转编码器的原理是这样的,把一个带有窄缝的圆盘固定在转轴上,然后用一个LED灯和一个光敏元件来记录光通过窄缝照到光敏器件上的次数来计算当前旋转到的位置。其实生活中这种技术也很常见,我们每天都要用的光电鼠标就是用的这个原理制作成的。
注:如果你不想撬开你心爱的舵机,Parallax公司(BASIC Stamp微处理器的制造商)有一款即用型,标准尺寸的连续转动舵机可供你使用。

8 连续旋转舵机的应用:5分钟的绘图机器人

P.安装好的绘图机器人*
● 想做个会画画的的机器人吗,那就去找两个连续旋转舵机来吧,我们这就开始。图O这个绘图机器人中包含了舵机两个, 9V电池,面包板, Arduino电路板,三福记号笔各一个,外加一对塑料轮子。
● 它的电路和云台摄像头一样,我们直接拿来用,而且它的部件都可以用热胶粘到一起。关于轮子的选择,更是简单,只要是直径在1到3英寸的圆东西都能用,比如塑料瓶盖之类的。为了减小摩擦,增大牵引力,我们在车轮上缠上塑料胶带。
● 这样组装阶段就完成了。接下来就是程序了,它的程序用一个包含基准点的变量来制动舵机,这个基准点我们上面已经通过实验测出(你的基准点可能不同)。程序的控制流程为,先让一个舵机朝一个方向运动一段时间,然后换成另一个舵机转动,这样就能得到一个螺线形的图画了。
● 代码在此:
#include
Servo servoL;
Servo servoR;
int servoLZero = 83; // experimentally found to stop L motor
int servoRZero = 91; // experimentally found to stop R motor
boolean turnleft = false;
void setup() {
servoL.attach(9);
servoR.attach(10);
servoL.write(servoLZero); // start out not moving
servoR.write(servoRZero); // start out not moving
}
void loop() {
turnleft = !turnleft;
if( turnleft ) {
servoL.write( servoLZero – 10 );
servoR.write( servoRZero );
delay(1000);
} else {
servoL.write( servoLZero );
servoR.write( servoRZero + 10 );
delay(4000); // turn more one way than the other
}
}

Q.运动中的绘图机器人

● 注意:永久记号笔画的痕迹不好清除,童鞋们千万小心哈,最好让绘图机器人在硬纸板或其他不透水的纸的画画,或者索性换成支水溶性的记号笔。

 

 

DIY修炼:舵机知识扫盲,首发于极客范 – GeekFan.net

【神级DIY】自制无线控制“甲壳虫”机器人

【导读】拥有一个自己会跑会跳的机器人是许多人小时候的一个梦想,如今这个梦想你可以实现了!此次电子元件技术网带来大师级别的DIY,自己动手就能做的机器人,做一个送给家里的小朋友绝对自信心爆棚啊!

话不多说,直接上图。

Solidworks 出图纸和模拟图

机器人身体

机器人头部

机器人漂亮的大腿

 

甲壳虫机器人3D模拟图

camworks 出刀路

甲壳虫机器人3D 模拟图 

 

加工及组装

在自己DIY的数控铣床上进行加工,用的6061 的进口铝板, 3mm厚度 

购买的经典型号舵机MG995,开始组装。 

甲壳虫机器人造型很漂亮吧! 

舵机板和布线已经完成

 

机器人安装完成

功率强劲的8000mah动力电池

机器人安好后摆个POSE

复位后的状态

机器人站起来了

机器人PS手柄和遥控装置

【神级DIY】自制无线控制“甲壳虫”机器人,首发于极客范 – GeekFan.net

DIY:制作曲面感光元件的针孔相机

我们曾介绍不少自制针孔相机,而通常都是使用已经提供好的纸模来制作。而来自加拿大的摄影师 Matt Bechberger,则分享了一个非常完整的针孔相机制作指引,包括了数学上及物理学上的讲解,相机通过弯曲胶卷曝光的办法,令胶卷可以均匀曝光,极大地消除了画面的暗角!很好玩哦~。如果你也想自制一台如此认真的针孔相机,可以来参考参考!

基础概念

针孔相机其实是最原始的相机,光线在物体身上反射出来,然后透过相机上的小孔,聚焦于相机内的底片上,而任何可以遮挡着针孔的东西都可成为快门,手动控制曝光时间。就是这么简单。

数学计算

制作方面,首先你要制造出一个好的针孔,在互联网上都可以买得到,又或你能够自制一个。建议材料是一般的铝罐皮,越薄越好。然后使用小锤及针,轻轻地戳一个洞,在戳的时候最后在底先垫一块橡皮擦,以防止变形。完成后再用砂纸把铝片磨平,并且用显微镜或平板素描器之类 (如果有),去检视针孔的圆度及质素。如果你选用一些硬质金属,则可能要特地使用电钻之类了。
然后你要找出针孔的直径,知道后就可以计算出所需焦距﹐也就是针孔与底片之间的距离。
算式如下︰焦距 = (针孔直径 / 0.03679)^2
例如 针孔0.3mm
焦距 = (0.3mm / 0.03679)^2 = 66.49mm
接下来要计算的就是「视角」(viewing angle),即是光线进入的最大角度,这取决于针孔的直径与物料的厚度。
这个需要动用直角三角形的公式,要用上计数机。d 就是针孔直径,而 t 就是物料厚度,简化版公式如下︰
视角 = tan^-1( (d/2)/(t/2) ) x 2
例如︰
视角 = tan^-1( (0.3/2)/(0.0762/2) ) x 2 = 75.74 x 2 = 151.5 度
视角的重要性,在于让你判断光线能否恰当覆盖到底片,如果覆盖不足的话,就会出现黑角及黑边。例如上图般,底片的对角线不应长于成像圈的直径。而成像圈的直径算式如下︰
成像圈直径 (mm) = 2 x 焦距 x tan ((视角)/2)
例如︰
成像圈直径 (mm) = 2 x 66.49 x tan (151.5/2) = 523.61 mm
在这个例子里,成像圈非常大,所以配合弧面底片的话,就可以在 120 底片上拍出 17cm x 6cm 的超广角影像。

相机制作

完成了数学计算后,就到物理上的实践。弧面底片的就可以让整块底片都与针孔保持相等距离,从而得到均匀曝光。
相机材料方面没太大限制,最重要是能够阻止光线进入。
卷动底片方面,则要使用如下图的扁状金属条 + 结他旋钮的东西,两边各一个,以松开底片及收紧底片之用。
快门方面,丰俭由人,你可以像作者一样,自制一个以弹簧及快门线控制的快门。
在相机背后需要钻一个小孔,以确定底片的使用量,最好在相机内部涂上黑漆,以消除任何杂散光。 

 

曝光计算

接下来要计算的是光圈值,这个会影响你所需要的曝光时间。
算式如下︰光圈值 = 焦距 / 针孔直径
例如︰
光圈值 = 焦距 / 针孔直径 = 66.49mm / 0.3mm = 221
这个世界恐怕没有甚么相机或测光表有 f/221,所以我们要做下一步计算。
根据「标准全级光圈值尺度」,每一级光圈值之间,光线量是减半,亦即是光圈的面积也是每级减半。数字如下︰1.4,2,2.8,5.6,8,11,16,22,32,44,64,88,128,176,256,352。但是超过 f/22 的测光表是不存在的,因此我们可以透过计算自行找出倍数。
不过放心,一般的针孔摄影不是精准的科学,所以也不需要精确的数学。在这情况下 f/221 大概接近 f/256,就当作 f/256 可以了。相比起 f/16 即是有 8 级的差异,也就是说 f/16 的光量是 f/256 的 2^8 倍,也就是 256 倍。
因此你可以透过测光表之类,以相同的 ISO 值但用 f/16 作测量,得快门值后再乘以 256 倍,就是所需的曝光时间了。例如我们测出要曝光 1 秒,那么在此针孔相机上则要曝光 256 秒。
倒易律失效 (Reciprocity Failure)
直至现时为止,所有东西都很直接很数学,但是在摄影上来说,还有一样东西称为「倒易律」。简单说就是在同一感光物料上,曝光时间与曝光量是成正比例上升的,曝光时间两倍,则曝光量也有两倍。但在实际拍摄上,当曝光时间超过一定秒数,就会出现「倒易律失效」,两者不再成正比例,如果想得到正确曝光,则需要额外曝光时间。
下图就是额外曝光简表,很有用,留着它︰
就用 256 秒曝光为例,因为倒易律失效,所以要用上 4 倍曝光时间,即是 1024 秒,由 4 分钟增至 17 分钟,差异当然很大,而且要在曝光环境良好稳定的情况下才是这样。不过放心,其实就算少几分钟也不会很差的,摄影师就曾试过仅用了应有曝光时间的 1/8 来拍摄,结果也不错。
最后提一提,由于针孔摄影往往需要很长曝光时间,所以使用脚架,或放置在稳定的平台上拍摄是很重要的。

 

检验相机成果

接下来让我们看看曲面感光拍出来的效果吧~。

DIY:制作曲面感光元件的针孔相机,首发于极客范 – GeekFan.net

DIY:拆了收录机,做个机器人

我(原作者)是那种会留下所有损坏的电子设备的人,因为我有可能会在某天用到这些东西。我有一张坏了的CD,一个磁带盒和一个别人送我的收音机,它会随机地保持关机状态。事实证明,这不过是因为收音机的某个焊点坏了。把收音机拆开后我才意识到,由于我们已经有了手机,这些年我们已经很少用到它了。如果我再把它组装回来,也不过是放在架子上落灰。

我决定把它身上多余的东西拆掉,用剩下的关键部位组装出一种功能不变但外表新颖的东西。这样起码还能将它作为架子上的装饰品。如果你也喜欢利用废品做机器人,那么你可能会喜欢这样的尝试。这个机器人能够播放CD、磁带,能听收音机,还能通过音频输入线与你的手机相连。

第一步:工具准备

要说出具体需要的工具还真有点困难,以下是必备工具。
1、达美电磨
2、电钻
3、机械螺丝
4、刀具
5、锉刀
6、中心冲头
7、热熔枪
8、钳子
9、螺丝刀
10、卡尺
11、一台3D打印机在定制支架时非常有用,如果你没有的话,你可以用聚氯乙烯这种材料,使用时将其热熔即可。

拆解

要想得到拼接机器人,你必须先将东西都拆开。你可以看到图中的受害者:一台美国无线电公司产的立体声音响。拆开后,我惊讶地发现里面非常空。我把这些东西拆开后,将它们都拼接到了一起,幸运的是这些东西都还能正常工作。这是一个看上去很好玩的立体声音响。当然,这些还不够,如果要做好机器人,我还需要找一些能当支架的废品。

重新组合

要做一个能站立的机器人,必不可少的一部分是它的双脚。我将一张硬盘劈成了两半给它做脚,用大型激光打印机的一些零件给它做了双腿。我发现最难的地方在于,如何将两个不相干的东西结合到一起。我需要一种能支撑这些零件重量的东西,我可不希望我将它拿起来的时候它就散架了。

我的解决办法是将零件对齐,给它们钻孔并用螺丝将其连接起来。对于一些没法钻孔并用螺丝连接的地方,我会先测量尺寸,并用3D打印机定制一些支架。

接着干

另外一个挑战在于如何连接这些扬声器。我想将它们变成机器人的肩膀,但不知道该怎么讲它们连接起来。在切开塑料的时候,我发现收音机外壳上的网很适合做肩膀。由于它们会阻碍其它零件,因此我用3D打印机定制了一些支架,让它们能够上下翻折。

快好了

到目前为止,头是最有挑战性的一部分。我希望机器人的外表在具有复古风格的同时,还能让人在看到它的第一眼就知道它的功能与声音有关。我发现一盒旧磁带的大小与电脑散热片的大小差不多。散热片也可以用来做机器人的头,因为它大部分地方是空的,能够轻易地在里面接线从而给它焊电灯泡。酷酷的机器人怎么可以不亮呢?另外,感谢我的女朋友在此过程中伸出援手。

一些收尾工作

搜寻过废物箱之后,我找到一个废弃的相机电路和一圈花线,并将它们装饰到机器人的头上,给它增加复古感。卷线很容易,只要将它绕在螺栓或者螺丝起子上就行。

整个过程用时比我想象的要长。总共用了50个多小时,不过整个过程很有趣。我还会对这个机器人做一些改进,比如给它身上加一些灯和可移动零件,并给这些灯加上控制开关。我还想知道如何能将机器人的嘴变得能够显示音量大小,并让它根据所播放的声音眨眼。如果你知道,请跟我联系或者在评论中告知我。能变废为宝是一件很棒的事,我会做更多这类大小的机器人。

DIY:拆了收录机,做个机器人,首发于极客范 – GeekFan.net

极客DIY:轻松使用树莓派控制灯

最近笔者正在研究微控制器和基于物联网的设备安全。因此,我开始考虑建立一个小型家庭系统化系统,虽然目前还没完成,但我想先在文章中分享一下我如何使用树莓派2及一些其他电子元件来控制房间的灯光。当然,我在这里不会介绍树莓派的初始设置,因为你可以在网上发现各种各样的教程。

注意事项

在我们继续实验之前,我想有必要提醒一下关于实验中“电流”的危险性。一旦出现任何状况,最糟糕的情况就是死掉或者烧了你的房子。所以,请不要试图完成任何文中提到但是你不理解事情,或者你可以在制作的时候寻求一些有经验的电工的帮助。

好啦,让我们开始DIY吧!

实验准备

硬件需求

1、树莓派2(或者任何5V输出功率的型号,均可)

2、USB无线软件狗

3、8路继电器

4、一些Female-Female跳线(40 PCS FEMALE TO FEMALE JUMPER WIRES)

5、灯头电线

(以上硬件,某宝均有销售)

其他要求

1、了解基本Python语言或者其他任何语言(我会用到Python)

2、对Linux系统有基本了解

3、专心致志

流程要求

首先,用ssh链接到树莓派上,并安装“apache”和“php5”:

你会需要安装python的GPIO库来控制树莓派的GPIO插脚:

了解元件

现在,在我们继续制作之前,你需要了解一下我们将使用到的电子元件。

1、继电器

继电器是一种使用非常低的电压输入控制高压电的电气设备。由一个线圈缠绕的金属杆和两个小型金属节点构成的闭合电路。其中一个节点是固定的,其他的都是可移动的。无论何时,当电流通过线圈的时候,它会产生一个磁场,吸引可移动节点向静态节点运动,形成电路。通过给线圈供应小额电压,我们就能完成高压电路的轮回。同时,静态节点并非在物理上与线圈有联系,因此一旦有地方出错,微控制器驱动的线圈也很少出现故障。

试验中,我使用一个8路继电器,可以同时控制8个设备。你可以选择自己的继电器或者继电板,但是请确保你在继电器的额定电压之内处理,以避免任何事故的发生。

2、跳线

跳线就是我们链接树莓派GPIO插脚与继电器的简单连接电线。

3、树莓派2

我们使用树莓派2作为一个微控制器来操纵继电器。它有40个GPIO(通用输入/输出)插脚。你可以看到下面这些插脚的布局,我们将使用这些接口为继电器加电和控制开关。

连接电路

电路非常简单。我们将连接GPIO插脚到继电板上。首先连接继电器板上的“GND”与树莓派上的任意“GND”。然后链接继电器的“IND1”到GPIO PIN 17,我们会把GPIO PIN 17作为一个控制第一继电器的输出。最后,将继电器的“VCC”连接到树莓派的“5V”GPIO插脚。让我们简单直接设置一下:

现在我们到了最为棘手的部分,我们要将继电器连接到接通主电路供电的灯头上。但是,我想先给你介绍一个如何通过直流屏电源开启及关闭灯光的简单操作。

我们通常连接两根电线到灯泡上,来提供电流供给。其中一根电线是“中性”电线,另一根则是实际带着电流的“负极”电线,同样的这里也有一个控制整个电路的开关。因此,当开关(闭合)连接到流经灯泡的电流和负极电线时,电路便完整了。灯泡从而亮了起来。当开关(断开),破坏了电路和灯泡的电流,因此灯泡不亮。这里有一个小的电路图来解释具体情况:

当我们在试验中,我们需要“负极电线”通过我们的继电器来打破电路,从而使用继电器开关的控制流经的电流。因此,当继电器打开,在闭合电路中灯泡也应该亮起来,反之亦然。请参考一下完整的电路:

控制脚本

现在,终于到了软件的部分。我编写了一个简单的python脚本来控制继电器开关,使用了GPIO PIN 17和一个PHP代码可以在任何移动终端上面来运行python脚本。你可以从我的Github(和CSS)上找到这段代码。

注意:你将会需要添加“www-data”用户到sudoers文件。

注意+:PHP代码只是为了测试,我们不建议在公共环境中运行。

不久我将完成这个设置,希望回来更新一个新的帖子。请在那时之前,自己动手试一下这个控制灯,但是一定要注意安全。

视频展示:demo1 :

demo2:

 

参考

· GPIO Diagram: http://data.designspark.info/uploads/images/53bc258dc6c0425cb44870b50ab30621

·https://www.youtube.com/watch?v=Z2B67hybdAA

·https://elementztechblog.wordpress.com/2014/09/09/controlling-relay-boards-using-raspberrypi/

·https://www.raspberrypi.org/forums/viewtopic.php?t=36225

·https://github.com/TheGreenToaster/web-pins/

极客DIY:轻松使用树莓派控制灯,首发于极客范 – GeekFan.net

自主机器人:你的私人WALL·E

DIYer: Kris Magri
制作时间: 2-3周
制作难度: ★★★★☆
GEEK指数: ★★★★★

看最终效果视频

Makey是我编程实现的一个自主机器人(自主者,非遥控也),能够识别并规避障碍。她拥有全封闭的底盘并使用差速转向(原文为“tank steering”,坦克的驾驶方式),这种转向方式使用两台分开控制的电动机分别驱动两个主动轮(一机一轮)

控制信号来自其自身携带的Arduino微型控制器(在国内用单片机如PIC、AVR,或者Arm处理器都可以很好地替代),另外有一个舵机用于Makey头部的转动。Makey的头部装有一个超声波探头,她会持续的左右摇头,以得到不同方向上的距离信息,并进行存储和处理

通过对Arduino的编程,Makey可是实现诸如寻路的功能,仅需要少量硬件上的修改,Makey即可参加机器人界热门的Mini-Sumo(迷你相扑)比赛.

 

1 工具和材料

● (使用的工具与零部件列表这里没翻,毕竟相当一部分东西买原版都不太现实也没有必要–国内的家伙事儿差不多的也能土法上马,有兴趣的童鞋请参考原文)

● 想得到关于这个项目的图示、图纸、代码,请移步 资料下载

2   制作机身

● 机身由两片铝合金薄板制成,涉及的加工方法有切割、钻孔和折弯。你可以一次一片的加工,或者两片一起做以减少占用加工设备的机时。成品见2.5
● 猛击 资料下载 下载图纸并全尺寸打印。剪下底板(base)切割图,用双面胶将切割图均匀平整的贴在铝合金薄板上
● 注意:切割金属时务必佩戴防护眼镜

2.1 切割

 

● 用带锯机把铝合金片切成图纸的形状,切割的边缘一定要在线外
● 提示:切割内角时,先切出一个大概的弧形曲线,然后从两个方向直线进刀以得到直角

2.2 打孔

● 用冲子和小锤子在图上有十字线的17处冲出定位孔,为下一步的钻孔做准备。另外要在图上长方形的孔的四个角上冲透

● 按照图上标十字线处的尺寸钻孔,要首先取下贴上去的图纸(不过别扔了),用钻头对准前面留下的冲痕开钻可以使钻孔更精确
● 把金属牢固的夹在废木头板上或者随便什么垫子上,这样可以得到更平滑的孔而不会导致薄金属板在钻孔处扭曲变形
● 为了掏成方形孔而钻圆形孔时,你可能需要调整钻孔的直径以使圆孔边缘与长方形的边相切

2.3 挖槽

● 用冲剪完成对长方形孔的加工,如果你愿意的话可以把前面揭下来的图再贴回去,以便容易知道长方形的边界在哪。最后把边缘磨平
 
● 用手工打磨工具去掉金属边缘的毛刺。给小孔磨边的方法为:把大钻头的尖端插进小孔,然后手工转几下

冲剪是长成这样滴:

 

2.1-2.3都是跟合金板过不去的活儿,原作者的办法基本是土法上马,与美帝的高科技风格严重不符。柚子在大学折腾机器人那会儿去交大观摩,他们有加工中心,只要把CAD图画出来发过去,那边用等离子切割机就给“打印”出来了,钻啊、掏异形啊这种活儿根本不存在。更神奇的是切完的边不用磨,基本不扎手。另外我们用土法掏方形孔的时候是先钻大孔,把带锯拆开一头套进去然后慢慢锯,得到的孔要多丑有多丑,然后还得上铁砧拿小锤砸平

2.4   弯板

● 把底板的折弯图用双面胶贴到铝板的另一面,对准圆洞方洞的位置,别贴歪了
● 把铝片贴折弯图的一面向上塞进弯板机里,在所有标示折弯的部位折90度
 
● 每个长边上的两个突出部要先折,然后再折机身的边。(顺序反了就塞不进去了)
● 折弯后要缓慢释放,测量,确认每一处折弯都要是直角
2.5   制作顶板

● 重复2.1-2.4步骤,加工顶板(top),然后你就搞定了每个机器人都会喜欢的底盘

3 运动系统

3.1 安装电机

 

● 用4-40 x 1螺丝穿过小孔,将驱动电机定位在底板上,电机的传动轴应该穿过大孔
● 使用螺母和垫片在电机的一端上紧,因为可以施展的空间尺寸很小,可能需要尖嘴钳子(夹住螺母)才能上紧
3.2   制作轮毂

● 用2英寸(外径,合50.8mm)的空心钻头(见过装空调的师傅在墙上钻大洞用的那种钻吧,很类似)在废木头板上钻出轮子(钻透木板之后木板上有个圆洞,钻头中间的洞里会剩下个圆片,这个圆片就是轮子),我用了18号板(貌似是一种规格),最终得到的轮子有3/4英寸(19.05mm)厚,直径1.8英寸(45.72mm)。钻轮子的时候要牢固的固定木板,并且缓慢进刀,防止卡住钻头
● 给2个木头轮子分别对心定位一个轮心(图中白色塑料的小轮子),并用小螺丝标记两个孔的位置,在此位置上用1英寸(原文如此,合25.4mm,不过疑为有误,从图上看孔绝对没那么大)的钻头钻透
● 给木头轮子喷漆,我喜欢红色光面防锈漆,这种东西非常薄,颜色很亮,覆盖性好并且容易清洁。注意,不要在安装孔里喷太多

 

3.3   制作轮胎
● 用43号钻头在轮心上钻两个相对的孔,然后用4-40丝锥在每个孔里攻出螺纹
● 用两个4-40 x 1螺丝从木轮外侧把轮子和轮心固定在一起,不要太紧
● 给每个轮子装轮胎,轮胎外径比较大的一面朝外。最后把轮子装在驱动电机的传动轴上
3.1-3.3就是折腾那俩轮子,原作者极其不厚道,没说怎么对心,这个很重要,谁也不希望做完的机器人跑起来一跳一跳的。您还别问我咋对心,我也没经验,新手还是找现成的轮子对付一套比较安全。另外3.2-3.3中原作者留下一个逻辑错误,看出来的童鞋请举手
3.4   安装万向轮
● 使用螺丝、螺母以及垫片将万向滚珠安装在底板底部

4 电控系统

4.1 安装电源

● 按照第一步打印出来的隔板图样,从一块硬塑料上切出隔板(隔板是用来装线路板的,用塑料是为了绝缘),按说明打孔,尝试着塞进机器人的外壳并使之架在驱动电机之上,作必要的修整,令其充分贴合匹配
● 用两个4-40 x 2螺丝将Arduino控制线路板与硬塑料隔板固定在一起,螺丝应从隔板下方穿入,并在线路板上方拧螺母。线路板上的USB接口需要和机器人面板上预先留好的开口充分对齐
● 将电池夹具铆接在机器人外壳的左侧面板上,预制的铆钉头朝外,这样的话丑的一头就朝里啦
关于铆接,这里指的不是造泰坦尼克的那种把烧红了的钢制铆钉插进去挤兑一下的工艺,而是一种将铝合金预制铆钉的开放端在常温下挤压成型从而将两个或更多构件固定在一起的方法,最常见到的是各地马路边的刮大风能掉下来砸死人的铁皮广告牌子,它们就是用这种工艺把镀锌薄钢板固定在L字钢框架支撑结构上滴
4.2   控制板
● 按照制造商的教程,把原型板(ProtoShield)焊好教程在 这里
● 用带锯机把板子上的BlueSMiRF接头切下来,这个接头是用来连接蓝牙模块的,我们的机器人用不到那东西。是不是锯得很爽?
● 把面包板接在原型板上,原型板插在Arduino上,如果用的是Diecimila(Arduino主板的一个版本),那么将电源跳线设置在EXT位上

焊接原型板绝对不是个轻松的活儿,没基础的童鞋搞不定也不用纠结。面包板(breadboard)是这么个东西,其意义在于省了烧电烙铁的麻烦,不过问题是有时候元件捅进去会接触不良…

 

 

5 给WALL·E安上一双明亮的眼睛

5.1 WALL·E的脖子

● 咱这个项目用的是HS-55型舵机及与之配套的较短的一字舵角,用5”钻头对舵角最靠外的两个孔进行扩孔

Du-Bro Mini E/Z 连接头, #DUB845

微副翼系统 Du-Bro Micro Aileron System, #DUB850

● 将两个Du-Bro Mini E/Z连接头从正面穿过摇臂两端的孔,并在反面用黑色橡胶的部件固定
● 将控制杆(图中所示的细铁丝样东西)穿过Du-Bro Mini E/Z连接头,并用连接头附带的螺丝拧紧
5.2   WALL·E之眼
● 有挑战性的工作来咯!咱们需要把舵机和超声波探头接在一起。把从舵机上伸出来的控制杆分别穿过位于传感器电路板对角的定位孔(这个定位孔来自Du-Bro Mini E/Z连接头,连接头又插在板子上的螺丝眼里,然后另一端用那个黑橡胶部件固定)并向外折成90度角
● 控制杆应该从舵角开始竖直向上,并且给超声波探头留下足够插信号线的空间,传感器正面(有收发端,也就是像俩小眼睛的那一面)朝前,控制杆上还应该套上绝缘套(就是那个塑料管)以防止短路,绝缘套在Du-Bro套件里可以找到。确认安装无误后,将控制杆与传感器上的连接头拧紧。
Du-Bro是美国的一家生产模型配件的公司,很遗憾我没找到这些产品的国内版本。欢迎在国内见过这些配件的同学提供信息
5.3   给WALL·E安上一双明亮的眼睛
● 将舵机和超声波探头出来的线穿过机器人外壳顶部预先留下的长方形开孔
● 舵机也要插进那个顶部开孔,调整好位置后两边用螺丝与螺母将舵机与外壳固定好,剪去多余的控制杆(还是那个细铁丝)
● 把舵机摇臂与舵机上到一起,用小螺丝刀调整一下保证Makey的眼睛(传感器)朝前

6 连接并测试驱动电机

6.1 电机预处理

● 咱的地摊货电机上的连接头部件是很脆弱滴,所以连接部分一定要用心
● 从外壳里拆出电机和Arduino线路板
● 切2红2黑各12英寸(304.8mm,12寸炮是305mm的,比如筑波级的2*2主炮)电线,每条线的两端1英寸(25.4mm)剥去绝缘皮。先别焊接,用一个红黑线对在电机的末端(有电源接点的那一端)缠几圈,以防止拉断,然后让线对从电机顶端通过,用双面泡沫胶带将其固定在电机上。注意不要覆盖电机上的任何孔洞,同时要为电机的固定留足空间
 
● 将电容的两个引脚分别穿过电机接线头上的小孔,焊接(这里应该是把引脚穿过去的部分和同一根引脚的根部焊在一起,这样的话引脚和电机接线头就充分连通了。注意,千万别把俩引脚焊在一起!)这需要使用尖嘴钳的巧妙掰弯手法。然后把给电机供电的电线头与电容引脚,注意,不是电机接线头,焊在一起,焊牢稳一些。再然后剪掉多余的电容引脚。把电容和缠在电机末端的电线一起用黑胶布(也就是绝缘胶带)紧密的缠在电机上,并且用更多的泡沫胶带把这个鼓鼓囊囊的位置包起来(还是为了固定)
● 把漏在外面的电机供电线拧成双绞线,这样可以减低电路中的噪声(一个供电的低压直流线路里有点噪声怕什么?原作者的想法好奇怪)。给电机标出左和右

在电机上并联了一个电容,这样做有两个好处。

其一,在稳定的直流电路里,电容是开路,不会影响电机工作,但是给电机通电的那一瞬间,电容因为要充电,可以分担一部分电流,所以电容作为一个保护器件可以保护电机。

其二也是更重要的,这种直流电机的接线头是一个铜合金片,从电机的塑料外壳里伸出来(通常被和塑料铸在一起),鬼知道奸商们用了什么材料,反正这个东西非常脆,尖嘴钳上去经常能掰断,然后这个电机就没啥抢救的价值鸟,另外这个铜片不怎么粘焊锡,焊接不易。但是电容的引脚一般都是类似铝、锡一样的柔韧金属,想怎么扳都能成形,焊起来也容易得多,所以作者把电气连接的活儿都转到这个引脚上来做。

【连电机的小经验】铜接线片作连接之前最好用细砂纸小心的蹭几下,去掉氧化物。电容线脚穿过去之后轻轻拉紧,在穿孔附近用尖嘴钳用力捏一下,使线脚与铜片充分接触。另外电线最好挑独轴的,也就是绝缘皮里面只有一根金属的,那种绝缘皮里有一束极细铜丝的线焊起来会有想死的冲动

6.2   电机测试

 

● 将短实心跳线分别焊接到电机供电线和电池接头线上,这些跳线可以让你把它们(电机和电池)插到面包板上,焊接之后用热缩胶带作焊点的绝缘(用绝缘胶布缠是一样的,除了丑一点和大一点)。将电机供电线穿过塑料隔板(4.1提到的那个)上的大窟窿(因为面包板和电机分别在隔板上下两侧)
● 按图示把电机驱动器插进面包板中间的一行孔里,使之和电机以及一个电池连通(注意,在面包板上,每一行的孔之间是连通的)。使用短跳线并保证这些线紧贴面包板,傻大黑粗的大电线是不配塞进机器人里的
● 从 Arduino官网 下载Arduino的软件并且安装之,再从 资料下载 处得到这个项目的5个测试程序。通过USB接口把你的Arduino和电脑连起来,如果你用的是Diecimila版本的话,把它的电源跳线接换到USB档上。
● 为了测试电机,运行名为01_Test_Motor_Rotation的程序,此时左边的电机应该先往前转再往后转,然后是右边的,先往前再往后。如果不是这样,检查一下你的接线。接下来运行02_Test_Motor_Speed,此时电机应该以低速启动,然后加速,最后反方向转,如果不是这样的话检查线脚D11和D3

7 连接并测试舵机和传感器

7.1 连接舵机

● 将电机和Arduino再装回机器人里面,找两个3针的单排直角插针(通常是将一个20针的单排插针折断得到)插在面包板上,把舵机线接在上面,具体接线规则为:黑线-GND(地线,电池负极),红线-+5V(电池正极),黄线-Arduino跳线D10
● 再来一个3针右转接头,这个是接超声波探头的,接线规则为黑线-GND(地线,电池负极),红线-+5V(电池正极),黄线-Arduino跳线D9

7.2 测试舵机和超声波探头

● 运行舵机对中程序03_Test_Servo_Center,松开舵机摇臂的螺丝并微调,舵机臂与超声传感器尽量指向正前,因为舵机轴齿轮的问题,这一步可能无法完全对中,没关系,我们稍后再调整
● 运行程序04_Test_Servo_Sweep,这个程序可以让超声波探头慢慢的摇头
● 再来测试超声波探头,运行05_Test_Sensor_Distance,点击Arduino软件的数据流监视器图标,你应该能看到不断跳出来的测距读数,而且如果你在传感器之前挥舞你的手,测距读数应该有变化。如果你得到的读数始终是0或者255厘米或者别的什么错误的读数,检查你的接线是否有误,并且千万确定你的传感器没接反 :P

7.3 安装开关

● 终于可以接电源开关鸟!把Arduino最后一次拆出来,为了装开关,需要把还没用到的电池引线的红线焊在开关的一端并且把另一跟红线焊在开关的另一端。同样别忘了把电池的黑色引线和另一个根黑线焊在一起
● 把线从机器人侧面的方形孔穿好,开关需要打在“1”的档位上,把开关塞进方孔里固定好,这个调整可能会用到钳子
● 把从开关出来的红色线脚接到原型板的RAW线脚上(这个线脚还连着Arduino的Vin线脚),把从电池出来的黑色线接到原型板的GND线脚上,如果你用的是Diecimila版本的话,把它的电源跳线调回到EXT档上

8 系统测试

● 现在所有的电子设备工作都正常鸟,小心的把所有东西塞回机器人里,啥也别落下。装好电池,把机器人放好,别摔了。用来传程序的USB接口应该能从侧面的孔里露出来
● 重新载入并运行01_Test_Motor_Rotation,注意,所谓前是指机器人的USB接口和传感器指向的方向,如果你的机器人反着跑,检查在线脚AOut1, AOut2, BOut1, BOut2, AIn1, AIn2, BIn1, 和 BIn2处的接线,可能也会需要反转驱动电机的连接
 

● 重新运行其他的测试程序,确认接线正常,测试完成后把舵机和传感器的线塞进外壳里,扣上顶盖,拧上4个螺丝固定,收工!

 

9 给你的WALL·E注入灵魂

● 有时候你的硬件做好了你就没啥事可干了,不过你的程序是写不完滴。这也是你展示创造力的好时机
● 在代码中你需要使用digitalWrite和analogWrite这俩函数来控制驱动电机,通过传递值给电机驱动器的各3个线脚。其中一个可以接收介于0到255之间的值,用于控制传给电机的电流大小,这个是用来控制速度的。另外2个线脚则使用布尔型变量,用于决定每个电机两端的电位高低,这个可以决定电机的方向(当然电机两端只能一端是高电位)
● 你可以编写类似void Forward()这样的函数实现简单的动作,比如后退(两个电机同时反转),Spin_Left(原地左转,右轮正转左轮反转),Arc_Left(画弧左转,右轮正转左轮不动)之类的。Arduino的编程环境使你的代码实验和加载都很方便
● 另外一个好玩的事情是规避障碍,只要运行这样一个循环:往前走,读取测距信息,如果障碍物太近则采取躲避动作比如后退并转弯,返回循环体头部

10 关于Mini-Sumo(迷你相扑)比赛

● 在 Mini-Sumo 比赛中,两个自主机器人会被放置在一个用白色漆成的圆形场地中
● 只要换上窄一些的轮子,比如GM家卖的 这种 ,Makey就可以满足大赛要求的尺寸和重量上限:底面10厘米见方、500克。你极有可能需要另外的朝下的传感器用来观察那个白色的环(场地边界),不过Arduino有足够的能力处理其他多出来的信号

11 DIYer签到处

虽然这个项目很困难,不过也不是完全不能做。如果哪位蛋疼的同学把它做出来了…应该会很愿意在这里秀出来让大家围观吧…

 

制作视频:

自主机器人:你的私人WALL·E,首发于极客范 – GeekFan.net

牛人自制加特林水枪,让你度过丧心病狂的夏天

(该项目来源于instractables,原文链接在这里,作者:projectsugru。该项目各步骤主要展示Sugru凝胶(或者是某特种粘土,本文统一译为Sugru凝胶)的应用,对加特林水枪的制作过程没有记录,但文后给出了各零件的图纸,相信DIY达人还是能搞定的。)

夏季的疯狂离不开水枪,我们要做一支史无前例的、帅到没边的加特林水枪,废话略,开始吧。

 

Step 1: 制作活塞

本步骤器件清单

PVC管一段,特种粘接剂(两种颜色,名为Sugru,以下称Sugru凝胶),锯子、夹具、锤子、雕刻工具和一杯肥皂水。

步骤:

1、用夹具夹住PVC管,锯下需要的长度(我用了2.5cm长);

2、将肥皂水涂在工作台面上(防止Sugru凝胶粘在台面上);

3、打开两小包同色Sugru凝胶并混合,把Sugru凝胶填充进刚切下的管子里,要完全塞满;

4、放置24小时让Sugru凝胶固化;

5、Sugru凝胶凝固后,将这段管子纵向置于夹具中,把PVC管切开小口(注意不要切到里面的Sugru凝胶);

6、用锤子敲击这段管子,直到把外面的PVC管敲破,得到一段圆柱形Sugru凝胶;

7、用雕刻工具加工圆柱凝胶两端,去掉部分材料,这有助于让活塞更湿软;

8、在这小段Sugru凝胶圆柱中部,沿周向雕刻环形凹槽;

9、打开第3包Sugru凝胶,滚成细长条并填充在上一步做成的凹槽上,注意让环状填充物的周长略大于Sugru凝胶圆柱,并放置24小时;

10、固化后,就得到一段活塞了,可以把它浸入肥皂水中。

 

Step 2: 做Sugru凝胶注射器

 

本步骤器件清单

Sugru凝胶一小包、壁纸刀、可弯曲的塑料管/软管、金属杆(或适合把Sugru凝胶推入管子的东西)、X2金属连接件、螺丝刀。

步骤:

1、用壁纸刀切下一段塑料管子(我们切了4cm长);

2、打开一小包Sugru凝胶,用手指捏成条状(享受这种感觉吧);

3、继续将Sugru凝胶滚成细长条;

4、用金属杆把Sugru凝胶推入塑料管子,从管子的两端推Sugru凝胶,确保Sugru凝胶塞满管子正中,两端留出1cm的空管子,静置24小时;

5、固化后,在Sugru凝胶中心钻通孔,孔径按你的需要确定即可;

6、在这段塑料管子外套上金属连接件。

Ok,Sugru凝胶注射装置就搞定了。

 

Step 3: Sugru凝胶绝缘开关

本步骤器件清单

Sugru凝胶一小包,漆包线,电烙铁和焊丝。

步骤:

1、用蓝色交联剂将用到的漆包线固定在恰当位置。

2、预热电烙铁,把两条线焊在合适的位置,确保焊点牢固。

3、取少许Sugru凝胶涂在焊点上,抹平,塑形。

4、放置24小时固化。

 

Step 4: 用Sugru凝胶连接和密封几段管子

 

本步骤器件清单

Sugru凝胶一小包,各种需要的管子(粗管、细管、渐缩管)。

步骤

1、摊开并排好所需零件。

2、用渐缩管连接管子。

3、将Sugru凝胶涂于连接处,注意Sugru凝胶必须完全覆盖连接点并超出连接部分,这样才能提供足够的结构支撑。

4、抹平Sugru凝胶并放置24小时固化。

 

Step 5: 定制Sugru凝胶手柄

本步骤器件清单

Sugru凝胶4-5小包,手柄。

步骤

1、打开一小包Sugru凝胶,润湿,让它软化。

2、从手柄底部开始涂抹Sugru凝胶(不够再开一包)。

3、继续一点一点地覆盖手柄,确保Sugru凝胶连成一片,完全覆盖了手柄表面。

4、手柄全部覆盖后,可以考虑用嵌入另一种材料的方法给手柄加纹理,我使用了背包带,你也来点创意吧,比如有人用海绵、牙刷,甚至橘子。

5、在Sugru凝胶固化前(从开包到开始固化,有30分钟时间),还可以用力抓握手柄,这样可以印出个性化的抓握痕迹。

 

Step 6: 用Sugru凝胶做护边

本步骤器件清单

Sugru凝胶1小包(实际只需要半包就可以保护每根管子)。

步骤

1、打开一小包Sugru凝胶,润湿。

2、取一半,并滚成两个等大的小球。

3、在金属碟尖锐处敷上Sugru凝胶。

4、塑形、平滑Sugru凝胶,确保管子连接正常,放置6小时固化。

5、检查管子和槽孔的配合,注意,如果Sugru凝胶使用过多,可以用壁纸刀在固化前切一点下来,如果Sugru凝胶用得太少,因为Sugru凝胶的粘连性很好,所以只要再加一层就好。

Step 7: 用Sugru凝胶固定松动部件

Step 8: 激光切割件的Dxf和Pdf文件

这把水枪制作周期长(超过60小时的团队工作量,还有许多无法入眠的夜晚),我们没有记录下全部过程。

实际制作这个大杀器是件令人兴奋的事情,Dxf文件给出了该项目中各组件的激光切割模型,请在这里下载,Pdf文件仅供快速预览,可以在这里下载。

文件的比例是1:1,铝合金零件厚4mm,不锈钢零件厚3mm。

相信这些文件能给你更高的起点。

附件:

牛人自制加特林水枪,让你度过丧心病狂的夏天,首发于极客范 – GeekFan.net

自制拉风电动滑板,回头率太高有点不习惯

创意是参照了@动力老男孩的一篇文章,最初的想法是DIY一个可穿戴的动力轮,像鞋子一样穿在脚上,不用的时候可以自动折叠收在小腿和膝盖处,用的时候可以伸张成轮子电力驱动快速前进,有点像哪吒的风火轮,主要是受《变形金刚》和《钢铁侠》两部电影毒害太深。后来发现水平极其有限,买了很多零件设备却做不出个所以然,东西都搁置在一边大半年。有天在网上看到动力老男孩的视频是把活力板改装成动力滑板,觉得我所有的材料都有了,就是差一块活力板了,于是速上某宝买了一块。然后就是水到渠成了。

废话不多说,下面上图,有的细节就省掉了

铝合金活力板,6寸皮带轮,皮带,120W有刷电机,控制器,安装支架,万向轮4寸

电池,遥控车手柄,铝盒。这些材料都是网上淘的,如下图:

1,活力板直接卸掉原来的轮座。

2,前轮用4寸的万向轮代替,万向轮的安装孔距(75*45)与活力板(65*35)的不一致,需要自己重新开孔对位,有点麻烦,不过也就是几分钟的事情,开孔搞定。

3,后轮找不到合适的支架,直接买了铝合金自己开孔加工的,这个花了两三天时间,因为要同时考虑电机、后轮、皮带和齿轮的重合,肯定要在一条线上面了,不然跑着跑着皮带跑偏掉链子了。电机架是用50*50的角铝做的,后轮支架用的是40*80*40的槽铝与铝排用螺丝铆合,图纸如下。图纸设计好后加工就容易了,手钻定好位,直接开孔就好,把握好力度不要打偏了就行。

电机架

后轮结构

4,duang,后轮和电机的安装就搞定了

机械结构主要工程完工,下面搞控制器。

5,控制器、电池和保护板都是网上买的,根据要求设计尺寸,然后点焊成2并7串,钴酸锂电池29.4V,刚刚配24V的电机,加上均衡充保护板,与控制器一起安装在铝盒里面,然后外接了航空接头和充电口。具体步骤省略,九芯航空接头是为了方便控制手柄接入,引出控制器的速度控制,开关,电量显示,刹车一共9条线,有三条是GND可以共用,其实七芯就可以了。

6,为了降低成本,没有使用无线控制,本人对无线控制接收也是一无所知,所以使用传统的有线手柄。控制手柄纯手工打造了,将玩具枪里面的扳机改造了一下,在扳机上加上两颗钕铁硼磁石,在两颗磁铁活动范围中心位置固定霍尔元件。原理跟电动车手把是一样的,转把里有一个感应磁力线大小的线性霍尔元件,手柄里还有两块磁铁,扳机转动磁铁也跟着转动,霍尔感应到磁力信号 就给控制器发出信号,从而控制电机转速。刹车也是改动了扳机,扳机往前推的时候触碰到一个非自锁开关,就能刹车,松开后开关会复位。另外在玩具枪上加上一个拨动开关控制总电源。电量显示还没想好怎么接,先预留着。

7,续航里程8~12km,最大速度18km/h,总重6kg,比网上销售的400RMB左右的铅酸滑板车行程要远,毕竟是锂电池的,动力比起铅酸也有力一些,另外楼主75kg,里程跟使用者体重也有关系吧。总成本在400元左右,忽略某些零件的邮费成本,因为某些零件比邮费还便宜,有兴趣的朋友自己DIY一台吧。

开出去还是挺拉风的,回头率高了有点不习惯。不过要说明的是由于前轮的直径只有100mm,所以如果路不是很平整的话最好不使用,一个是会颠簸的厉害,另外如果前轮被阻了因为重心比较高很容易摔跤的。玩过滑板的都知道,所以最好在柏油路或者在水泥路面上使用,另外要求路上车少人少最好。

元件清单

序号 物料名称 规格 数量
1 面板 21*85 1
2 后轮 138*24皮带轮 1
3 槽铝 40*80*4*80 1
4 铝板 100*40*4 2
5 轴承 8*100mm 1
6 后轮皮带调节器 通用 1
7 后轮槽铝螺丝 M6*8内六角 4
8 后轮架螺丝 M5*10内六角 8
9 后轮架铆合螺母 M5 8
10 前轮 4寸PU轮 1
11 前轮架 75*45,130mm 1
12 前轮螺丝 M6*30内六角 4
13 垫圈 M6 4
14 前轮减震弹簧 D20*20 4
15 皮带 15*420 1
16 电机 100W 24V 5A 1
17 电机齿轮 1
18 电机螺丝 M5 2
19 电机架锁紧螺丝 M6*8内六角 4
20 电机架(角铝) 50*50*3 1
21 铝壳 106*100*60 1
22 铝壳螺丝 自带 8
23 铝壳固定螺丝 M6*8内六角 4
24 控制器 100W 1
25 电池 钴酸锂18650 14
26 保护板 2并7串 1
27 热缩管 若干
28 插簧 6mm 2
29 接线端子1 VH3.96-3P 手把 1
30 接线端子2 VH3.96-2P 刹车 1
31 接线端子3 VH3.96-2P 开关 1
32 接线端子4 VH3.96-2P 充电口 1
33 电子线 若干
34 充电接口 DC-2.5-2.1 1
35 充电器 24V 1.8A 1
37 九芯航空插头 1
38 九芯航空线 1
39 遥控车手柄 1
41 电压显示 1
42 开关 1
43 触动开关(刹车) 1
44 胶水 若干

 

 

视频:

自制拉风电动滑板,回头率太高有点不习惯,首发于极客范 – GeekFan.net