aso

前言

正文

clear

  • ls -lrt /var/mobile/Library/com.apple.itunesstored
     kvs.sqlitedb
     itunesstored2.sqlitedb
    

xcodebuild

protocol-analysis-some-app

  • intext:[协议分析]某app
  KeyRaider 
  p*-buy.itunes.apple.com/WebObjects/MZFinance.woa/wa/authenticate  
  intext:KeyRaiderSamples 
  weiphone的Cydia 源
1、针对http和https可以使用Charles设置代理来做,对于更广泛的协议可以使用tcpdump或者wireshark。wireshark提供GUI,方便做深入全面的数据分析。tcpdump则输出原始的包内容,好处是快速高效

2、apple在mac上有个叫rvictl的程序,可以通过iOS设备的udid创建一个虚拟网卡,然后通过这个虚拟网卡监听设备上所有的网络流量
使用mac系统自带tcpdump
第一步:获取iphone设备的udid
第二步:开启终端(terminal)并输入rvictl -s udid
第三步:输入命令启动tcpdump抓包:sudo tcpdump -i rvi0 -AAl | grep 'GET /mmsns/'
第四步:获取抓包内容里面的图片地址

appstore

apsd进程

  • 一种IOS用于推送消息的守护进程
  • [偷取用户证书和私钥]((http://www.freebuf.com/vuls/76763.html)
<!-- intext:iappstore.dylib iappinbuy.dylib -->
<!-- https://github.com/q1f3/WooYun-1/blob/master/KeyRaider:迄今最大规模的苹果账号泄露事件.html -->
<!-- https://researchcenter.paloaltonetworks.com/2015/08/keyraider-ios-malware-steals-over-225000-apple-accounts-to-create-free-app-utopia/ -->
安装钩取之后,当查询词条为“APSClientIdentity”时,KeyRaider执行原始安全项目复制匹配,用 SecIdentityCopyCertificate和SecIdentityCopyPrivateKey 从原始函数返回结果复制证书和私钥,这些证书和GUID一起发送到C2服务器。IOS钥匙链中以APSClientIdentity标记的是IOS中用来推送消息的密钥。攻击者可以利用这些证书创建一个假的系统推送:

<!-- 查看目录下所有文件内容中是否包含某个字符串 -->
Wl42:/Library/MobileSubstrate/DynamicLibraries root# find .|xargs grep -ri "/var/mobile/Library/Caches/com.apple."

itunesstored

  • /var/mobile/Documents/iappstore_aid.log
    此文件包含苹果用户账户信息,设备GUID,iTurnes 会话 token,cookie,电话号码,操作系统信息和iTunes CDN 服务器编号。函数分析数据并创建账户对象。
    
  • 判定当前会话是否在用iTunes协议购买APP
判定当前http请求是否和 “POST /WebObjects/MZBuy.woa/wa/buyProduct”一致
itunesstored是系统的守护进程,用iTurnes协议与App Store通信。
SSL钩取函数利用MGCopyAnswer(“UniqueDeviceID”)读取设备GUID。
<key>Executables</key>
    <array>
      <!-- <string>appstored</string> -->
      <string>itunesstored</string>
      <!-- <string>akd</string> -->
    </array>

pppd

  • /private/var/log/ppp.log
    lrwxrwxrwx 1 root wheel 12 Jan 23 19:56 /var -> private/var/
    Whether you choose L2TP over IPSec or PPTP for your settings, the log file is located at: /var/log/ppp.log
    echo "" > /private/var/log/ppp.log
    

SBUserNotificationAlert

可以通过使用 CFUserNotificationCreat 截取Header 部分的信息、Message的内容 进行一些任务处理。– 我们通常都是在创建它的方法就进行hook处理。

  • SBUserNotificationAlert– 登录 iTunes Store
Activation - Presenting <SBUserNotificationAlert: 0x1016b3fa0; title: 登录 iTunes Store; source: itunesstored; pid: 4156> with presenter: <SBUserAlertNotificationSource: 0x1c0208f80>
 <!-- itunesstored进程是负责AppleID登陆的进程 -->
 :~ root# ps -e |grep 4156
 4156 ??         0:01.55 /System/Library/PrivateFrameworks/iTunesStore.framework/Support/itunesstored
<!-- 因此可以看出,登录 iTunes Store 这个输入框的弹出流程:是由itunesstored 控制,process:SpringBoard 进行处理,使用SBUserNotificationAlert的方式进行进程间的消息传递-->
  • CFUserNotificationCreat:Creates a CFUserNotification object and displays its notification dialog on screen.
    CFUserNotificationRef CFUserNotificationCreate(CFAllocatorRef allocator, CFTimeInterval timeout, CFOptionFlags flags, SInt32 *error, CFDictionaryRef dictionary);
    通常hook 这个方法,就是可以对dictionary 中的信息,主要是AlertHeader、AlertMessage 进行处理。 ---通常以block的形式进行消息传递
    <!-- 如果处理完了之后,可以返回其他值,让其他进程(sb)无法处理,或者返回原来的CFUserNotificationCreate -->
    
  • title: 您必须同时输入 Apple ID 和密码。;
    Received request to activate alertItem: <SBUserNotificationAlert: 0x114ae42f0; title: 您必须同时输入 Apple ID 和密码。; source: itunesstored; pid: 4156>
    Activation - Presenting <SBUserNotificationAlert: 0x114ae42f0; title: 您必须同时输入 Apple ID 和密码。; source: itunesstored; pid: 4156> with presenter: <SBUnlockedAlertItemPresenter: 0x1c420ab60>
    http://developer.limneos.net/?ios=10.2&framework=SpringBoard&header=SBUnlockedAlertItemPresenter.h
    Deactivated alertItem: <SBUserNotificationAlert: 0x114ae42f0; title: 您必须同时输入 Apple ID 和密码。; source: itunesstored; pid: 4156>
    

cydia- com.saurik.Cydia

AGPLV3 Licensed LLVM Obfuscator

  • LLVM混淆器Hikari
    -enable-bcfobf 启用伪控制流  
    -enable-cffobf 启用控制流平坦化
    -enable-splitobf 启用基本块分割  
    -enable-subobf 启用指令替换  
    -enable-adb 启用反调试(需要单独配置)
    -enable-acdobf 启用反class-dump
    -antihook 启用反Hook
    -enable-indibran 启用基于寄存器的相对跳转,配合其他加固可以彻底破坏IDA/Hopper的伪代码(俗称F5)
    -enable-strcry 启用字符串加密
    -enable-funcwra 启用函数封装
    
  • Mirai
    Hikari是一个基于OLLVM高度优化并包含大量自制混淆功能的二进制加固工具
    
  • /naville.gitbooks.io/hikaricn/content/
  • 检查混淆效果- 可以使用hopper 查看效果(如果没有对方法进行混淆,目前的方法名称、方法的引用关系、字符串都还在)
    <!-- 如果只是简单看字符串是否混淆,可以使用strings: -->
    devzkndeMacBook-Pro:ninePoethird.app devzkn$  strings /Users/devzkn/Downloads/ninePoethird/Payload/ninePoethird.app/ninePoethird  >  /Users/devzkn/ninePoethird.text
    
  • kntree
    devzkndeMacBook-Pro:bin devzkn$ cat kntree
    #!/bin/sh
    #strings AppStore > strings_AppStore.txt
    # kntree strings.text
    # python ~/bin/list_dir_tree.py  /Users/devzkn/strings.text >  /Users/devzkn/tree.text
    python ~/bin/list_dir_tree.py $1 > /Users/devzkn/decrypted/tree/new.text
    open /Users/devzkn/decrypted/tree
    

fakeroot

  • fakeroot
例如Debian生成package这样,在必须使用root的时候,可以使用fakeroot模拟root权限。fakeroot使用libfakeroot-sysv.so库文件中的函数与faked通讯管理文件权限信息。
  • $(FAKEROOT)
  • sudo chown -R
    # 先修改回来
    sudo   chown -R  devzkn:staff ~/Package
    # 在dpkg-deb -Zgzip -b之前修改成root:wheel
    sudo   chown -R  root:wheel ~/work
    

*fakeroot.sh

devzkndeMacBook-Pro:bin devzkn$ ls -l /opt/theos/bin/fakeroot.sh
-rwxr-xr-x  1 root  wheel  892 Aug 10 15:18 /opt/theos/bin/fakeroot.sh
 if [[ "$USER" == "root" ]]; then
  	fakeroot=""
 +elif type fauxsu &> /dev/null; then
 +	fakeroot="fauxsu -p $persistence -- "
  elif type fakeroot-ng &> /dev/null; then
  	fakeroot="fakeroot-ng -p $persistence -- "
  elif type fakeroot &> /dev/null; then

MGCopyAnswer

static CFPropertyListRef (*orig_MGCopyAnswer_internal)(CFStringRef prop, uint32_t* outTypeCode);
CFPropertyListRef new_MGCopyAnswer_internal(CFStringRef prop, uint32_t* outTypeCode) {
    return orig_MGCopyAnswer_internal(prop, outTypeCode);
}
 
extern "C" MGCopyAnswer(CFStringRef prop);
 
static CFPropertyListRef (*orig_MGCopyAnswer)(CFStringRef prop);
CFPropertyListRef new_MGCopyAnswer(CFStringRef prop) {
    return orig_MGCopyAnswer(prop);
}
 
%ctor {
    uint8_t MGCopyAnswer_arm64_impl[8] = {0x01, 0x00, 0x80, 0xd2, 0x01, 0x00, 0x00, 0x14};
    const uint8_t* MGCopyAnswer_ptr = (const uint8_t*) MGCopyAnswer;
    if (memcmp(MGCopyAnswer_ptr, MGCopyAnswer_arm64_impl, 8) == 0) {
        MSHookFunction(MGCopyAnswer_ptr + 8, (void*)new_MGCopyAnswer_internal, (void**)&orig_MGCopyAnswer_internal);
    } else {
        MSHookFunction(MGCopyAnswer_ptr, (void*)new_MGCopyAnswer, (void**)&orig_MGCopyAnswer);
    }
}

Q&A

  • TIC TCP Conn Cancel [4:0x1703960a0]
    //通常是由于VPN 、或者其他程序修改代理信息之后,超时的这个请求并没有同步的更新信息,代理信息还是旧的,或者不一致导致这个问题
    1、目前可以采取关闭和打开Wi-Fi的形式来重新同步代理信息(--适合通过设置配置VPN信息连接)
    2、或者重启发起请求的进程,使其重新获取“源地址”信息
    3、通知发起请求的进程,去主动获取新的“源地址”信息
    

Too many open files

  • failed to open /System/Library/Preferences/Logging/Subsystems/com.apple.Accessibility.plist: Too many open files
adv-cmds :cydia 进行下载
iPhone:~ root# ulimit -a
# 修改
iPhone:~ root# ulimit -n 2048

#import <sys/types.h>  
#import <fcntl.h>
#import <errno.h>
#import <sys/param.h>

+(void) lsof
{
    int flags;
    int fd;
    char buf[MAXPATHLEN+1] ;
    int n = 1 ;

    for (fd = 0; fd < (int) FD_SETSIZE; fd++) {
        errno = 0;
        flags = fcntl(fd, F_GETFD, 0);
        if (flags == -1 && errno) {
            if (errno != EBADF) {
                return ;
            }
            else
                continue;
        }
        fcntl(fd , F_GETPATH, buf ) ; 
        NSLog( @"File Descriptor %d number %d in use for: %s",fd,n , buf ) ;
        ++n ; 
    }
}
###Cydia Apps
1、APT 0.6 Transitional: apt-get包管理工具
apt-cache search <pkg-name> 查找软件包
apt-cache show <pkg-name> 显示软件包信息
apt-get update 从APT源更新软件包列表
apt-get upgrade 更新软件包
apt-get remove <pkg-name> 删除已安装的软件包
apt-get purge <pkg-name> 删除已安装的软件包及配置文件
apt-get autoremove 删除不需要的软件包(通常是由于依赖关系而安装)
apt-get autoclean 删除已卸载的软件包的.deb档
2、dpkg --get-selections | grep <pkg-name> 搜索已安装的软件包
dpkg -s/-L <pkg-name> 查看已安装的包信息/路径
3、Gawk: 支持awk编程,awk是一种强大的文本处理及模式匹配语言
4、MobileTerminal: 设备上的命令行终端
5、Vim: 文本编辑
6、Sqlite3: db相关操作
将DB转储到ASCII文本文件:echo .dump | sqlite file.db > file.dump
重新构建数据库:cat file.dump | sqlite3 file_new.db
进入sqlite3后,使查询语句结果打印更直观:.headers on 及 .mode column
7、adv-cmds: ps, finger, last, lsvfs
8、lsof:
备注,Cydia版本若遇到“Cannot allocate memory”,去下载lsof-arm7-iOS4.2替换:https://github.com/zhangkn/iOS-reverse-engineering-tools-backup/blob/master/lsof-arm7-iOS4.2
devzkndeMBP:.git devzkn$ scp /Users/devzkn/Downloads/lsof-arm7-iOS4.2 usb2222://usr/bin/lsof

列出指定文件/设备/目录下被打开的文件:lsof /var/mobile/
指定PID,查看该进程打开的文件:lsof -p 1234
查看指定端口有哪些进程在使用:lsof -i:22
列出所有的TCP/UDP连接:lsof -i tcp/udp
查看指定用户打开的文件:lsof -u mobile
shell-cmds: killall, time, which
重启Springboard(如ipa安装不彻底时。备注:sbreload也可以做到):killall -HUP SpringBoard
Core Utilities (/bin): 提供了dirname, kill, mktemp, su
dirname工具在脚本使用场景较多
top: 动态查看系统状态,如CPU负载
inetutils: ping, ftp客户端/服务端
network-cmds: 网络管理工具,ifconfig, netstat, arp, route, traceroute
readline: 方便命令行移动
ctrl+r 搜索
ctrl+a/e 移动到行首/尾
ctrl+u/k 删除到行首/尾
ctrl+l 清屏
open: 通过命令行打开应用
ipainstaller 通过命令行安装ipa应用
plutil (Erica Utilities):
支持设备上对plist文件进行操作,plutil -show file.plist
strings (Binutils):
打印某个文件的可打印字符串,便于了解一些非文本文件的内容。比如可以用来查找浏览器Cookies内容
cycript: TBD

lockdownd

  • lockdownd这个service是用于和iTunes交互来进行安装、升级、删除应用的,所以这个服务为了能与installd服务通讯,进行删除app操作,就需要拥有”com.apple.private.mobileinstall.allowedSPI” 这个entitlement
          <key>com.apple.private.mobileinstall.allowedSPI</key>
          <array>
              <string>InstallForLaunchServices</string>
              <string>UninstallForLaunchServices</string>
              <string>CheckCapabilitiesMatch</string>
              <string>Install</string>
              <string>Lookup</string>
              <string>UpdateiTunesMetadataForLaunchServices</string>
              <string>UpdateSinfForLaunchServices</string>
          </array>
    

see also

代码签名(CodeSign)、沙盒机制(SandBox) 和利用缓解(Exploit Mitigation),

0x02 沙盒机制(SandBox):UID/GID permission、iOS Mandatory Access Control、. Entitlement

<!-- (3). Entitlement: 想要访问提供了能删除app的接口的”com.apple.mobile.installd”服务就必须拥有对应的”com.apple.private.mobileinstall.allowedSPI” entitlement才行-->

假设有这样的场景:

进程 A 是 service 、进程 B 是 client,两者通过IPC通讯。

进程A提供的服务接口分别有:a1 , a2 ,其中只希望接口a1能被B访问。

0x03利用缓解(Exploit Mitigation): (1).栈金丝雀保护 (Stack Canaries)、(2).地址随机化 (ASLR/KASLR)、

invoke 'dpkg-deb --build' using 'fakeroot' on the 'debian' directory
fakeroot的实现:
1、fakeroot仅仅是简单的shell script。简单来说fakeroot做下面的事情。
 * 启动faked,获取FAKEROOTKEY * 设置环境变量FAKEROOTKEY,LD_LIBRARY_PATH,LD_PRELOAD。执行命令(默认是shell)
2、faked是管理虚拟的文件所有者,文件权限信息的守护进程。 在fakeroot中执行的命令会加载由LD_LIBRARY_PATH,LD_PRELOAD环境变量指定的一个动态链接库(/usr/lib/libfakeroot/libfakeroot-sysv.so)
3、LD_LIBRARY_PATH=/usr/lib/libfakeroot LD_PRELOAD=libfakeroot-sysv.so
4、libfakeroot-sysv.so导出了chown()等函数,这些函数会使用FAKEROOTKEY与faked通讯,返回虚拟的所有者与权限信息。
  • fakeroot dpkg-deb –build debian
    devzkndeMacBook-Pro:.git devzkn$ id
    uid=501(devzkn) gid=20(staff) groups=20(staff),701(com.apple.sharepoint.group.1),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),502(access_bpf),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh-disabled)
    
  • 使用fakeroot模拟root权限执行程序
    1、fakeroot是什么?
    例如Debian在生成package的时候,编译完之后,不能立刻在当前环境执行make install,需要执行make install DESTDIR=$(pwd)/debian/tmp把生成的文件安装到build目录的里面$(pwd)/debian/tmp。然后使用那个目录里面的全部内容生成Debian包(实际上包里面还会包含control和maintainer script等)。 这个包里面的文件所有者必须是root
    2、解决方案
    在制作Debian包的时候,需要使用root权限来执行某些命令。本来是应该使用sudo来运行这些命令的,但是通常情况下是使用fakeroot模拟root运行
    
  • A free runtime modification library.
  • 独奏’s Wiki
  • CFRunLoopRun源码标注
  • undefinedblog
  • Proxy and DNS Server on iOS
  • Cydia源搭建、维护、更新-deb文件编辑方
