|
|
发表于
2024-12-19 23:30:47
来自手机
|
显示全部楼层
| 阅读模式
来自 贵州
本帖最后由 LsPro 于 2024-12-19 23:50 编辑 [/free]
本期音乐:
[free]
前情回顾
上期教程说了省流版
因为字数限制,没办法直接写完
那么这期详细教程就来了
查看上期教程 --------------------分割线--------------------https://b23.tv/xOYeiPs
详细教程
[hide]
通过前几位大佬提供的思路,我不断摸索,发现该套壳软件的广告都是“com.windmill”这个sdk有关
在浏览“com.windmill”我们发现“WMCustomRewardAdapter”,通过翻译看到“RewardAdapter”翻译为“奖励适配器”

而这类壳子的会员就是通过奖惩机制(看广告)发布的领取的,先打开这个类
首先我们要明确目的,是通过不看广告并领取奖励,那就需要从显示广告的方面下手
既然如此,我们发现其中的“showad”方法名是“abstract”,可以理解为:在Smali代码中“abstract”被定义为public抽象定义方法接口,需要在子类中调用或实现
但是我们不知道他被哪个子类所调用并实现,也就是说,我们直接更改这个方法名是没有用的,那我们就只能从其他方法下手

往下滑发现“showCustomAd”是“final”,可以理解为:在Smali代码中“abstract”被定义为public的“最终的”,并且不能被子类重写(覆盖)
那么很显然,这个方法名在当前类下修改是有效果的,因为我们并不知道如何修改,所以我们只能喂给ai分析
喂了几次代码和需求,终于被我喂出效果相似的结果了
- .method public final showCustomAd(Landroid/app/Activity;Landroid/view/ViewGroup;Lcom/windmill/sdk/d/a;)V
- .registers 6
- invoke-virtual {p0}, Lcom/windmill/sdk/custom/a;->c()Lcom/windmill/sdk/base/WMAdConnector;
- move-result-object v0
- iget-object v1, p0, Lcom/windmill/sdk/custom/a;->e:Lcom/windmill/sdk/d/a;
- invoke-interface {v0, p0, v1}, Lcom/windmill/sdk/base/WMAdConnector;->adapterDidLoadAdSuccessAd(Lcom/windmill/sdk/custom/a;Lcom/windmill/sdk/d/a;)V
- invoke-virtual {p0}, Lcom/windmill/sdk/custom/a;->c()Lcom/windmill/sdk/base/WMAdConnector;
- move-result-object v0
- iget-object v1, p0, Lcom/windmill/sdk/custom/a;->e:Lcom/windmill/sdk/d/a;
- invoke-interface {v0, p0, v1}, Lcom/windmill/sdk/base/WMAdConnector;->adapterDidPlayEndAd(Lcom/windmill/sdk/custom/a;Lcom/windmill/sdk/d/a;)V
- invoke-virtual {p0}, Lcom/windmill/sdk/custom/a;->c()Lcom/windmill/sdk/base/WMAdConnector;
- move-result-object v0
- iget-object v1, p0, Lcom/windmill/sdk/custom/a;->e:Lcom/windmill/sdk/d/a;
- const p1, 0x1
- invoke-interface {v0, p0, v1, p1}, Lcom/windmill/sdk/base/WMAdConnector;->adapterDidRewardAd(Lcom/windmill/sdk/custom/a;Lcom/windmill/sdk/d/a;Z)V
- invoke-virtual {p0}, Lcom/windmill/sdk/custom/a;->c()Lcom/windmill/sdk/base/WMAdConnector;
- move-result-object v0
- iget-object v1, p0, Lcom/windmill/sdk/custom/a;->e:Lcom/windmill/sdk/d/a;
- invoke-interface {v0, p0, v1}, Lcom/windmill/sdk/base/WMAdConnector;->adapterDidCloseAd(Lcom/windmill/sdk/custom/a;Lcom/windmill/sdk/d/a;)V
- const/4 v0, 0x1
- iput-boolean v0, p0, Lcom/windmill/sdk/custom/WMCustomRewardAdapter;->m:Z
- return-void
- .end method
复制代码
修改后去测试,成功了

但发现还是会弹开屏广告以及其他插屏广告
从图中我们可以看到有个类“WMCustomSplashAdapter”

