首页
社区
课程
招聘
[原创]小广告清除初试小记之逆向强爆篇
发表于: 2013-8-29 23:04 9383

[原创]小广告清除初试小记之逆向强爆篇

2013-8-29 23:04
9383
本人最近了解了会关于APP中广告嵌入的方式,并决定通过对一个小程序广告的消除来小试牛刀,于是找到了这个WirelessDataCable.apk,并作此帖作为总结。
APP通常通过调用第三方SDK来实现广告功能,通过逆向的方式清除小广告与APK破解还是有些类似的,需要我们对dalvik字节码有所了解并结合常用的调试技术与调试工具完成。

经过这次小试牛刀,使用逆向的方法清除广告主要有以下几个关键点:
1.运行程序观察程序行为
2.确定广告入口点(Method profiling等动态调试技术)
3.清除广告入口并完善后续功能


1.运行程序观察程序行为
安装APK开始程序的体验,首先加载程序后程序有提示检测wifi状态,随后发现在主activity中开始出现一个view,不断滚动广告,这个就是需要清除的地方了。由于这个广告是view并且是活动可控的,因此猜测可能会通过findviewbyid获取句柄,并创建一个activity来管理广告生命周期。猜测终归猜测,接下来开始动手分析。
 

2.确定广告入口点(Method profiling等动态调试技术)
有了刚才大致的猜测,接下来就需要认真的分析了,还是一样老步骤,用VTS加载APK,发现该APK不存在so,相对来分析会比较简单了。但是静态分析还是茫茫的一片,还是混淆过的,于是采用动态分析,使用DDMS附带的Method profiling。确定大概的广告开始入口。
根据刚才的思路,在主activity展现后,出现了广告view。因此从WirelessDataCableActivity的onCreate函数开始分析:看到了一个com/google/ads/AdView.a函数
 
该函数对应有如下关系:
 
由以上Method profiling生成的结果,我们大致可以明白程序的运行过程,以及我们需要分析的大致范围,我们的目标就是分析这几个AdView类的功能,开始代码的分析:
.method public onCreate(Landroid/os/Bundle;)V  
……
#对应于广告view的ID
const v0, 0x7f090010
invoke-virtual {p0, v0}, Lcom/flyfish/WirelessDataCable/WirelessDataCableActivity;->findViewById(I)Landroid/view/View;
move-result-object v0
check-cast v0, Lcom/google/ads/AdView;
new-instance v1, Lcom/google/ads/c;
invoke-direct {v1}, Lcom/google/ads/c;-><init>()V
#广告入口
invoke-virtual {v0, v1}, Lcom/google/ads/AdView;->a(Lcom/google/ads/c;)V
……
.end method

如上代码注释已经找到广告入口,不妨顺便往下走会,进入广告入口分析:
 

继续查看Lcom/google/ads/u;->a(Lcom/google/ads/c;)V

.
method public final declared-synchronized a(Lcom/google/ads/c;)V
    .locals 8
   ……
#看到了adActvity类,有点接近猜测的过程了
invoke-static {}, Lcom/google/ads/AdActivity;->c()Z
  move-result v1
if-eqz v1, :cond_2
……
#前面主要是广告加载情况判断 
:cond_2
:try_start_2
    invoke-virtual {p0}, Lcom/google/ads/u;->d()Landroid/app/Activity;
    move-result-object v1
    #可以看出cond_3是展示广告的分支
if-nez v1, :cond_3
    const-string v0, "activity is null while trying to load an ad."
    invoke-static {v0}, Lcom/google/ads/util/b;->e(Ljava/lang/String;)V
    goto :goto_0
    #广告开始展示
    :cond_3
#获取应用上下文
    invoke-virtual {v1}, Landroid/app/Activity;->getApplicationContext()Landroid/content/Context;
    move-result-object v2
    invoke-static {v2}, Lcom/google/ads/util/AdUtil;->c(Landroid/content/Context;)Z
    move-result v2
    if-eqz v2, :cond_0
    invoke-virtual {v1}, Landroid/app/Activity;->getApplicationContext()Landroid/content/Context;
    move-result-object v2
#处理相应配置文件
    invoke-static {v2}, Lcom/google/ads/util/AdUtil;->b(Landroid/content/Context;)Z
    move-result v2
    if-eqz v2, :cond_0
    iget-object v2, p0, Lcom/google/ads/u;->p:Landroid/content/SharedPreferences;
    const-string v3, "GoogleAdMobDoritosLife"
    const-wide/32 v4, 0xea60
    invoke-interface {v2, v3, v4, v5}, Landroid/content/SharedPreferences;->getLong(Ljava/lang/String;J)J
    move-result-wide v2
    invoke-virtual {v1}, Landroid/app/Activity;->getApplicationContext()Landroid/content/Context;
    move-result-object v4
    invoke-static {v4}, Landroid/preference/PreferenceManager;->getDefaultSharedPreferences(Landroid/content/Context;)Landroid/content/SharedPreferences;
    move-result-object v4
    invoke-static {v1}, Lcom/google/ads/i;->a(Landroid/content/Context;)Z
    move-result v5