http://www.youtube.com/watch?v=9eHKvCqBDBQ
主要记录一下如何添加和更新.deb文件
1、将所有的.deb文件放到 /repo/debs 文件夹中

2、在【终端】里输入命令

cd repo

3、继续输入命令

dpkg-scanpackages debs / > Packages

4、第3步生成了集合所有deb文件信息的 Packages 文件

5、利用 bzip2 生成 Cydia 可以识别的文件格式,输入命令

bzip2 -fks Packages

6、将所有文件上传到服务器即可

注:Release 文件为整个Cydia源的描述
  • 搭建 Cydia 源
    <!-- 制作 Packages: -->
    dpkg-scanpackages debs /dev/null > Packages
    tar zcvf Packages.gz Packages
    bzip2 -k Packages Packages.bz2
    <!-- 制作 Release -->
    Origin: Cydia/NetEase
    Label: Cydia/NetEase
    Suite: stable
    Version: 1.0
    Codename: netease
    Architectures: iphoneos-arm
    Components: main
    Description: Distribution of Unix Software for iOS
    <!-- SimpleHTTPServer -->
     python -m SimpleHTTPServer 8088
    
  • Hiraku Dev
  • cydia.git
    git clone git://git.saurik.com/cydia.git
    Original source git://git.saurik.com/cydia.git
    Web access http://gitweb.saurik.com/cydia.git
    
  • search.google.com
  • 在局域网搭建自己的Cydia源
  • 搭建Cydia软件源
