新手小白抖*逆向学习探索(去广告)
1、apk基础信息
2、软件分析
分析1.开始软件会有一个选择线路的过程,紧接着开屏广告5s倒计时(多次实验一直5s)一直到显示进入,点击进入就可以进到程序主界面。
方案1.既然5s是固定的,那后台肯定会有个5s这样子的一个变量,将他修改为0s,不就完成。
方案2.点击“进入”才能启动页面,如果在广告启动的程序中直接插入点击后的function代码,也可以达到直接进入主界面跳过广告。
3、开干!
3.1先验证下有没有签名的问题?小白弄不了各种签名骚操作,别改完代码,最后有签名校验,那就白弄了。
3.1.1先用mt,重新签名。发现软件可以正常运行。
3.1.2用mtactive记录器定位开屏广告所在的active类。
软件在加载后会有一个选择路线的类:com.niming.weipa.widget.u
然后是开屏广告类:com.niming.weipa.ui.splash.SplashActivity
为了去掉广告,这次将对SplashActivity进行手术改造。
3.1.3 为了方便操作,使用jadex进行反编译代码分析,在mt进行修改,生成打包。
3.1.4 通过读秒,找到关键程序Y1,开始逐句分析,看不懂没事有GPT
public final void Y1(final AdBean adBean, SystemInfoBean systemInfoBean) {
//i2获得了资源ID窗口
int i2 = com.niming.weipa.R.id.iv_ADImg;
//设置了i2为资源的动画,设置为渐入效果
ObjectAnimator fadeOut = ObjectAnimator.ofFloat((ImageView) g1(i2), "alpha", androidx.core.widget.e.G0, 1.0f);
//检查对象是否为空,防止报错,无关紧要
Intrinsics.checkNotNullExpressionValue(fadeOut, "ofFloat(iv_ADImg, \"alpha\", 0f, 1f)");
//设置动画持续时间为1秒
fadeOut.setDuration(1000L);
//开始动画
fadeOut.start();
//将广告图片加载入上面的动画中
com.niming.framework.image.a.l(this).s(adBean.content).I().u1((ImageView) g1(i2));
//设置点击监听
((ImageView) g1(i2)).setOnClickListener(new View.OnClickListener() {
//设置点击触发函数
public final void onClick(View view) {
SplashActivity.Z1(SplashActivity.this, adBean, view);
}
});
//获得广告时长
int i3 = com.niming.weipa.R.id.tv_adTime;
//设置窗口可见
((TextView) g1(i3)).setVisibility(0);
//将广告时长和“秒”两个字符串合在一起,放到窗口
((TextView) g1(i3)).setText(Intrinsics.stringPlus(systemInfoBean.ad_show_time, " 秒"));
//设置点击监听
((TextView) g1(i3)).setOnClickListener(new View.OnClickListener() {
//设置点击事件
public final void onClick(View view) {
SplashActivity.U1(SplashActivity.this, view);
}
});
3.1.5 根据上面的代码,能够知道关键代码就是,直接删除对应的smali,然后重新编译打包安装。
//开始动画
fadeOut.start();
//将广告图片加载入上面的动画中
com.niming.framework.image.a.l(this).s(adBean.content).I().u1((ImageView) g1(i2));
根据长得像原则,以下smali代码就是对应的这两句,删除-编译-打包-安装。
3.1.6运行后发现,广告已经没了,但是还是要倒计时。接下来用方案2,自动跳转,来解决这个问题
((TextView) g1(i3)).setText(Intrinsics.stringPlus(systemInfoBean.ad_show_time, " 秒"));
//设置点击监听
((TextView) g1(i3)).setOnClickListener(new View.OnClickListener() {
//设置点击事件
public final void onClick(View view) {
SplashActivity.U1(SplashActivity.this, view);
}
});
分析上述代码,这个倒计数是可以点击的,我们跟踪下U1函数。
public static /* synthetic */ void U1(SplashActivity splashActivity, View view) {
a2(splashActivity, view);
}
发现U1就是个皮包商,怎么拿的,怎么送出去,这里有大大可以说下,这就是代码混淆么?接下来继续跟踪到a2
public static final void a2(SplashActivity this$0, View it) {
Intrinsics.checkNotNullParameter(this$0, "this$0");
if (TextUtils.equals(((TextView) this$0.g1(com.niming.weipa.R.id.tv_adTime)).getText().toString(), "进入")) {
this$0.Q1();
}
}
这下就很清楚了,倒计时的点击了以后,先是判断显示的是不是“进入两个字”,如果是就执行 Q1函数;在跟踪一次。
public final void Q1() {
h1(this.o1);
P1();
}
真相大白了,Q1里面的这两个就是跳转到程序,那就把程这两行直接插进主程序。(java幻想展示),请教大佬有没有能够直接修改java,不用修改smali的工具。
public final void Y1(final AdBean adBean, SystemInfoBean systemInfoBean) {
............
//获得广告时长
int i3 = com.niming.weipa.R.id.tv_adTime;
//设置窗口可见
((TextView) g1(i3)).setVisibility(0);
//将广告时长和“秒”两个字符串合在一起,放到窗口
((TextView) g1(i3)).setText(Intrinsics.stringPlus(systemInfoBean.ad_show_time, " 秒"));
//设置点击监听
((TextView) g1(i3)).setOnClickListener(new View.OnClickListener() {
//设置点击事件
public final void onClick(View view) {
SplashActivity.U1(SplashActivity.this, view);
}
//插入代码到监听的外侧
h1(this.o1);
P1();
.........
});
锁定smali,把这段东西插到主函数Y1里(一定把line 什么的删除)通过setonclick就可以定位到应该插到哪里,有的兄弟可能会疑问,问什么插到这里,因为要顺着作者的逻辑,设置了监听以后,才有可能点击,为的就是免点击直接触发跳过。有兴趣朋友可以试下,如果放到设置监听前,程序就会崩溃。
3.1.7 保存修改-反编译-签名-打包-安装
通过以上步骤完美跳过广告,
4、下一阶段!去除内部广告
5、环境及工具
5.1 jadex
5.2 MT管理器
5.3 Pixel5(root)手机一台
5.4 Anlink手机投屏工具