小廣告清除初試小記

本人最近了解了會關於APP中廣告嵌入的方式,並決定通過對一個小程序廣告的消除來小試牛刀,於是找到了這個WirelessDataCable.apk,並作此帖作爲總結。
APP通常通過調用第三方SDK來實現廣告功能,通過逆向的方式清除小廣告與APK破解還是有些類似的,需要我們對dalvik字節碼有所瞭解並結合常用的調試技術與調試工具完成。

經過這次小試牛刀,使用逆向的方法清除廣告主要有以下幾個關鍵點:
1.運行程序觀察程序行爲
2.確定廣告入口點(Method profiling等動態調試技術)
3.清除廣告入口並完善後續功能

1.運行程序觀察程序行爲
安裝APK開始程序的體驗,首先加載程序後程序有提示檢測wifi狀態,隨後發現在主activity中開始出現一個view,不斷滾動廣告,這個就是需要清除的地方了。由於這個廣告是view並且是活動可控的,因此猜測可能會通過findviewbyid獲取句柄,並創建一個activity來管理廣告生命週期。猜測終歸猜測,接下來開始動手分析。
名稱:  最初的樣子.jpg查看次數: 1文件大小:  48.2 KB 

2.確定廣告入口點(Method profiling等動態調試技術)
有了剛纔大致的猜測,接下來就需要認真的分析了,還是一樣老步驟,用VTS加載APK,發現該APK不存在so,相對來分析會比較簡單了。但是靜態分析還是茫茫的一片,還是混淆過的,於是採用動態分析,使用DDMS附帶的Method profiling。確定大概的廣告開始入口。
根據剛纔的思路,在主activity展現後,出現了廣告view。因此從WirelessDataCableActivity的onCreate函數開始分析:看到了一個com/google/ads/AdView.a函數
 點擊圖片以查看大圖圖片名稱: oncreate.jpg查看次數: 5文件大小: 122.8 KB文件 ID : 82189
該函數對應有如下關係:
 點擊圖片以查看大圖圖片名稱: adView.a.jpg查看次數: 3文件大小: 29.8 KB文件 ID : 82190
由以上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
如上代碼註釋已經找到廣告入口,不妨順便往下走會,進入廣告入口分析:
 點擊圖片以查看大圖圖片名稱: adview入口繼續.jpg查看次數: 6文件大小: 45.5 KB文件 ID : 82193

繼續查看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.清除廣告入口並完善後續功能
重打包運行,查看有什麼需要完善的:
 名稱:  差點.jpg查看次數: 2文件大小:  50.5 KB
出現瞭如上圖紅色的字眼,在各個代碼中搜索,最後定爲到了
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功能:
 名稱:  最後最後.jpg查看次數: 1文件大小:  51.9 KB
至此,此次簡單小清除廣告就到一段落,由於對其採用逆向分析,難度不大。通過這次小記,旨在體驗逆向清除廣告的作用,如有錯誤的地方,請打大家指正。 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章