ps -A
ps -A 显示所有的进程
ps -A | grep we 查找we
使用otool判断app是不是加密了的,如果是加密了的,则需要进行脱壳处理
yongwangdeMac-mini:weixin mudy$ otool -l WeChat | grep crypt
cryptoff 16384
cryptsize 57458688
cryptid 1
使用Clutch进行脱壳
由于在App Store上下载的app都是经过加密了的,我们无法使用class-dump直接获取.h文件(直接执行class-dump的时候,只会生成一个文件),所以我们第一步要进行脱壳(砸壳)的操作。
将下载下来的Clutch文件的版本号去掉之后,拷贝到手机端的Device/var/bin目录下,这样的话,我们就可以在连接到手机之后,使用Clutch进行脱壳的操作(有时候提示没有这个命令,说明权限不够,需要提升权限,如下操作即可)。
连接到手机之后,使用Clutch -i,就可以看到手机上安装的部分的应用,这些应用都是需要我们进行脱壳操作的。执行脱壳操作的时候,只需要执行Clutch -d 序号,就行了。脱壳成功之后,会生成一个ipa文件
ceshi:~ root# chmod +x /usr/bin/Clutch
ceshi:~ root# Clutch -i
Installed apps:
1: 网易云音乐HD <com.netease.CloudMusicIpad>
2: 微信 <com.tencent.xin>
3: ボイスレコーダー-無料ボイスメモ <com.leqimea.recorderAudio>
4: 芒果TV-HD <com.imgo.tv.hd>
5: TestFlight <com.apple.TestFlight>
6: 金山电池医生 - 电池维护大师 <com.ijinshan.beijing.kbatterydoctor>
ceshi:~ root# Clutch -d 3
使用dumpdecrypted进行脱壳
下载完dumpdecrypted之后,到该文件夹下,执行make命令,可以生成一个dylib动态库文件,将该文件拷贝到手机上(如果是root,放在/var/root目录中)
在root目录中,使用环境变量DYLD_INSERT_LIBRARIES将dylib注入到需要脱壳的可执行文件(可执行文件路径可以通过ps -A获取)
ceshi:~ root# ldid -S /var/root/dumpdecrypted.dylib
ceshi:~ root# DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/containers/Bundle/Application/756838AD-4FAA-4D94-A5B9-E5CE5CEF2DF9/WeChat.app/WeChat
DYLD_INSERT_LIBRARIES=dumpdecrypted.dylib /var/mobile/....
,最终获得的.decrypted文件就是脱壳后的可执行文件
app去掉广告
使用reveal获取到广告空间的内存地址(就在reveal的右下角),然后使用[#内存地址 removeFromSuperview],但是这种做法并不彻底
使用hook修改方法的实现
使用theos来进行hook
brew install ldid
git clone --recursive https://github.com/theos/theos.git ~/theos
或$THEOS
--recursive 表示递归下载所需要的依赖,clone到~/theos文件夹下配置.bash_profile
export THEOS=~/theos
,导出一个环境变量THEOS,其值是~/theos//export PATH=~/theos/bin:/usr/bin:usr/local/bin
export PATH=~/theos/bin:$PATH $PATH引用环境变量的值
重启命令行
nic.pl
export THEOS_DEVICE_IP = 127.0.0.1
export THEOS_DEVICE_PORT = 10010
/* How to Hook with Logos
Hooks are written with syntax similar to that of an Objective-C @implementation.
You don't need to #include <substrate.h>, it will be done automatically, as will
the generation of a class list and an automatic constructor.
%hook ClassName
// Hooking a class method
+ (id)sharedInstance {
return %orig;
}
// Hooking an instance method with an argument.
- (void)messageName:(int)argument {
%log; // Write a message about this call, including its class, name and arguments, to the system log.
%orig; // Call through to the original function with its original arguments.
%orig(nil); // Call through to the original function with a custom argument.
// If you use %orig(), you MUST supply all arguments (except for self and _cmd, the automatically generated ones.)
}
// Hooking an instance method with no arguments.
- (id)noArguments {
%log;
id awesome = %orig;
[awesome doSomethingElse];
return awesome;
}
// Always make sure you clean up after yourself; Not doing so could have grave consequences!
%end
*/
%hook FindFriendEntryViewController
- (long long)numberOfSectionsInTableView:(id)tableView{
return %orig + 1;
}
- (long long)tableView:(id)tableView numberOfRowsInSection:(long long)section{
if (section == [self numberOfSectionsInTableView:tableView]-1){
return 3;
}else{
return %orig;
}
}
- (double)tableView:(id)tableView heightForRowAtIndexPath:(id)indexPath{
if ([indexPath section] != [self numberOfSectionsInTableView:tableView]-1){
return %orig;
}else{
return 52;
}
}
- (id)tableView:(id)tableView cellForRowAtIndexPath:(id)indexPath{
if ([indexPath section] != [self numberOfSectionsInTableView:tableView]-1){
return %orig;
}
UITableViewCell *cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
cell.backgroundColor = [UIColor whiteColor];
cell.textLabel.font = [UIFont systemFontOfSize:20];
if ([indexPath row]==0)
{
cell.imageView.image = [UIImage imageWithContentsOfFile:@"/hongbao.png"];
UISwitch *sw = [[UISwitch alloc]init];
cell.accessoryView = sw;
cell.textLabel.text = @"自动抢红包";
}else if ([indexPath row]==1){
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.imageView.image = [UIImage imageWithContentsOfFile:@"/lingqian.png"];
cell.textLabel.text = @"零钱加满";
}else{
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.imageView.image = [UIImage imageWithContentsOfFile:@"/Lower.png"];
cell.textLabel.text = @"遇到傻逼也是没招没招的";
}
return cell;
}
- (void)tableView:(id)tableView didSelectRowAtIndexPath:(id)indexPath{
if ([indexPath section] != [self numberOfSectionsInTableView:tableView]-1){
%orig;
}else{
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
}
%end
获取appID
方式一:
ceshi:~ root# cycript -p WeChat
cy# @import mjcript
{}
cy# MJAppId
@"com.tencent.xin"
方式二:
cy# [NSBundle mainBundle].bundleIdentifier
@"com.tencent.xin"
方式三:
ceshi:~ root# Clutch -i
Installed apps:
1: 网易云音乐HD <com.netease.CloudMusicIpad>
2: TestFlight <com.apple.TestFlight>
3: ボイスレコーダー-無料ボイスメモ <com.leqimea.recorderAudio>
4: 芒果TV-HD <com.imgo.tv.hd>
5: 金山电池医生 - 电池维护大师 <com.ijinshan.beijing.kbatterydoctor>
使用Clutch -i的时候有一个局限,就是只能显示已经加壳的
编译、打包、安装
vim ~/tweak.sh
make clean && make && make package && make install
然后执行的时候,直接sh ~/tweak.sh
腾讯视频去广告
cy# #0x111ed60f0
#"<QNBPlayerVideoAdsView: 0x111ed60f0; frame = (0 0; 320 180); autoresize = W+H; layer = <CALayer: 0x170637460>>"