IOS OPlayer Lite广告去除 您所在的位置:网站首页 ipad怎么去除广告 IOS OPlayer Lite广告去除

IOS OPlayer Lite广告去除

2024-07-04 01:34| 来源: 网络整理| 查看: 265

一、去除思路

OPlayer Lite是一款视频播放软件,可以播放本地视频,也可以播放链接,但是播放视频时上方又出现广告框,飞行模式和联网模式还不一样,联网状态下广告会自动变换。确定以下去除思路:

1.确定广告位置 cycript

2.砸壳 frida 、clutch等方法

3.lldb调试定位广告位置 lldb+debugserver

4.ida寻找代码逻辑 ida

5.找到关键调用广告位置

6.修改程序逻辑,hook关键函数 theos、monkeyDev

分析:在断网的情况下会出现一个广告弹框提示”购买高版本“,在联网状态下除了前者,还会加载联网广告,覆盖原来的广告,所以分别为两部分,断网和联网状态去除广告。左边为联网,右边为断网。

得到    

二、本地广告去除

首先按照上面理清的思路,先确定广告界面的位置定位广告位置,用到的工具就是cycript工具。安装请自行google

1.确定广告位置 cycript

先ssh连上手机(如何连请百度),然后将手机调到上图有广告的位置的界面,然后用cycript注入到目标进程

执行

ps -e | grep OPlayer.* //显示进程号 cycript -p 4324 //注入到进程 [UIApp.keyWindow recursiveDescription].toString()//打印当前界面的控件

 看到了关键信息就是这个控件,测试一下

