• iOS


    公司最近搞得物联网项目,很注重安全,对于我这种架构师,当然考虑到APP使用上的安全。分享一篇逆向基础文章.


    1.ios逆向工程指的是在软件层面上进行逆向分析的一个过程
    。如果想要达到对ios软件较强的逆向分析能力,最好能非常熟悉ios设备的硬件构成、ios系统的运行原理,还要具备丰富的ios开发经验,比如:拿到一个App之后能清晰的推断出这个App使用的技术,包括引用了那些FrameWork,那些经典的第三方代码,以及整个App工程大致的文件个数等。

    2.逆向工程的主要两个作用:首先是攻破目标程序,拿到关键信息,可以归类于安全相关的逆向工程,其次是借鉴他人的程序功能来开发自己的软件,可以归类于开发相关的逆向工程

    3.与安全相关的ios逆向工程
    ios 逆向工程最突出的应用领域就是与安全相关的,比如:通过逆向一个金融App,来评定这个软件的安全等级,安全专家通过逆向ios病毒,来找到杀毒的方法,安全公司通过逆向ios系统电话、短信功能,来构建一个手机防火墙 

    a.评定安全等级
    ios中那些具有交易功能的App一般会先加密敏感数据,然后将加密过的数据存储在本地或通过互联网传输,而如果安全意识不够强,就完全有可能将重要信息直接用明文保存或传输,安全隐患极大。App虽然可以将低维的攻击防守得如铜墙铁壁一般,但是挡不住高维的逆向攻击,不过不可以据此得出App不安全的结论,因为ios逆向工程的使用均来自一个前提:ios越狱,在这种环境下,我们使用这些逆向工程技术来分析评估目标App中可被攻击点有多少,可攻击点越少的自然就越安全。

    b. 逆向恶意软件
    ios 是只能移动终端操作系统,它同计算机操作系统没有本质区别,恶意软件就是通过逆向工程定位系统和软件漏洞,利用漏洞渗透进目标主机,获取敏感数据

    4.与开发相关的ios逆向工程
    开发者可以逆向系统调用,在自己的程序里使用一些文档中没有提及的私有功能,还可以逆向一些经典的软件等


    a.逆向系统调用
    开发者编写的软件能够运行在操作系统中,提供各种各样的功能,是因为操作系统本身已经内嵌了这些功能,软件只是拿来重组使用。绝大多数的App的实现都源于公开的开发文档,而不能使用诸如锁屏,关机等文档中不涉及的功能,如果你的程序面向Cydia,那么不采用非公开功能将导致程序几乎没有竞争力,故可以通过逆向ios系统调用,还原系统实现相应功能的代码,并应用到自己的程序中。


    b.借鉴别的软件
    逆向工程最受欢迎的应用场合就是“借鉴”他人的软件功能。

    如何判断是否越狱成功?

      •      桌面是否有cydia

      •      工具判断(比如pp助手)

    如何使用cydia安装软件

    二、 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: 切记第一个终端不可以关闭,才可以保持端口映射状态

    三、 Cycript的使用

    Cycript 是Objective-C++ JavaScript Java等语法的混合物,可以用来探索,修改,调试正在运行的Macios 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#

    四、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

    五、 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#

    七、 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

    八、Hopper 安装

      •   百度下载安装

    九、安装theos

      • Theos是一个越狱开发工具包,Theos是越狱开发工具的首先,这个工具是为了后面对逆向的app进行代码编写使用。后面再讲tweak时会说到。

    一、 安装签名工具ldid

      •      先确保安装了brew, 点我

    $ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

      •      利用brew 安装ldid

    brew install ldid

    二、 修改环境变量

      • 编辑用户的配置文件

    vim ~/.bash_profile

      • 在.bash_profile 文件后面加入以下2行

    vim ~/.bash_profile

      • 让.bash_profile配置的环境变量立即生效

    vim ~/.bash_profile

    三、 下载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 到一个存放项目代码的文件夹。

    四、 新建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.

     

    五、编辑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

    六、编写代码
    下方就是在Tweak.xm中的所有代码。是Logos语法,使用起来是比较简单的。%hook与%end成对出现,%hook后方跟的是我们要修改的类名
    打开tweak.xm 文件

    %hook SBIconParallaxBadgeView

    - (id)init

    {

        return nil;

    }

    %end

    七、 编译-打包-安装
    * 编译

    make

      • 打包成deb

    make package

      • 安装(默认会自动重启Springboard)

    make install

    八、可能遇到的问题
    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

  • 相关阅读:
    LightOJ 1132 Summing up Powers(矩阵快速幂)
    hdu 3804 Query on a tree (树链剖分+线段树)
    LightOJ 1052 String Growth && uva 12045 Fun with Strings (矩阵快速幂)
    uva 12304 2D Geometry 110 in 1! (Geometry)
    LA 3263 That Nice Euler Circuit (2D Geometry)
    2013 SCAUCPC Summary
    poj 3321 Apple Tree (Binary Index Tree)
    uva 11796 Dog Distance (几何+模拟)
    uva 11178 Morley's Theorem (2D Geometry)
    动手动脑
  • 原文地址:https://www.cnblogs.com/baitongtong/p/9578916.html
Copyright © 2020-2023  润新知