在玩的一款P2P理財APP,每天每個帳號有1.5的紅包,那如果有多個賬戶就得不斷的切換,很是麻煩。
於是想是否可以搞個多開器玩玩?
說做就做.....
搬出ApkTool神器,試了下,解壓,打包沒有防護,頓時信心大增。
但是在安裝運行時,有簽名驗證保護。
經過分析驗證是在.so中進行的,它會將簽名等信息上傳到服務器上進行驗證。
由於現在是在linux上,就沒有截取逆向後的圖片了。
但從下面的二進制數據中也能依稀看到是從java層傳了一個context到jni中,然後jni通過它得到
PackageManager,再得到signatures,最後上傳到服務器驗證的。
如何破?
保護流程搞清楚了,那就只需要獲取到正版的context並把它傳給下面的JNI,就好了.........
也就是用到createPackageContext()這個函數而已。
開始代碼實現:
下面是獲取正版APP Context的smail代碼:
.class public Lcom/example/testpm/PackageUtil;
.super Ljava/lang/Object;
.source "PackageUtil.java"
# direct methods
.method public constructor <init>()V
.locals 0
.prologue
.line 6
invoke-direct {p0}, Ljava/lang/Object;-><init>()V
return-void
.end method
.method public static getWXContext(Landroid/content/Context;)Landroid/content/Context;
.locals 5
.param p0, "context" # Landroid/content/Context;
.prologue
.line 8
const/4 v1, 0x0
.line 10
.local v1, "wxcontext":Landroid/content/Context;
:try_start_0
invoke-virtual {p0}, Landroid/content/Context;->getApplicationContext()Landroid/content/Context;
move-result-object v2
const-string v3, "com.ncf.firstp2p"
const/4 v4, 0x3
invoke-virtual {v2, v3, v4}, Landroid/content/Context;->createPackageContext(Ljava/lang/String;I)Landroid/content/Context;
:try_end_0
.catch Landroid/content/pm/PackageManager$NameNotFoundException; {:try_start_0 .. :try_end_0} :catch_0
move-result-object v1
.line 15
:goto_0
return-object v1
.line 12
:catch_0
move-exception v0
.line 13
.local v0, "e":Landroid/content/pm/PackageManager$NameNotFoundException;
invoke-virtual {v0}, Landroid/content/pm/PackageManager$NameNotFoundException;->printStackTrace()V
goto :goto_0
.end method
然後在調用JNI的地方添加下面兩端替換掉原來的context:
invoke-static {p0}, Lcom/example/testpm/PackageUtil;->getWXContext(Landroid/content/Context;)Landroid/content/Context;
move-result-object p0
修改完成後重新打包驗證,一切OK。