搭建软件源,必须保证至少有Release(记录软件源本身的相关信息)和Packages(记录具体软件包的存放位置和安装信息等数据)两个文件。 
1、Release 格式: http://apt.saurik.com/dists/tangelo-3.7/Release
必须 
Origin: 软件源名称,可以使用中文(Cydia的软件源列表中显示的标题) 
Label:  同上,也可以使用中文 
Suite: 软件源的类型,比如正式源,测试源等,可以分别用stable, beta, unstable等来表示,一般填stable就可以了 
Version: 版本号,这个其实不重要,随便填,一般都是写1.0 
Codename: 代码代号,比如BigBoss的就写BigBoss,威锋的就写WeiPhone,也没什么限制,只能用英文 
Architectures: 结构。iPhone平台统一写iphoneos-arm 
Components: main 
Description: 软件介绍,可以使用中文和html代码,具体能使用哪些代码在下面会介绍。 
可选 
Support: 支持,没什么作用,除非特别需要,否则可以不要这个。 
MD5Sum: 不是必须的,但如果Packages文件位置不与Release文件在同一目录下,则必须有此项。另外,如果需要签名Release文件,也必须有这个。关于MD5Sum的格式,在下文也会介绍。
2、Packages实质上是deb文件的control信息集合(利用dpkg-scanpackages命令来制作Packages文件)
另外多了deb文件本身的信息。(control文件是记录软件包本身的信息,但没有deb文件本身) 
3、服务器上文件存放位置,最简单的
cydia--
           |--debs--*.deb
           |--Packages
           |--Packages.bz2
           |--Packages.gz
           |--Release
           |--Release.gpg
