IOS OPlayer Lite广告去除 | 您所在的位置:网站首页 › ipad怎么去除广告 › IOS OPlayer Lite广告去除 |
一、去除思路
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定位,
网上拉这个函数调用的 现在的办法可以直接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; } %endplist: { Filter = { Bundles = ( "com.olimsoft.oplayer.lite", ); }; }编译,打包,安装 make make package install
本地广告去除完毕。 三、联网广告去除联网的广告和本地的不同就是隔一段时间会变,不管他变不变先定位控件的位置,跟本地的方法一样 不同的是控件不一样了,也没有文字的提示快速找到控件位置,但根据经验可以定位,并进行验证: 验证后确定就是这个位置,之后就按照本地视频的方法,调试找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 实验室设备网 版权所有 |