输入命令 [#0x111904860 setHidden:YES] 看广告控件是否隐藏,输入[#0x111904860 setHidden:NO]看是否出现,经过验证就是这个控件,然后就分析这个UIView是如何来的,一般子视图都是通过addSubview方法在父级添加的,这里可以通过Dash这个软件查找apple API获得这个方法的来源,得到是通过UIKit->UIVIew->addSubview(_:)

2.砸壳 frida 、clutch等方法

砸壳就不说了就几条命令,详细的可以google,frida-ps -U  查看砸壳应用的id,dump.py 即可。

class-dump导出头文件:到砸壳完的Playload文件夹下的app,输入命令  class-dump -H "OPlayer Lite.app",生成的头文件会在同级目录。class-dump安装自行google。

3.lldb调试定位广告位置 lldb+debugserver

调试app,端口转发

iproxy 2222 22  //ssh连接手机

iproxy 1234 1234//调试接口

lldb连接上之后,直接大法正则匹配addSubview下断点 rbreak .*addSubview.*

除了第一个,将其他断点删去 ,然后调试找到刚才的frame,先将断点取消,返回到点击视频的界面,再开启断点,点击视频看是否断在断点处:

然后c继续,查看x2内容

直到出现frame = (60 0; 260 50); 

找到这个frame之后,接着ni下一步,当模块转到了OPlayer时在ida里定位,到ida里面看逻辑。 

4.ida寻找代码逻辑 ida

首先在ida定位,

0x1004B5070=0x100589070-0xd4000(image偏移),在ida定位:

网上拉这个函数调用的

现在的办法可以直接hook这个函数什么都不做,不过最好的是修改程序流程逻辑,看看是否能跳过这个广告,发现是有判断可以跳过的:

 汇编是当x8=0则不跳转就执行广告的逻辑,所以要让x8!=0,所以要看x22的值,x22是由localView赋予的,所以我们就hook localAdView,改变他的值不为零。

 调试验证:

在PlayViewController viewWillAppear:下断点

 br s -a 0x1004B4F30+0xd4000

改变x8寄存器的值为非0,看广告是否没有:

广告已经没了,说明就是这个问题。

5.修改程序逻辑

创建tweak工程,hook PlayViewController viewWillAppear 下的localAdView的值。在头文件里找到localAdView的定义

hook将它附一个初值就行,创建tweak工程,查看app Bundle Id

MakeFile:

export THEOS_DEVICES_IP = localhost export THEOS_DEVICES_PORT = 2222 include $(THEOS)/makefiles/common.mk TWEAK_NAME = OPlayer OPlayer_FILES = Tweak.x OPlayer_CFLAGS = -fobjc-arc include $(THEOS_MAKE_PATH)/tweak.mk after-install:: install.exec "killall -9 SpringBoard"

Tweak.x:

@interface PlayViewController : UIViewController @property(retain, nonatomic) UIView *localAdView; @end %hook PlayViewController - (void)viewWillAppear:(_Bool)arg1{ self.localAdView = [[UIView alloc] initWithFrame:CGRectZero]; %orig; } %end

plist:

{ Filter = { Bundles = ( "com.olimsoft.oplayer.lite", ); }; }

编译,打包,安装

make 

make package install

 重启SpringBoard后重新打开app,广告已经没有了:

本地广告去除完毕。

三、联网广告去除

联网的广告和本地的不同就是隔一段时间会变,不管他变不变先定位控件的位置,跟本地的方法一样

不同的是控件不一样了,也没有文字的提示快速找到控件位置,但根据经验可以定位,并进行验证:

 

验证后确定就是这个位置,之后就按照本地视频的方法,调试找addSubview,找出相同的frame,然后在ida里找到调用的函数,分析逻辑。

x30(lr) 64位 通常称X30为程序链接寄存器,保存子程序结束后需要执行的下一条指令,lr存该函数返回地址

定位函数0x000000010028d440-0xfc000=0x100191440,ida找到:commoninit函数

 查看谁调用它:

绕过commoninit就要改变v11的值也就是x20的值,x20和x0有关,x0和_objc_msgSendSuper2调用有关,所以要改变这个调用的返回值为0,就会跳转,不会生成广告。

和上面本地一样,调试将x20的值改为0,看广告是否消除,经验证广告没有了 

hook实现:

经过尝试hook  initWithFrame没有作用,换一种思路,将commoninit hook掉,什么也不干,也就不会生成广告了。

创建monkeyDev 工程:(头文件可以自己去dump出来的文件找)

修改项目ip port 和bundle id

运行项目:

SpringBoard重启打开app看到已经没有广告了:

四、总结

这次的去广告,在联网的情况下分析出了在哪里调用的生成广告的函数,hook没有修改程序逻辑,直接把生成广告的函数给hook掉了,欠妥,后面应该还可以有其他的hook方法,比如hook修改广告返回的frame,将其值修改为0,是比较稳妥的办法.后续还需要掌握hook寄存器的值并修改的方法.

附上常用的arm64汇编指令:

MOV X1,X0 ;将寄存器X0的值传送到寄存器X1 ADD X0,X1,X2 ;寄存器X1和X2的值相加后传送到X0 SUB X0,X1,X2 ;寄存器X1和X2的值相减后传送到X0 AND X0,X0,#0xF ; X0的值与0xF相位与后的值传送到X0 ORR X0,X0,#9 ; X0的值与9相位或后的值传送到X0 EOR X0,X0,#0xF ; X0的值与0xF相异或后的值传送到X0 LDR X5,[X6,#0x08] ;X6寄存器加0x08的和的地址值内的数据传送到X5 STR X0, [SP, #0x8] ;X0寄存器的数据传送到SP+0x8地址值指向的存储空间 STP x29, x30, [sp, #0x10] ;入栈指令 LDP x29, x30, [sp, #0x10] ;出栈指令 CBZ ;比较(Compare),如果结果为零(Zero)就转移(只能跳到后面的指令) CBNZ ;比较,如果结果非零(Non Zero)就转移(只能跳到后面的指令) CMP ;比较指令,相当于SUBS,影响程序状态寄存器CPSR B/BL ;绝对跳转#imm, 返回地址保存到LR(X30) RET ;子程序返回指令,返回地址默认保存在LR(X30)


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有