[root@desktop:/web/apt/xmpl]# dpkg-scanpackages -m . /dev/null >Packages
 ** Packages in archive but missing from override file: **
  com.saurik.myprogram

 Wrote 1 entries to output Packages file.
[root@desktop:/web/apt/xmpl]# bzip2 Packages
[root@desktop:/web/apt/xmpl]# gpg -abs -o Release.gpg Release
关于Root privilege
方式一:
给你的executable加上setuid/setgid bits, 比如说在postinst脚本里加上: chmod 6755 /path/to/executable
程序启动的时候调用setuid(0)
iOS不允许直接以root权限运行, 所以还要一个exec trick.
方式二:
还有种做法是利用launchd来执行需要root权限的操作. 从权限隔离的角度而言, 这种做法更好
preinst
在Deb包文件解包之前,将会运行该脚本。许多“preinst”脚本的任务是停止作用于待升级软件包的服务,直到软件包安装或升级完成。

postinst
该脚本的主要任务是完成安装包时的配置工作。许多“postinst”脚本负责执行有关命令为新安装或升级的软件重启服务。

prerm
该脚本负责停止与软件包相关联的daemon服务。它在删除软件包关联文件之前执行。

postrm
该脚本负责修改软件包链接或文件关联,或删除由它创建的文件。