既然上面的测试成功了,那么我们基本可以确定修改的是“com.windmill.sdk.custom”下的类
而“WMCustomSplashAdapter”正是“com.windmill.sdk.custom”下的类其中之一,并且翻译过来是“WM自定义飞溅适配器”,“Splash”这个单词想必各位在软件中很常见,一般都是开屏广告
所以,废话不多说,直接喂给ai (又是经过漫长的喂ai过程)
结果发现,他给我的一堆解释

(果然ai替代不了人类)
通过ai给的解释加以分析,我们得知“d”方法名在广告关闭时被调用,而“showCustomAd”与免广告基本一致,所以,我们只需要更改“d”和“showCustomAd”方法名
方法名:- com.windmill.sdk.custom.WMCustomSplashAdapter.d
复制代码
清空并将整个方法名替换为:
- .method public final d()V
- .registers 4
- iget-boolean v0, p0, Lcom/windmill/sdk/custom/WMCustomSplashAdapter;->n:Z
- if-nez v0, :cond_1b
- const/4 v0, 0x1
- iput-boolean v0, p0, Lcom/windmill/sdk/custom/WMCustomSplashAdapter;->o:Z
- invoke-virtual {p0}, Lcom/windmill/sdk/custom/a;->c()Lcom/windmill/sdk/base/WMAdConnector;
- move-result-object v0
- if-eqz v0, :cond_16
- invoke-virtual {p0}, Lcom/windmill/sdk/custom/a;->c()Lcom/windmill/sdk/base/WMAdConnector;
- move-result-object v0
- iget-object v2, p0, Lcom/windmill/sdk/custom/a;->e:Lcom/windmill/sdk/d/a;
- invoke-interface {v0, p0, v2}, Lcom/windmill/sdk/base/WMAdConnector;->adapterDidCloseAd(Lcom/windmill/sdk/custom/a;Lcom/windmill/sdk/d/a;)V
- :cond_16
- invoke-virtual {p0}, Lcom/windmill/sdk/custom/WMCustomSplashAdapter;->f()V
- iput-boolean v0, p0, Lcom/windmill/sdk/custom/WMCustomSplashAdapter;->n:Z
- :cond_1b
- return-void
- .end method
复制代码
--------------------

方法名:- com.windmill.sdk.custom.WMCustomSplashAdapter.showCustomAd
复制代码
清空并将整个方法名替换为:
- .method public final showCustomAd(Landroid/app/Activity;Landroid/view/ViewGroup;Lcom/windmill/sdk/d/a;)V
- .registers 6
- new-instance v0, Ljava/lang/StringBuilder;
- invoke-direct {v0}, Ljava/lang/StringBuilder;-><init>()V
- sget-object v1, Lcom/windmill/sdk/custom/WMCustomSplashAdapter;->q:Ljava/lang/String;
- invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
- const-string v1, "------------showCustomAd------------"
- invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
- invoke-virtual {p3}, Lcom/windmill/sdk/d/a;->F()Ljava/lang/String;
- move-result-object v1
- invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
- const-string v1, ":"
- invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
- invoke-virtual {p3}, Lcom/windmill/sdk/d/a;->J()Ljava/lang/String;
- move-result-object v1
- invoke-virtual {v0, v1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;
- invoke-virtual {v0}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;
- move-result-object v0
- invoke-static {v0}, Lcom/czhj/sdk/logger/SigmobLog;->i(Ljava/lang/String;)V
- const/4 v0, 0x1
- iput-boolean v0, p0, Lcom/windmill/sdk/custom/WMCustomSplashAdapter;->o:Z
- return-void
- .end method
复制代码
--------------------

好了,这样开屏广告就没了,但是还有插屏广告(广告真TM多)
不急,再分析
依旧是通过这个图

发现有非常多的“Adapter”
全看了一遍,发现“IWM”开头的全是“public abstract”,那我们可以确定,广告存在于“WM”开头的“Adapter”里
其中,有一个特别显眼“WMCustomAdapterProxy”,翻译为“WM自定义适配器代理”
代理?就决定是你了 ,打开来一看,有个“addInitListener”,翻译为“添加初始化监听”,看你不顺眼,给你清空了
结果发现进不去了,毁了
看来不能动“WMCustomAdapterProxy”,那还剩下
“WMCustomBannerAdapter”
“WMCustomInterstitialAdapter”
“WMCustomNativeAdapter”
依次点进去发现都有“showCustomAd”,思考ing....
有了 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
-
查看全部评分
总评分:好评 +3
金币 +3
|