一、砸壳方法(转载注明出处)
###准备工作:
- 越狱的手机(必须的)
- dumpdecrypted (砸壳使用)
- class-dump (导出砸壳后的二进制包的头文件)
- Cycript(Cydia)(在越狱手机的越狱市场下载,安装)
- adv-cmds(Cydia)(在越狱手机的越狱市场下载,安装)
- OpenSSH(Cydia) (在越狱手机的越狱市场下载,安装)
###具体实现步骤
首先在APPStore中下载正版的应用
以QQ为例
-
首先确保手机连接和电脑连接的是同一个网段
-
用ssh命令连接上手机,密码默认是 alpine
ssh root@10.2.200.186
- 关闭所有的后台APP,仅保持QQ后台活跃
ps -e | grep QQ
(如果这里是其他APP,不清楚具体名字,那么执行这个命令,我这里是知道我破壳的应用叫QQ,所以,直接执行 ps -e | grep QQ)
ps -e
- 使用cycript命令,找到目标app的Document路径,使用如下命令
cycript -p QQ
键入一下命令
[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask][0]
拿到地址并且记录下来,后面要用到
control + z
退出cy模式
- 这里一定要注意,将我们下载好的 dumpdecrypted 编译一下,生成动态库dylib,编译方法是,进入到我们下载好的
dumpdecypted
目录下
直接执行make命令
这样会编译一遍dumpdecrypted,生成dylib
- 将生成的将dumpdecrypted.dylib拷贝到Documents目录下,执行该命令
sudo scp dumpdecrypted.dylib root@10.2.200.186:/var/mobile/Containers/Data/Application/531B07B4-3048-4EEF-BB76-25F6F83D1EEC/Documents/
- 开始砸壳,使用以下命令,会在当前目录下生成QQ.decrypted砸壳后的文件。
DYLD_INSERT_LIBRARIES=/var/mobile/Containers/Data/Application/531B07B4-3048-4EEF-BB76-25F6F83D1EEC/Documents/dumpdecrypted.dylib /var/mobile/Containers/Bundle/Application/20E39925-5231-4BE3-B483-9D6481BCC715/QQ.app/QQ
成功后有如下结果
- 将砸壳后的QQ.decrypted文件拷贝到电脑上。
sudo cp root@10.2.200.186 /var/root/QQ.decrypted
屏幕快照 2018-07-06 下午12.34.17
(我在这里是拷贝到当前文件夹下,所以后面没有带路径),如拷贝到指定文件夹,后面需要带路径
你会看到这个文件
到此,砸壳完成,接下来,操作一下,如何提取头文件
class-dump最新安装方法
当Mac升级了OSX 10.11后,配置class-dump的时候,会发现逆向书上推荐的class-dump存放目录**/usr/bin**,class-dump存放不进去,尝试过用sudo 还是不被允许。
-
首先打开Terminal,输入mkdir ~/bin,在当前用户根目录下创建一个bin目录
-
把下载下来的 dmg 打开,复制文件里面的class-dump到创建的bin目录下。赋予其可执行权限
chmod +x ~/bin/class-dump
- 打开bash_profile文件配置环境变量:
vim ~/.bash_profile
- 按下 i 键进入编辑状态,在最下方加一行
export PATH=$HOME/bin/:$PATH
- 按下esc键,再按shift+: 输入 wq进行保存退出编辑
6.在Terminal中执行
source ~/.bash_profile
具体可参见
https://www.jianshu.com/p/025fa775f3a6
执行该命令
class-dump -H QQ.decrypted -o output/
紧接着,你就会发现,
二、重签名 (以WeChat为例,当然,上面用的是QQ的,原理都一样)
准备工作:砸壳完成的二进制文件、IPA包、脚本文件、证书、描述文件
1.解压ipa包
unzip WeChat.ipa -d WeChat_unzip
2.替换二进制文件
- 微信砸壳会得到一个WeChat.decrypted文件, 重命名为WeChat,在终端,输入 chmod 777 ,然后把 WeChat拖到终端上按回车 修改下权限。
sudo chmod 777 WeChat
- 替换砸壳了的WeChat二进制文件
用WeChat替换Payload/WeChat包内容里的二进制文件
3.修改Bundle identifier
找到WeChat_unzip/Payload/WeChat包内容的info.plist 文件,修改 Bundle identifier,需要与使用的额证书和描述文件相一致
4.重签名
打开终端,cd 进入 文件所在目录,运行
sh ios_resign_from_app_to_ipa WeChat_unzip "iPhone Distribution: Beijing 1000 Oaks Hu Lian Technology Development (UECH3VPJ68)" embedded.mobileprovision WeChat_resig.ipa
5.签名成功,得到ipa文件
三、防撤回+步数统计
1.获取砸壳后的头文件,如图
2.用编辑器打开搜索关键词message、revoke等,最终锁定CMessageMgr.h文件
经过尝试找到如下方法
- (void)onRevokeMsg:(id)arg1;
- (void)DelMsg:(id)arg1 MsgList:(id)arg2 DelAll:(_Bool)arg3;
onRevokeMsg为收到一条撤回通知(此时微信里显示“对方已撤回”)
DelMsg为删除本地消息,所以我们hook该方法即可换成自己的方法
ps:注意,只有当收到revoke通知删除本地消失时才替换成自己的方法,其它情况调用父类方法
微信步数实现步骤
1.获取步数
- 通过脱壳后的微信ipa包,获取到工程中的所有头文件,找到其中管理微信运动步数的类为WCDeviceStepObject。
- 通过几次实验(以及对函数名的猜测)得到了获取步数的函数为m7StepCount。
- 通过开源的CaptainHook类,利用ObjC的runtime机制,对m7StepCount函数进行method swizzling,也就是用我们自己的实现来替换微信的实现。为了避免改得太假被微信发现,如果修改的不是当天或者改的步数比微信自己计算的还少,就直接调用微信原有的方法。
2.在设置中加入修改入口
- 微信的设置页比较好找,在NewSettingViewController类中。
- 通过Reveal软件能看到微信设置界面的结构,在MMTableViewSectionInfo中增加一行输入步数的MMTableViewCellInfo,并最后加到MMTableViewInfo中。
- 重新刷新tableView,就能看到新加的入口了。