Preparing to replace com.. 0.1-1 (using .../Media/com...deb) ...
[preinstall]  rm -rf
Unpacking replacement com.. ...
Setting up com.. (0.1-1) ...
[postinst]   ...

preinst
Debian软件包(".deb")解压前执行的脚本, 为正在被升级的包停止相关服务,直到升级或安装完成.(成功后执行 'postinst' 脚本).

postinst
主要完成软件包(".deb")安装完成后所需的配置工作. 通常, postinst 脚本要求用户输入, 和/或警告用户如果接受默认值, 应该记得按要求返回重新配置这个软件. 一个软件包安装或升级完成后, postinst 脚本驱动命令, 启动或重起相应的服务.

prerm
停止一个软件包的相关进程, 要卸载软件包的相关文件前执行.T.

postrm
修改相关文件或连接, 和/或卸载软件包所创建的文件
Alpha:是内部测试版,一般不向外部发布,会有很多Bug.一般只有测试人员使用。

Beta:也是测试版,这个阶段的版本会一直加入新的功能。在Alpha版之后推出。

RC:(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台上就是发行候选版本。RC版不会再加入新的功能了,主要着重于除错。

GA:General Availability,正式发布的版本,在国外都是用GA来说明release版本的。

RTM:(Release to Manufacture)是给工厂大量压片的版本,内容跟正式版是一样的,不过RTM版也有出限制、评估版的。但是和正式版本的主要程序代码都是一样的。

OEM:是给计算机厂商随着计算机贩卖的,也就是随机版。只能随机器出货,不能零售。只能全新安装,不能从旧有操作系统升级。包装不像零售版精美,通常只有一面CD和说明书(授权书)。 

RVL:号称是正式版,其实RVL根本不是版本的名称。它是中文版/英文版文档破解出来的。 

EVAL:而流通在网络上的EVAL版,与“评估版”类似,功能上和零售版没有区别。 

RTL:Retail(零售版)是真正的正式版,正式上架零售版。在安装盘的i386文件夹里有一个eula.txt,最后有一行EULAID,就是你的版本。比如简体中文正式版是EULAID:WX.4_PRO_RTL_CN,繁体中文正式版是WX.4_PRO_RTL_TW。其中:如果是WX.开头是正式版,WB.开头是测试版。_PRE,代表家庭版;_PRO,代表专业版。

α、β、λ常用来表示软件测试过程中的三个阶段,α是第一阶段,一般只供内部测试使用;β是第二个阶段,已经消除了软件中大部分的不完善之处,但仍有可能还存在缺陷和漏洞,一般只提供给特定的用户群来测试使用;λ是第三个阶段,此时产品已经相当成熟,只需在个别地方再做进一步的优化处理即可上市发行。 
1、API 接口的输入输出控制: 有些应用的产品逻辑其实完全没必要直接暴露信息,不过有些可能是API设计者完全不考虑直接就全吐出来了

2、没有区分有 session状态的、无状态的类型接口:有的应用逻辑都受限于第一个登录请求,登录验证成功后,后续的任何接口调用不带上任何类似session id的唯一标识

3、mysql用户(当时貌似是root)不限制访问ip

1、file .dylib

2、otool -l  .dylib

<!-- 3、https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/lipo.1.html -->
lipo -info .dylib
lipo -detailed_info .dylib
devzkndeMacBook-Pro:~ devzkn$ lipo -extract  armv7 tmp -output tmp.armv7
devzkndeMacBook-Pro:~ devzkn$  lipo -thin  arm64  tmp -output tmp.arm64

<!-- 4、ar: tmp is a fat file (use libtool(1) or lipo(1) and ar(1) on it) -->

转载请注明: > aso

在操作过程或者文章有问题的话欢迎在 原文 里提问或指正。

赞赏支持

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少
最近的文章

how_to_host_cydia_repo

前言将 Tweak 部署到大量设备上和更新的解决方案是搭建私有Cydia源 ;而非通常的make package install 、dpkg -i; Cydia 由 Jay Freeman(saurik)和他的公司开发,用于安装、管理越狱设备上的第三方软件、插件。它移植了Debian上的包管理器dpkg并提供了图形化前端,方便普通用户使用。Cydia 中还有个 Cydia Store,提供付费的第三方应用。 CydiaSubstrate iOS7 之前也叫Mobi...…

iOSre继续阅读
更早的文章

kim.cracksby.yalu102

前言优化一些配置信息:比如 dropbear.plist、bootstrap中包含scp、点击icon 自动激活ps:/Users/devzkn/code/re/yalu102-master正文 从工程中看到解压tar 的命令的执行(可以自己封装一下)jailbreak.m jl="/bin/tar"; // 从此段代码可以看出,以后可以将scp 放到bootstrap.tar 的/bootstrap/usr/bin 中即可,这样再也不用依赖openssh来获取scp,获...…

iOSre继续阅读
更多