iOS逆向工程的工具
大致可分为四类:检测工具、反编译工具、调试工具、开发工具
- 检测工具
如:Reveal、tcpdump等- 反编译工具(反汇编工具 - 分析二进制文件并得到一些信息)
如:IDA、Hopper Disassembler、classdump等- 调试工具
如:lldb、Cycript等- 开发工具
如:Xcode、theos等
classdump
class-dump只能导出未经加密的App的头文件。classdump是对"otool -ov" 信息的翻译,以一种我们熟悉的易读的方式呈现。官网http://stevenygard.com/projects/class-dump/
- class-dump的安装
点击下载后解压后会有class-dump和源码文件。将class-dump 复制到/usr/bin/class-dump。如果是OS X 10.11,因为没有/usr/bin文件夹的写权限,所以将class-dump复制到/usr/local/bin/class-dump即可。
同时打开Terminal,执行命令赋予其执行权限:
sudo chmod 777 /usr/bin/class-dump- otool工具简介
otool(object file displaying tool) :目标文件的展示工具。可以用来发现应用中使用到了哪些系统库,调用了其中哪些方法,使用了库中哪些对象及属性,它是Xcode自带的常用工具。
otool命令介绍
-f print the fat headers
-a print the archive header
-h print the mach header
-l print the load commands
-L print shared libraries used
-D print shared library id name
-t print the text section (disassemble with -v)
-p start dissassemble from routine name
-s print contents of section
-d print the data section
-o print the Objective-C segment
-r print the relocation entries
-S print the table of contents of a library
-T print the table of contents of a dynamic shared library
-M print the module table of a dynamic shared library
-R print the reference table of a dynamic shared library
-I print the indirect symbol table
-H print the two-level hints table
-G print the data in code table
-v print verbosely (symbolically) when possible
-V print disassembled operands symbolically
-c print argument strings of a core file
-X print no leading addresses or headers
-m don't use archive(member) syntax
-B force Thumb disassembly (ARM objects only)
-q use llvm's disassembler (the default)
-Q use otool(1)'s disassembler
-mcpu=arg use `arg' as the cpu for disassembly
-j print opcode bytes
-P print the info plist section as strings
-C print linker optimization hints
--version print the version of /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool
otool命令使用
- 依赖库的查询
如: otool -L WeChart
- 是否加壳
如:otool -l WeChart | grep -B 2 crypt
classdump的使用
class-dump -s -S -H /Applications/Memenet/Memenet.app/Contents/MacOS/memenet -o ./MyHeaders
查看文件夹个数
查看某文件夹下文件的个数,包括子文件夹里的。
ls -lR|grep "^-"|wc -l
查看某文件夹下文件夹的个数,包括子文件夹里的。
ls -lR|grep "^d"|wc -l
dumpdecrypted 砸壳工具
下载最新源码: git clone https://github.com/stefanesser/dumpdecrypted.git
编译动态库文件(dumpdecrypted.dylib): make
- 将dumpdecrypted.dylib从电脑上复制到手机tmp目录
scp dumpdecrypted.dylib [email protected]:/tmp
- 定位要砸壳的StoreApp的执行文件名字TargetApp (ps -e 可以得到全路径)
ps -e | grep WeChat
得到WeChat的路径,下边会用到
/var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
- 定位要砸壳的StoreApp的Document目录
cycript -p TargetApp [[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
得到路径
#"file:///var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/"
- 进入Document目录
cd /var/mobile/Containers/Data/Application/986376B5-EF08-4CAF-81FB-CAE48D1FE4AE/Documents/
- 拷贝dumpdecrypted.dylib到本路径下
cp /tmp/dumpdecrypted.dylib .
- 设置DYLD_INSERT_LIBRARIES
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/749DC69A-3A8D-4B5C-9926-1220E69FC85F/WeChat.app/WeChat
- 将砸壳后的WeChat.decrypted文件拷贝到电脑上tmp文件夹下
scp WeChat.decrypted [email protected]:/tmp
- 在电脑端执行class-dump 命令,就可以得到工程中的header文件
cd /tmp
class-dump -s -S -H WeChat.decrypted -o ./WeChatHeaders
theos
作者:@DHowett,越狱开发工具包
1、 xcode工具集的路径需要设置正确
查看命令: xcode-select --print-path
设置命令: xcode-select --switch /Applications/Xcode-beta.app/Contents/Developer
2、 通过github安装theos
https://github.com/theos/theos/wiki/Installation
3、 修改所有者
sudo chown -R $(id -u):$(id -g) theos
theos维基百科:
- http://iphonedevwiki.net/index.php/Theos/Setup#For_Mac_OS_X
- http://iphonedevwiki.net/index.php/Theos
配置环境变量
export THEOS=/opt/theos
可以写入~/.bash_profile
source ~/.bash_profile
echo $THEOS
ldid
作者:saurik
维基百科:http://iphonedevwiki.net/index.php/Ldid
越狱iPhone下的签名工具(更改授权entitlements),可以为thos开发的程序进程签名(支持在OS X和iOS上运行)。
安装ldid
brew install ldid fakeroot
加密算法
- 对称加密算法:RC4、DES、3DES、AES128、AES256等。加解密双方密钥相同。
- 非对称加密算法:RSA、Elgamal等。加解密双方使用密钥对。
- 哈希算法:MD5(16Byte)、SHA1(20Byte)等。任意长度的信息转换成到某一固定长度的信息摘要(具有唯一性,不可逆性),主要作用是对数据数据完整性校验。
数字签名 (苹果官方的私钥签名,公钥验证)
数字签名是非对称密钥加密技术与数字摘要技术的应用。对指定信息使用哈希算法,得到一个固定长度的信息摘要,然后再使用 私钥 (注意必须是私钥)对该摘要加密,就得到了数字签名。
数字证书
数字证书是一个文件,由苹果的 Apple Worldwide Developer Relations Certification Authority(WWDR)证书认证中心进行签名,其主要作用是用来标示身份。证书文件主要包含两部分内容:证书信息和证书签名
- 证书信息
包含用户的公钥、用户个人信息、证书颁发机构信息、证书有效期等信息。(这里的用户主要指开发者)- 证书签名
WWDR将上述证书本身内容的使用哈希算法得到一个固定长度的信息摘要,然后使用自己的私钥对该信息摘要加密生成数字签名。
证书的验证
iOS系统原本就持有WWDR的公钥,系统首先会对证书内容通过指定的哈希算法计算得到一个信息摘要;然后使用WWDR的公钥对证书中包含的数字签名解密,从而得到经过WWDR的私钥加密过的信息摘要;最后对比两个信息摘要,如果内容相同就说明该证书可信。在验证了证书是可信的以后,iOS系统就可以获取到证书中包含的开发者的公钥,并使用该公钥来判断代码签名的可用性了。
证书存在的意义
通过证书使用过程可以看出,证书本身只是一个容器,用来承载开发者的公钥。iOS通过验证证书的合法性来确保开发者公钥的合法性。
- 代码签名与验证(开发者的私钥签名,公钥验证)打包过程中使用开发者私钥对应用进行签名。
- 开发者的公钥被包含在数字证书里,数字证书又被包含在描述文件(Provisioning File)中,描述文件在应用被安装的时候会被拷贝到iOS设备中。iOS安全系统通过证书就能够确定开发者身份,就能够通过从证书中获取到的公钥来验证开发者用该公钥对应的私钥签名后的代码、资源文件等有没有被更改破坏,最终确定应用能否合法的在iOS设备上合法运行。
工具的使用
查看codesign load command
otool -l WeChat | grep -A 5 SIGNATURE
查看签名信息
➜ tmp codesign -dvvv WeChat
Executable=/private/tmp/WeChat
Identifier=com.tencent.xin
Format=Mach-O universal (armv7 arm64)
CodeDirectory v=20200 size=448783 flags=0x0(none) hashes=14017+5 location=embedded
Hash type=sha256 size=32
CandidateCDHash sha1=6e2f8a93dbe63c17ea3b3a3dc032826b9eddf2b7
CandidateCDHash sha256=d6f1afe23b598a76301711a4a62a5505a749a12a
Hash choices=sha1,sha256
CDHash=d6f1afe23b598a76301711a4a62a5505a749a12a
Signature size=3925
Authority=Apple iPhone OS Application Signing
Authority=Apple iPhone Certification Authority
Authority=Apple Root CA
Info.plist=not bound
TeamIdentifier=88L2Q4487U
Sealed Resources=none
Internal requirements count=1 size=96
查看entitlement内容
codesign -d --entitlements - WeChat
ldid -e WeChat
修改entitlement内容
ldid -Sentitlement.xml WeChat
dpkg工具
- 安装
$ brew install --from-bottle https://raw.githubusercontent.com/Homebrew/homebrew-core/7a4dabfc1a2acd9f01a1670fde4f0094c4fb6ffa/Formula/dpkg.rb
$ brew pin dpkg
- 使用
dpkg -i xxxxx.deb deb包安装
dpkg -r com.xxxxx.xxxx deb包卸载
dpkg -s com.iosre.myiosreproject 查看安装包信息