……
#创建线程,开启功能
     new-instance v0, Ljava/lang/Thread;
    new-instance v2, Lcom/google/ads/ar;
    invoke-direct {v2, v1}, Lcom/google/ads/ar;-><init>(Landroid/app/Activity;)V
    invoke-direct {v0, v2}, Ljava/lang/Thread;-><init>(Ljava/lang/Runnable;)V
    invoke-virtual {v0}, Ljava/lang/Thread;->start()V
   ……
.end method


大致过程,剩下就不在继续深入了,回到上头找到了入口,我这里采用的是注释掉,使得程序不不执行广告。

# invoke-virtual {v0, v1}, Lcom/google/ads/AdView;->a(Lcom/google/ads/c;)V

3.清除广告入口并完善后续功能
重打包运行,查看有什么需要完善的:
 
出现了如上图红色的字眼,在各个代码中搜索,最后定为到了
AdView. a(Landroid/content/Context;Lcom/google/ads/f;Landroid/util/AttributeSet;)Z

#检查广告是否创造成功
.method private a(Landroid/content/Context;Lcom/google/ads/f;Landroid/util/AttributeSet;)Z
    .locals 1
    invoke-static {p1}, Lcom/google/ads/util/AdUtil;->c(Landroid/content/Context;)Z
    move-result v0
    #增加的语句,使得检测结果总是成功
    const/4 v0, 0x1
    if-nez v0, :cond_0
    #移除广告入口函数后,AdView将显示错误信息
    const-string v0, "You must have AdActivity declared in AndroidManifest.xml with configChanges."
    invoke-direct {p0, p1, v0, p2, p3}, Lcom/google/ads/AdView;->a(Landroid/content/Context;Ljava/lang/String;Lcom/google/ads/f;Landroid/util/AttributeSet;)V
    const/4 v0, 0x0
    :goto_0
    return v0
    :cond_0
    const/4 v0, 0x1
    goto :goto_0
.end method

增加const/4 v0,0x1,是的检测广告运行时成功即可。
由于在模拟器上测试,没有wifi功能:
 
至此,此次简单小清除广告就到一段落,由于对其采用逆向分析,难度不大。通过这次小记,旨在体验逆向清除广告的作用,如有错误的地方,请打大家指正。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 219
活跃值: (848)
能力值: (RANK:290 )
在线值:
发帖
回帖
粉丝
2
thanks~
2013-8-29 23:07
0
雪    币: 1661
活跃值: (1315)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
虽然没有完全明白,但是好像很厉害的样子。。。
2013-8-30 00:30
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好像很厉害的样子
2013-8-30 07:38
0
雪    币: 158
活跃值: (196)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Method profiling 楼主,讲一下这个吧
2013-8-30 09:30
0
雪    币: 1380
活跃值: (1626)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
学习一下思路,看来smaili语法非常之重要啊,是不可回避的一部分。得好好熟悉一下
2013-8-30 10:09
0
雪    币: 182
活跃值: (188)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
7
这个就是能查看目标进程调用了什么方法。每一个方法中可以查看谁调用的和调用了哪些函数。想看activity创建的时候做了什么行为,可以通过从oncreate进行查看,调用关系都比较明了
2013-8-30 11:37
0
雪    币: 108
活跃值: (49)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
8
第二幅图是什么工具的截图?求名字,有用法更好
2013-8-30 16:05
0
雪    币: 182
活跃值: (188)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
9
DDMS有带的Method profiling。虫子的书有一章动态分析有介绍。查看函数调用的
2013-8-30 16:45
0
雪    币: 108
活跃值: (49)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
10
才发现是翔哥,哈哈
2013-9-5 21:24
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
mark
2013-9-16 17:26
0
雪    币: 15
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
这种小动作做多了也没啥意思,照楼主这水平,尝试将整个sdk剥离程序怎么样~~~

楼主有兴趣研究研究,给我们学习~~~

最后呢,还是感谢楼主发文学习
2013-9-17 16:23
0
雪    币: 206
活跃值: (32)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
深受启发,感谢楼主分享
2013-9-22 15:38
0
游客
登录 | 注册 方可回帖
返回
//