微信反编译

所谓的反编译也就是砸壳,为什么要砸壳?为了更好的掌握IOS结构,简单的说可以了解诸如微信这样的牛掰的App的架构,我们通过对砸壳出的文件进行分析,还可以推敲出更多有用的东西。

准备工具:

  • 一台越狱后的iPhone
  • PP助手 可访问越狱应用市场的第三方软件
  • iTools Pro iPhone 越狱文件管理工具
  • class-dump 导出App头文件(前提是 App 在AppStore上加的密已经解除)
  • dumpdecrypted 解密App在AppStore加的密(砸壳)

ipa安装包获取途径

获取要被砸壳的App的ipa安装包,获取途径有两种

  1. iTunes 下载安装包。下载的ipa安装包肯定是加密后的,需要砸壳。
  2. PP 助手下载越狱应用。下载的ipa安装包已经被解密,可直接使用导出头文件。

环境配置

安装配置所需工具

  1. class-dump。下载最新版class-dump.dmg并打开,将class-dump.dmg安装包内的class-dump文件拷贝到 /usr/local/bin 目录下,有两种方式
  • 打开class-dump.dmg安装包,打开 /usr/local/bin ,拖拽安装包内class-dump 至 /usr/local/bin 目录下
  • 打开class-dump.dmg(安装包目录),拖拽class-dump至mac桌面,再通过以下命令拷贝至 /usr/local/bin
localhost:~ wany$ cd ~/Desktop/
localhost:Desktop wany$ sudo scp class-dump /usr/local/bin
  1. dumpdecrypted。Github上下载最新的dumpdecrypted源码,进入下载的dumpdecrypted目录(我这里是 ~/Download/dumpdecrypted-master),dumpdecrypted目录下执行以下命令编译出dumpdecrypted.dylib
localhost:~ wany$ cd ~/Download/dumpdecrypted-master
localhost:dumpdecrypted-master wany$ make

