微信反编译

作者: 灰斗儿 | 来源:发表于2016-09-12 16:35 被阅读433次

    所谓的反编译也就是砸壳,为什么要砸壳?为了更好的掌握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 root@192.168.00.00
    
    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 root@192.168.00.00:/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》

    相关文章

      网友评论

        本文标题:微信反编译

        本文链接:https://www.haomeiwen.com/subject/ztypettx.html