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
由於在模擬器上測試,沒有wifi功能:
至此,此次簡單小清除廣告就到一段落,由於對其採用逆向分析,難度不大。通過這次小記,旨在體驗逆向清除廣告的作用,如有錯誤的地方,請打大家指正。