`xcrun --sdk iphoneos --find gcc` -Os  -Wimplicit -isysroot `xcrun --sdk iphoneos --show-
......省略部分输出.......
honeOS9.3.sdk/System/Library/PrivateFrameworks'

localhost:dumpdecrypted-master wany$ ls
Makefile        dumpdecrypted.c     dumpdecrypted.o
README          dumpdecrypted.dylib
localhost:dumpdecrypted-master wany$ 

  1. 越狱的iPhone,通过Cydia 安装openSSH。启动Cydia->搜索,输入 openssh 关键字查找,安装。

导出头文件(微信为例)

ipa安装包来自AppStore。

砸壳。每个App都有自己的沙盒,App启动,沙盒也会自然启动。在App 沙盒的tmp目录下放入动态解密库dumpdecrypted.dylib,App运行时通过加载该动态解密库dumpdecrypted.dylib,对代码进行解密,重新生成一个解密后的程序文件WeChat.decrypted

  1. 如果iPhone 中已安装微信可跳过本步骤,否则连接iTunes 安装该微信(重装微信需谨慎,微信聊天记录、图片、等重要数据可能会丢失)

  2. ssh 连接iPhone。这里我的ip为192.168.00.00,iPhone 和 Mac必须在同一网络下。

localhost:~ wany$ sudo ssh [email protected]
  1. 获取iPhone中微信沙盒的路径。这个寻找比较麻烦,我是通过iFunbox 找到的,寻找到微信的沙盒,iFunBox 下方会显示微信的沙盒路径。一定还有更简单的方法获取该路径,请自行探索。

  2. 获取iPhone中微信安装包路径。这个寻找比较麻烦,我是通过iTool Pro 找到的,一般都存放在 /var/mobile/Containers/Bundle/Application/ 下的某一个项目里面,如果显示的不是一个36位的字符串,可以尝试点击iTools Pro 下的导出按钮,导出到Mac桌面,保存到Mac桌面时名字就是一个36位的字符串。 一定还有更简单的方法获取该路径。

  3. dumpdecrypted.dylib 拷贝至 沙盒路径/tmp 目录下

  4. 执行砸壳命令

wany-iPhone:~  root#
wany-iPhone:/var/mobile/Containers/Data/Application/CFB9D15E-9A4F-4849-A0A4-8F276E5C52B2/tmp root#  DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/B209E97B-607B-4217-8AD5-0DABEAB48B3E/WeChat.app/WeChat
mach-o decryption dumper

DISCLAIMER: This tool is only meant for security research purposes, not for application crackers.

[+] detected 32bit ARM binary in memory.
[+] offset to cryptid found: @0xc4a4c(from 0xc4000) = a4c
[+] Found encrypted data at address 00004000 of length 42450944 bytes - type 1.
[+] Opening /private/var/mobile/Containers/Bundle/Application/B209E97B-607B-4217-8AD5-0DABEAB48B3E/WeChat.app/WeChat for reading.
[+] Reading header
[+] Detecting header type
[+] Executable is a FAT image - searching for right architecture
[+] Correct arch is at offset 16384 in the file
[+] Opening WeChat.decrypted for writing.
[+] Copying the not encrypted start of the file
[+] Dumping the decrypted data into the file
[+] Copying the not encrypted remainder of the file
[+] Setting the LC_ENCRYPTION_INFO->cryptid to 0 at offset 4a4c
[+] Closing original file
[+] Closing dump file

wany-iPhone:/var/mobile/Containers/Data/Application/CFB9D15E-9A4F-4849-A0A4-8F276E5C52B2/tmp root#

6)断开Mac和iPhone ssh连接

wany-iPhone:~ root# logout
Connection to 192.168.00.00 closed.
localhost:~ wany$ 

导出iPhone 中刚刚生成的WeChat.decrypted 到 Mac电脑桌面

localhost:~ wany$ scp [email protected]:/var/mobile/Containers/Data/Application/CFB9D15E-9A4F-4849-A0A4-8F276E5C52B2/tmp/WeChat.decrypted ~/Desktop/
  1. 砸壳
localhost:~ wany$ cd ~/Desktop/
localhost:Desktop wany$ class-dump -s -S -H WeChat.decrypted  WeChatHead (执行后,等待片刻,控制台无任何输出)
//头文件导出成功
localhost:Desktop wany$ 

如果砸出的文件夹WeChatHead中只有一个名为CDStructures.h 的文件,说明解密是不完整的
查看是否解密完成。cryptid这个标志位判断是否解密,1的代表未解密,0的代表解密。

localhost:Desktop wany$ otool -l WeChat.decrypted | grep crypt
WeChat.decrypted (architecture armv7):
     cryptoff 16384
    cryptsize 42450944
      cryptid 0
WeChat.decrypted (architecture arm64):
     cryptoff 16384
    cryptsize 45678592
      cryptid 1

由此可见,arm64 还处于未解密的状态,我们刚才只是解密了armv7。所以我们导不出任何有用的东西。继续使用以下命令

localhost:Desktop wany$ class-dump --arch armv7  WeChat.decrypted -H -o WeChatHead

如果依然导不出任何有用的东西,我也不清楚了,还在学习中。

ipa安装包来着pp助手越狱应用市场。

寻找下载的ipa目录所在目录(简称该目录为xxx),解压ipa安装包。
我这里下载的微信ipa 名为 ‘微信 6.3.25(越狱应用).ipa’ ,为了方便下面介绍的使用,这里更名为‘WeChat_YueYu.ipa’

localhost:~ wany$ cd xxx
localhost:xxx wany$ unzip WeChat_YueYu.ipa
localhost:xxx wany$ ls
WeChat_YueYu    WeChat_YueYu.ipa
localhost:xxx wany$ cd WeChat_YueYu
localhost:WeChat_YueYu wany$ ls
META-INF        iTunesArtwork
Payload         iTunesMetadata.plist
localhost:WeChat_YueYu wany$ cd Payload
localhost:Payload wany$ ls
WeChat.app
//砸壳
localhost:Payload wany$ class-dump -H WeChat.app -o WeChatHead   (执行后,等待片刻,控制台无任何输出)
//头文件导出成功
localhost:Payload wany$ ls
WeChat.app  WeChatHead
localhost:Payload wany$ open WeChatHead

接下来就开始愉快的分析微信头文件吧,你一定会更上一层楼的。

如果再砸壳中出现以下问题

 class-dump[12985:861374] Error: Cannot find offset for address 0x300000000100b925 in stringAtAddress:

那么这个软件很可能使用的swift编程语言(非OC),目前还没有出现swift 砸壳工具,还有一种很小的可能性是该软件做了反砸壳机制 ,看这里。

参考书籍 : 《IOS 应用逆向工程 2》

你可能感兴趣的:(微信反编译)