前言:
坛友们,年轻就是资本,和我一起逆天改命吧,我的学习过程全部记录及学习资源:https://www.52pojie.cn/thread-2006536-1-1.html
立帖为证!--------记录学习的点点滴滴
0x1 恭喜你获得广告&弹窗静默卡
1.开始第三关,点击后,出现等一个等待XX秒的弹窗。

2.点开np管理器左上角菜单,打开activity记录功能,似乎一直崩溃,那就用开发助手的记录功能,看到com.zj.wuaipojie.ui.AdActivity,长按复制。

3.再去np管理器,查看dex文件,搜索这个类,进去后点右上角三个点,将它转为java代码。
public final class AdActivity extends AppCompatActivity {
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
setContentView(2131427363);
loadAd();
}
private final void jump() {
startActivity(new Intent((Context) this, ChallengeThird.class));
finish();
}
private final void loadAd() {
new Handler().postDelayed(new ExternalSyntheticLambda0(this), 3000);
}
private static final void m0loadAd$lambda-0(AdActivity adActivity) {
adActivity.jump();
}
}
4.再结合这个表,可以看到先执行loadAd函数,然后等待3秒钟,然后执行新建一个new ExternalSyntheticLambda0类,执行jump函数,在jump函数里面跳转到ChallengeThird.class,再通过startActivity切换页面。
函数名称 |
描述 |
onCreate() |
一个Activity启动后第一个被调用的函数,常用来在此方法中进行Activity的一些初始化操作。例如创建View,绑定数据,注册监听,加载参数等。 |
onStart() |
当Activity显示在屏幕上时,此方法被调用但此时还无法进行与用户的交互操作。 |
onResume() |
这个方法在onStart()之后调用,也就是在Activity准备好与用户进行交互的时候调用,此时的Activity一定位于Activity栈顶,处于运行状态。 |
onPause() |
这个方法是在系统准备去启动或者恢复另外一个Activity的时候调用,通常在这个方法中执行一些释放资源的方法,以及保存一些关键数据。 |
onStop() |
这个方法是在Activity完全不可见的时候调用的。 |
onDestroy() |
这个方法在Activity销毁之前调用,之后Activity的状态为销毁状态。 |
onRestart() |
当Activity从停止stop状态恢进入start状态时调用状态。 |
5.那么最微小的改动就是不破坏程序流程,将等待时间减少,返回到Smali代码,搜索bb8可以看到这个代码,改成0x1,然后退出保存,重新安装apk。
const-wide/16 v2, 0xbb8 //对应10进制3000
invoke-virtual {v0, v1, v2, v3}, Landroid/os/Handler;->postDelayed(Ljava/lang/Runnable;J)Z
6.点击第三关,可以看到快速到了一号广告。

7.打开算法助手,勾选需要hook的应用,单击进去,勾选弹窗定位,然后发现算法助手提示模块未激活。

8.才发现前面安装算法助手的时候,没有勾选系统框架,安装的时候顶部有一个提示Xposed模块尚未激活,点进去启用模块,勾选要hook的应用,然后点齿轮图标设置,再重复第7步,就可以进入横幅广告了。

9.也可以通过算法助手的关键词屏蔽弹窗,多个关键词用英文逗号分隔。
10.我们再去日志查看,可以看到dialog弹窗,一号弹窗和二号弹窗信息,点进去可以看到调用堆栈信息,第一个是Xposed模块,第三个调用了onCreate函数。
返回结果类型:void
返回结果值:void
调用堆栈:
at de.robv.android.xposed.XposedBridge$AdditionalHookInfo.callback(Unknown Source:147)
at LSPHooker_.show(Unknown Source:8)
at com.zj.wuaipojie.ui.ChallengeThird.onCreate(ChallengeThird.kt:53)

11.使用np管理器打开dex文件,搜索这个函数,类型选择方法名。

12.show函数就是弹窗代码,搜索一下show函数,找到两个调用,前面加个#号,给他注释掉。
.line 38
invoke-virtual {p1}, Landroidx/appcompat/app/AlertDialog$Builder;->show()Landroidx/appcompat/app/AlertDialog;
.line 53
invoke-virtual {p1}, Lcom/zj/wuaipojie/util/CommonDialog;->show()V
13.我们再打开开发助手,点击布局查看,再点击放大镜就出现框框了,点击横幅的框框,可以看到一个ad image的控件点进去,有一个view id,长按复制后面的数值0x7f0801ca。

14.再np管理器打开apk包,右上角xml搜索,搜索类型:资源id,找到xml文件进去在搜索,发现搜索不到,往下拉看到了ad image,没看到0x7f0801ca,我们可以点右上角关闭id转名称就可以。
<ImageView
android:id="@id/third_ad_image"
android:background="@mipmap/third_ad"
android:layout_width="wrap_content"
android:layout_height="150.0dip"
android:layout_marginTop="100.0dip"/>

15.我们把高度和宽度全部改为0,就从视觉上感受不到横幅广告了,还可以在上面的布局代码里面添加下面一句代码,就是从代码层面不显示了。
android:visibility="gone"
0x2 作业
1.安装作业apk观察一下,可以看到一个明显的弹窗。

2.通过开发助手-布局查看,定位弹窗ID,0x102000b,再去np管理器搜索,进来后搜索102000b,定位到目标,添加一句不显示弹窗的代码,然后重新安装发现还是有弹窗。

3.然后用算法助手屏蔽弹窗,似乎还是去不掉,换成开发助手记录一下:com.zj.wuaipojie.ui.MainActivity,通过命令dumpsys activity activities命令也是这个,进去代码也看不懂,看不到相关字符串,搜索一下搜到了相关信息转为java代码。
public class ֏ {
public static void m0(Activity activity) {
Builder builder = new Builder(activity);
builder.setTitle("提示");
builder.setMessage("定位这个弹窗并去除哦");
builder.setPositiveButton("前往论坛", null);
builder.setCancelable("false".equals("true"));
builder.show();
}
public static void m1(Activity activity) {
Builder builder = new Builder(activity);
builder.setTitle("提示");
builder.setMessage("定位这个弹窗并去除哦");
builder.setPositiveButton("前往论坛", new 1(activity, ""));
builder.setCancelable("false".equals("true"));
builder.show();
}
public static void m2(Activity activity) {
Builder builder = new Builder(activity);
builder.setTitle("提示");
builder.setMessage("定位这个弹窗并去除哦");
builder.setPositiveButton("前往论坛", new 1(activity, "https://www.52pojie.cn/"));
builder.setCancelable("false".equals("true"));
builder.show();
}
4.可以看到里面有三个show方法,说明弹窗就在这里了,通过java代码可以看到是三个静态函数,不管调用哪个都必须通过类名实现,搜索一下这个类,定位到调用处,只有一处,那么把它注释掉看看,成功。
.method protected onCreate(Landroid/os/Bundle;)V
.registers 9
invoke-static/range {p0 .. p0}, Lnp/֏;->ށ(Landroid/app/Activity;)V
5.还原apk,这次不改调用处,通过定位字符串的方法定位到这个类,直接把三个show注释掉看看。
invoke-virtual {v0}, Landroid/app/AlertDialog$Builder;->show()Landroid/app/AlertDialog;
invoke-virtual {v0}, Landroid/app/AlertDialog$Builder;->show()Landroid/app/AlertDialog;
invoke-virtual {v0}, Landroid/app/AlertDialog$Builder;->show()Landroid/app/AlertDialog;
6.通过改函数内部和函数调用处都可以成功去掉弹窗。

0x3 参考文档
1.《安卓逆向这档事》四、恭喜你获得广告&弹窗静默卡