前言
正文
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 源
- Wireshark抓包iOS入门教程
Charles(针对http和https),tcpdump(快速分析网络包),和Wireshare
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
- 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.
- Electra iOS 11.0 - 11.1.2 jailbreak toolkit based on async_awake
https://coolstar.org/electra/
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
- 验证试验 - 探求 fishhook 原理(二)
- 水文:对漏洞挖掘的一点看法
- Hooks MGCopyAnswer(arm64): https://stackoverflow.com/questions/37903788/libmobilegestalt-dylib-crashed-when-hooking-mgcopyanswer-for-arm64
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工具介绍:http://wyh.life/article/2014/10/27/cydia
###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)、
- http://developer.limneos.net/index.php?ios=11.1.2&framework=SpringBoard
- 搭建 Cydia 源
- https://github.com/mackyle/fakeroot.
Only five files are installed: /usr/local/bin/faked /usr/local/bin/fakeroot /usr/local/lib/libfakeroot.dylib /usr/local/share/man/man1/faked.1 /usr/local/share/man/man1/fakeroot.1
- Debian packaging of fakeroot
- http://mackyle.github.io/fakeroot/
- fakeroot
- mwrinfosecurity
- iInjection
- angelXwind
- seekpoint
- https://theos.github.io/
- Debian-Binary-Package-Building-HOWTO
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
- 在局域网搭建自己的Cydia源
dpkg-scanpackages debs /dev/null > Packages tar zcvf Packages.gz Packages bzip2 -k Packages Packages.bz2 gpg --gen-key gpg -abs -r "你刚才的密钥名字" -o Release.gpg Release
- mypostlist
- how-to-develop-jailbreak-apps-for-ios
关于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] ...
- deb包的执行脚本
debian/preinst 安装前执行脚本 debian/postinst 安装后执行脚本 debian/prerm 卸载前执行脚本 debian/postrm 卸载后执行脚本
- Debian 的 preinst, postinst, prerm, 和 postrm 脚本
- Deb包管理向导
- https://www.jianshu.com/p/10669d1083b2
ASO 的目标就是提升 App 在 App Store 的自然下载量,而 下载量 = 展示量 × 下载转化率,所以,要么增加展示量,要么提升下载转化率 1、搜索指数 ≥ 4605 的关键词通常被认为有搜索量 2、高搜索指数以及低竞争度的关键词是最佳选择 3、关键词(副标题、关键字域部分)、下载量和活跃用户量对搜索优化有直接作用,而图标、截图以及预览视频、描述和用户评论,则影响下载转化率,对搜索优化有间接作用
- app store FAQ
- ASO基础操作指南
- 安全模式SafeModeMgrExt,可利用cycript 进行分析
- WireShark抓包
- how-to-develop-jailbreak-apps-for-ios
- Debian 的 preinst, postinst, prerm, 和 postrm 脚本?
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) -->
在操作过程或者文章有问题的话欢迎在 原文 里提问或指正。