公司最近搞得物联网项目,很注重安全,对于我这种架构师,固然考虑到APP使用上的安全。分享一篇逆向基础文章.html
1.ios逆向工程指的是在软件层面上进行逆向分析的一个过程。若是想要达到对ios软件较强的逆向分析能力,最好能很是熟悉ios设备的硬件构成、ios系统的运行原理,还要具有丰富的ios开发经验,好比:拿到一个App以后能清晰的推断出这个App使用的技术,包括引用了那些FrameWork,那些经典的第三方代码,以及整个App工程大体的文件个数等。python
2.逆向工程的主要两个做用:首先是攻破目标程序,拿到关键信息,能够归类于安全相关的逆向工程,其次是借鉴他人的程序功能来开发本身的软件,能够归类于开发相关的逆向工程ios
3.与安全相关的ios逆向工程
ios 逆向工程最突出的应用领域就是与安全相关的,好比:经过逆向一个金融App,来评定这个软件的安全等级,安全专家经过逆向ios病毒,来找到杀毒的方法,安全公司经过逆向ios系统电话、短信功能,来构建一个手机防火墙
git
a.评定安全等级
ios中那些具备交易功能的App通常会先加密敏感数据,而后将加密过的数据存储在本地或经过互联网传输,而若是安全意识不够强,就彻底有可能将重要信息直接用明文保存或传输,安全隐患极大。App虽然能够将低维的攻击防守得如铜墙铁壁通常,可是挡不住高维的逆向攻击,不过不能够据此得出App不安全的结论,由于ios逆向工程的使用均来自一个前提:ios越狱,在这种环境下,咱们使用这些逆向工程技术来分析评估目标App中可被攻击点有多少,可攻击点越少的天然就越安全。
github
b. 逆向恶意软件
ios 是只能移动终端操做系统,它同计算机操做系统没有本质区别,恶意软件就是经过逆向工程定位系统和软件漏洞,利用漏洞渗透进目标主机,获取敏感数据
正则表达式
4.与开发相关的ios逆向工程
开发者能够逆向系统调用,在本身的程序里使用一些文档中没有说起的私有功能,还能够逆向一些经典的软件等算法
a.逆向系统调用
开发者编写的软件可以运行在操做系统中,提供各类各样的功能,是由于操做系统自己已经内嵌了这些功能,软件只是拿来重组使用。绝大多数的App的实现都源于公开的开发文档,而不能使用诸如锁屏,关机等文档中不涉及的功能,若是你的程序面向Cydia,那么不采用非公开功能将致使程序几乎没有竞争力,故能够经过逆向ios系统调用,还原系统实现相应功能的代码,并应用到本身的程序中。spring
b.借鉴别的软件
逆向工程最受欢迎的应用场合就是“借鉴”他人的软件功能。sql
如何判断是否越狱成功?shell
• 桌面是否有cydia
• 工具判断(好比pp助手)
如何使用cydia安装软件
2、 Mac远程登陆到iphone
咱们常常在Mac的终端上,经过敲一下命令来完成一些操做,iOS 和Mac OSX 都是基于Drawin(苹果的一个基于Unix的开源系统内核),因此ios中一样支持终端的命令行操做,在逆向工程中,可使用命令行来操纵iphone。
Mac 和 iphone 创建链接以下图
为了创建链接须要用到 SSH 和OpenSSH
SSH: Secure Shell的缩写,表示“安全外壳协议”,是一种能够为远程登陆提供安全保障的协议,使用SSH,能够把全部传输的数据进行加密,"中间人"攻击方式就不可能实现,能防止DNS 欺骗和IP欺骗
OpenSSH: 是SSH协议的免费开源实现,能够经过OpenSSH的方式让Mac远程登陆到iphone,此时进行访问时,Mac 是客户端 iphone是服务器
使用OpenSSH远程登陆步骤以下
* 在iphone上安装cydia 安装OpenSSH工具(软件源http://apt.saurik.com)
登陆方式 经过USB进行SSH登陆
• 22端口
• 端口就是设备对外提供服务的窗口,每一个端口都有个端口号,范围是0--65535,共216个
• 有些端口是保留的,已经规定了用途,好比 21端口提供FTP服务,80端口是提供HTTP服务,22端口提供SSH服务,更多保留端口号课参考 连接
• iphone 默认是使用22端口进行SSH通讯,采用的是TCP协议
• 默认状况下,因为SSH走的是TCP协议,Mac是经过网络链接的方式SSH登陆到iphone,要求iPhone链接WIFI,为了加快传输速度,也能够经过USB链接的方式进行SSH登陆,Mac上有个服务程序usbmuxd(开机自动启动),能够将Mac的数据经过USB传输到iphone,路径是/System/Library/PrivateFrameworks/mobileDevice.framework/Resources/usbmuxd
• usbmuxd的使用
• 下载usbmuxd工具包,下载v1.0.8版本,主要用到里面的一个python脚本: tcprelay.py, 下载连接
• 将iphone的22端口(SSH端口)映射到Mac本地的10010端口
cd ~/Documents/usbmux-1.08/python-client
python tcprelay.py -t 22:10010
加上 -t 参数是为了可以同时支持多个SSH链接,端口映射完毕后,之后若是想跟iphone的22端口通讯,直接跟Mac本地的10010端口通讯就能够了,新开一个终端界面,SSH登陆到Mac本地的10010端口,usbmuxd会将Mac本地10010端口的TCP协议数据,经过USB链接转发到iphone的22 端口,远程拷贝文件也能够直接跟Mac本地的10010端口通讯,如:scp -p 10010 ~/Desktop/1.txt root@localhost:~/test 将Mac上的~/Desktop/1.txt文件,拷贝到iphone上的~/test路径。
• 先开一个终端,先完成端口映射
*cd 到usbmuxd文件夹路径
•python tcprelay.py -t 22:10010
• 再开一个端口 注入手机
• ssh root@localhost -p 10010
• Zhanghua123:~ root# cycript -p SpringBoard
ps: 切记第一个终端不能够关闭,才能够保持端口映射状态
3、 Cycript的使用
Cycript 是Objective-C++ JavaScript Java等语法的混合物,能够用来探索,修改,调试正在运行的Mac\ios App
官网:http://www.cycript.org/
文档: http://www.cycript.org/manual
经过Cycdia 安装Cycript,就能够在iphone上调试运行中的APP
使用上面usb连接的方式进入iphone
Zhanghua123:~ root# ps -e,会出现不少进程,看var开头的,能够看到开的进程,退出cy# 可使用快捷键 control + D
• cycript 基本语法
• https://segmentfault.com/a/1190000011720125
• 定义变量
• var 变量名 = 变量值
• 用内存地址获取对象
• #内存地址
• 查看已经加载的全部OC类
• ObjectiveC.classes
• 查看对象的全部成员变量
• 对象
• 递归打印view的全部子控件
• view.recursiveDescription().toString()
• 筛选出某种类型的对象
• choose(UIViewController)
• choose(UITableViewCell)
注入手机
cycript Zhanghua123:~ root# cycript -p SpringBoard
添加一个view
cy# v2 = [[UIView alloc]init]
#"<UIView: 0x111b90ab0; frame = (0 0; 0 0); layer = <CALayer: 0x11002fe40>>"
cy# v2.frame
(extern "C" struct CGRect ":frame"(id, SEL))
cy# [v2 frame]
{0:{0:0,1:0},1:{0:0,1:0}}
cy# v2.frame = {0:{0:0,1:0},1:{0:320,1:200}}
{0:{0:0,1:0},1:{0:320,1:200}}
cy# [view addSubview: v2]
cy# v2
#"<UIView: 0x111b90ab0; frame = (0 0; 320 200); layer = <CALayer: 0x11002fe40>>"
cy# v2.backgroundColor = [UIColor redColor]
#"UIExtendedSRGBColorSpace 1 0 0 1"
cy#
Cycript 封装的一些库
从下面地址下载资源
https://github.com/CoderMJLee/mjcript
而后安装在手机的 Device/usr/lib路径下
具体使用以下:
Zhanghua123:~ root# cycript -p SpringBoard
cy# @import mjcript
{}
cy# MJAppId
@"com.apple.springboard"
cy# MJAppPath
@"/System/Library/CoreServices/SpringBoard.app"
cy# MJDocPath
@"/var/mobile/Documents"
cy# MJCachesPath
@"/var/mobile/Library/Caches"
cy#
4、sh脚本文件
• 将常常执行的一系列终端命令行放到sh脚本文件中(shell),而后执行脚本文件,能够经过sh、bash、source命令来执行sh脚本文件
• sh bash
• 当前shell环境会启动一个子进程来执行脚本文件,执行后返回到父进程的shell环境,执行cd时,在子进程中会进入到cd目录,可是在父进程中环境并无改变,也就是说目录没有改变
• source
• 在当前的shell环境下执行脚本文件,执行cd后会跳转到cd的目录,source能够用一个点.来代替,好比“.test.sh”
cuilinhaodeMacBook-Pro:~ cuilinhao$ vim usb.sh
cd /Users/cuilinhao/Desktop/usbmuxd-1.0.8
python tcprelay.py -t 22:10010
• 使用: 命令行直接执行 sh usb.sh
5、 ios 脱壳
• 脱壳就是摘掉壳程序,加未加密的可执行文件还原出来,脱壳主要有2种方法:硬脱壳,动态脱壳
硬脱壳就是直接执行解密算法,动态脱壳,执行壳程序,将真实的内容解密出来,即热内存中的可执行文件是已经解密过的,则咱们能够直接导出,因为手机程序比较复杂,ios 中经常使用的是硬脱壳。
• ios 中有不少好用的脱壳工具
• Clutch:
https://github.com/KJCracks/Clutch
• dumpdecrypted:
https://github.com/stefanesser/dumpdecrypted/
• class-dump
class-dump的做用就是把Mach-O文件的class信息给dump出来(把类信息给导出来),生成对应的.h头文件
官方网址:
http://stevenygard.com/projects/class-dump/
下载完工具包之后将class-dump文件复制到Mac的/usr/local/bin目录,这样在终端就能识别class-dump命令了
经常使用的格式:class-dump -H Mach-O文件路径 -o 头文件存放目录
ps: -H表示要生成头文件 -O用于制定头文件的存放目录
权限问题:
cuilinhaodeMacBook-Pro:脱壳 cuilinhao$ class-dump -H To-Do -o Headers
-bash: /usr/local/bin/class-dump: Permission denied
解决方法:在终端输入以下命令
cuilinhaodeMacBook-Pro:脱壳 cuilinhao$ chmod +x /usr/local/bin/class-dump
1)下载源代码,而后在源代码目录执行make指令进行编译,得到dylib动态库文件
2) 将dylib文件拷贝到iphone上,放到/var/root目录
3) 终端进入dylib所在的目录
4) 使用环境变量DYLD_INSERT_LIBARIES将dylib注入到须要脱壳的可执行文件(可执行文件路径能够经过ps -A查看获取)
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib + 可执行文件路径
5) 后缀.decrpted文件就是脱壳后的可执行文件,该文件在var/root路径下
6)检验一下是否脱壳成功
otool -l To-Do | grep crypt
cryptoff 16384
cycptsize 2490368
cryptid 0
经过查看cryptid字段为0,故脱壳成功。
7)导出头文件
class-dump -H To-Do -o Headers
MJAppTools 使用
1.下载
https://github.com/CoderMJLee/MJAppTools.git
2.放到Device/usr/bin目录下
3.若是权限不够则执行 chmod +x /usr/bin/MJAppTools
Zhanghua123:~ root# MJAppTools
-sh: /usr/bin/MJAppTools: Permission denied
Zhanghua123:~ root# chomd +x /usr/bin/MJAppTools
-sh: chomd: command not found
Zhanghua123:~ root# chmod +x /usr/bin/MJAppTools
Zhanghua123:~ root# MJAppTools
-l <regex> 列出用户安装的应用
-le <regex> 列出用户安装的加壳应用
-ld <regex> 列出用户安装的未加壳应用
-ls <regex> 列出系统的应用
1.由于该工具含有正则表达式,还能够指定查找
Zhanghua123:~ root# MJAppTools -l WeChat
# 一共1个应用
-----
# 01 【微信】 <com.tencent.xin>
/private/var/containers/Bundle/Application/D1F83FA2-BC91-4584-B459-4E1F926003BF/WeChat.app
/private/var/mobile/Containers/Data/Application/A8964D5A-0046-4C27-AFA1-37882F27F17F
Universal binary
arm_v7
arm_64
Zhanghua123:~ root#
7、 Reveal 安装
• Reveal 是一款调试ios程序UI界面的神器
• 官网: https://revealapp.com
• 下载: https://revealapp.com/download
• 破解版 https://pan.baidu.com/s/1lz9lwTKXD9bS8DnvT9gkBQ
提取密码:b31u
• 建议下载至少Reveal4版本,支持USB链接调试
• 调试环境配置
• iphone上安装Reveal Loader
• 软件源: http://apt.so/codermjlee,不要安装其余源的版本,有可能不支持新版Reveal
• 安装完Reveal Loader后,打开[设置], 选择须要调试的APP
• 找到Mac的Reveal中RevealServer文件,覆盖iphone的/Library/RHRevealLoader/RevealServer文件
• ps: 在iPhone上没有RHRevealLoader文件夹,能够本身建立
• 重启SpringBoard
Zhanghua123:~ root# killall SpringBoard
8、Hopper 安装
• 百度下载安装
9、安装theos
• Theos是一个越狱开发工具包,Theos是越狱开发工具的首先,这个工具是为了后面对逆向的app进行代码编写使用。后面再讲tweak时会说到。
1、 安装签名工具ldid
• 先确保安装了brew, 点我
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
• 利用brew 安装ldid
brew install ldid
2、 修改环境变量
• 编辑用户的配置文件
vim ~/.bash_profile
• 在.bash_profile 文件后面加入如下2行
vim ~/.bash_profile
• 让.bash_profile配置的环境变量当即生效
vim ~/.bash_profile
3、 下载theos
• 建议在$THEOS目录下载代码(就是上面配置的~/theos目录)
git clone --recursive https://github.com/theos/theos.git $THEOS
使用Theos来建立一个使用工具,并进行编译,编译后安装到咱们的越狱手机上,使用theos目录中bin下的nic.pl命令,在执行nic.pl命令后,会让你选择新建工程的模板。目前theos中内置的是12套模板,建立tweak,那么就选11便可,编译完成后,咱们要将项目进行打包,这样咱们的越狱设备才能进行安装。
cd 到一个存放项目代码的文件夹。
4、 新建tweak项目
• iOS越狱开发中,各类破解补丁的统称为Tweak,一般意义上咱们说的越狱开发,都是指开发一个Tweak.
基本上,tweak都依赖于一个名叫cydia Substrate (之前名字也叫mobile Substrate)的动态库,Mobile Substrate是Cydia的做者Jay Freeman (@saurik)的做品,也叫Cydia Substrate,它的主要功能是hook某个App,修改代码好比替换其中方法的实现,Cydia上的tweak都是基于Mobile Substrate实现的.
iOS的tweak开发能够有两种发布方式。一种是只能在越狱设备上安装的打包成deb格式的安装包,另外一种是直接使用开发者本身的证书/企业证书直接将补丁打包成ipa,这样不须要越狱也是能够安装的,只是这种非越狱的限制比较大,一般只是用来给某个app打个补丁或者相似的功能啥的。
• tweak的实质就是ios平台的动态库。IOS平台上有两种形势的动态库,dylib与framework。Framework这种开发者用的比较多,而dylib这种就相对比较少一点,好比libsqlite.dylib,libz.dylib等。而tweak用的正是dylib这种形势的动态库。咱们能够在设备的/Library/MobileSubstrate/DynamicLibraries
目录下查看手机上存在着的全部tweak。这个目录下除dylib外还存在着plist与bundle两种格式的文件,plist文件是用来标识该tweak的做用范围,而bundle是tweak所用到的资源文件
cd ~/Desktop
nic.pl
选择 iphone/tweak
填写项目信息
Project Name
项目名称
Package Name
项目ID (随便写)
Author/Maintainer Name
做者, 直接敲回车按照默认
[iphone/tweak] MobileSubstrate Bundle filter
须要修改APP的Bundle Identifier (喜马拉雅的是com.gemd.iting )
能够经过Cycript 查看APP 的Bundle Identifier
[iphone/tweak] List of applications to terminate upon installation
直接敲回车就能够
Project Name (required): ting_tweak
Package Name [com.yourcompany.ting_tweak]: com.mj.ting
Author/Maintainer Name [MJ Lee]:
[iphone/tweak] MobileSubstrate Bundle filter [com.apple.springboard]:
com.gemd.iting
[iphone/tweak] List of applications to terminate upon installation (space-
separated, '-' for none) [SpringBoard]:
Instantiating iphone/tweak in ting_tweak/...
Done.
5、编辑Makefile
* 该文件相似于配置文件,用来指定工程用到的文件、框架、库、使用的SDK等等,将整个编译、打包、安装的过程进行自动化,在前面加入环境变量, 写清楚经过那个ip和端口访问手机
THEOS_DEVICE_IP THEOS_DEVICE_PORT
export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=10010
include $(THEOS)/makefiles/common.mk
TWEAK_NAME = ting_tweak
ting_tweak_FILES = Tweak.xm
include $(THEOS_MAKE_PATH)/tweak.mk
after-install::
install.exec "killall -9 SpringBoard"
若是不但愿每一个项目的Makefile都编写环境变量,也能够添加到用户配置文件中,编辑完毕以后 source ~/.bash_profile 让配置生效
$ vim ~/.bash_profile
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
export THEOS_DEVICE_IP=127.0.0.1
export THEOS_DEVICE_PORT=10010
$ source ~/.bash_profile
安装完成以后
cuilinhaodeMacBook-Pro:~ cuilinhao$ cd theos/
cuilinhaodeMacBook-Pro:theos cuilinhao$ ls
LICENSE.md bin lib package.json toolchain
Prefix.pch extras makefiles sdks vendor
README.md include mod templates
cuilinhaodeMacBook-Pro:theos cuilinhao$ ls -l
total 96
-rw-r--r-- 1 cuilinhao staff 35367 4 26 10:04 LICENSE.md
-rw-r--r-- 1 cuilinhao staff 754 4 26 10:04 Prefix.pch
-rw-r--r-- 1 cuilinhao staff 829 4 26 10:04 README.md
drwxr-xr-x 19 cuilinhao staff 608 4 26 10:04 bin
drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 extras
drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 include
drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 lib
drwxr-xr-x 25 cuilinhao staff 800 4 26 10:04 makefiles
drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 mod
-rw-r--r-- 1 cuilinhao staff 655 4 26 10:04 package.json
drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 sdks
drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 templates
drwxr-xr-x 3 cuilinhao staff 96 4 26 10:04 toolchain
drwxr-xr-x 7 cuilinhao staff 224 4 26 10:04 vendor
进入bin 进行查看
cuilinhaodeMacBook-Pro:theos cuilinhao$ cd bin
cuilinhaodeMacBook-Pro:bin cuilinhao$ ls -l
total 80
-rwxr-xr-x 1 cuilinhao staff 491 4 26 10:04 deb_build_num.sh
lrwxr-xr-x 1 cuilinhao staff 29 4 26 10:04 denicify.pl -> ../vendor/nic/bin/denicify.pl
lrwxr-xr-x 1 cuilinhao staff 21 4 26 10:04 dm.pl -> ../vendor/dm.pl/dm.pl
-rwxr-xr-x 1 cuilinhao staff 892 4 26 10:04 fakeroot.sh
-rwxr-xr-x 1 cuilinhao staff 148 4 26 10:04 install.copyFile
-rwxr-xr-x 1 cuilinhao staff 313 4 26 10:04 install.exec
-rwxr-xr-x 1 cuilinhao staff 213 4 26 10:04 install.mergeDir
lrwxr-xr-x 1 cuilinhao staff 29 4 26 10:04 logify.pl -> ../vendor/logos/bin/logify.pl
lrwxr-xr-x 1 cuilinhao staff 28 4 26 10:04 logos.pl -> ../vendor/logos/bin/logos.pl
lrwxr-xr-x 1 cuilinhao staff 24 4 26 10:04 nic.pl -> ../vendor/nic/bin/nic.pl
lrwxr-xr-x 1 cuilinhao staff 27 4 26 10:04 nicify.pl -> ../vendor/nic/bin/nicify.pl
-rwxr-xr-x 1 cuilinhao staff 980 4 26 10:04 package_version.sh
-rwxr-xr-x 1 cuilinhao staff 801 4 26 10:04 post-update
-rwxr-xr-x 1 cuilinhao staff 437 4 26 10:04 target.pl
lrwxr-xr-x 1 cuilinhao staff 12 4 26 10:04 update-git-repo -> update-theos
-rwxr-xr-x 1 cuilinhao staff 1030 4 26 10:04 update-theos
-rwxr-xr-x 1 cuilinhao staff 552 4 26 10:04 vercmp.pl
cuilinhaodeMacBook-Pro:bin cuilinhao$
配置路径,使nic.pl 让在任何地方访问到
在cuilinhaodeMacBook-Pro:~ cuilinhao\(下
ls -alvim .bash_profile
: 表示路径是并行的。
\)PATH 是引用环境变量的值
PATH = ~/theos/bin:$PATH
export THEOS=~/theos
export PATH=$THEOS/bin:$PATH
配置完以后查看
cuilinhaodeMacBook-Pro:~ cuilinhao$ echo $PATH
/Users/cuilinhao/.rvm/gems/ruby-2.2.2/bin:/Users/cuilinhao/.rvm/gems/ruby-2.2.2@global/bin:/Users/cuilinhao/.rvm/rubies/ruby-2.2.2/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/cuilinhao/.rvm/bin
cuilinhaodeMacBook-Pro:~ cuilinhao$
ps: 若是配置完以后,尚未出现路径,执行命令 source .bash_profile 使路径生效
* 参考:http://3code.info/blog/2016/11/2_Theos_-install&run.html
6、编写代码
下方就是在Tweak.xm中的全部代码。是Logos语法,使用起来是比较简单的。%hook与%end成对出现,%hook后方跟的是咱们要修改的类名
打开tweak.xm 文件
%hook SBIconParallaxBadgeView
- (id)init
{
return nil;
}
%end
7、 编译-打包-安装
* 编译
make
• 打包成deb
make package
• 安装(默认会自动重启Springboard)
make install
8、可能遇到的问题
1. -make package的错误
Can't locate IO/Compress/Lzma.pm in @INC (you may need to install the
IO::Compress::Lzma module) (@INC contains: /Library/Perl/5.18/darwin-
thread-multi-2level /Library/Perl/5.18 /Network/Library/Perl/5.18/darwin-
thread-multi-2level /Network/Library/Perl/5.18 /Library/Perl/Updates/5.18.2
/System/Library/Perl/5.18/darwin-thread-multi-2level
/System/Library/Perl/5.18 /System/Library/Perl/Extras/5.18/darwin-thread-
multi-2level /System/Library/Perl/Extras/5.18 .) at
/Users/mj/theos/bin/dm.pl line 12.
BEGIN failed--compilation aborted at /Users/mj/theos/bin/dm.pl line 12.
make: *** [internal-package] Error 2
• 错误是由于打包压缩方式有问题,改为gzip压缩就能够了
• 修改dm.pl 文件,用#号注释掉下面两句
vim $THEOS/vendor/dm.pl/dm.pl
#use IO::Compress::Lzma;
#use IO::Compress::Xz;
• 修改deb.mk 文件第6行的压缩方式为gzp
vim $THEOS/makefiles/package/deb.mk
_THEOS_PLATFORM_DPKG_DEB_COMPRESSION ?= gzip
2 -make 错误
Error: You do not have an SDK in
/Library/Developer/CommandLineTools/Platforms/iPhoneOS.platform/Developer/SDKs
• 是由于xcode 致使路径(有可能安装了好几个xcode),须要指定一下xcode
sudo xcode-select --switch
/Applications/Xcode.app/Contents/Developer/
1. 在make是出现Nothing
> Making all for tweak xxx...
make[2]: Nothing to be done for `internal-library-compile'.
• 是由于以前已经编译过,有缓存致使的,clean一下便可
make clean
make