反編譯後顯示盜版,有可能在服務器端校驗,也有可能是本地校驗。
我以壓縮包形式打開apk,刪除簽名信息重新簽名,安裝好後打開,提示盜版。可以肯定這是簽名校驗。
用androidkiller打開,搜索signatures,找到獲取簽名的位置,在用jd-gui查看java代碼
public static String getAPPSecretString(Context paramContext)
{
String str1 = paramContext.getPackageName();
try
{
PackageInfo localPackageInfo = paramContext.getPackageManager().getPackageInfo(str1, 64);
String str2 = digest(localPackageInfo.signatures[0].toByteArray());
return str2;
}
catch (PackageManager.NameNotFoundException localNameNotFoundException)
{
localNameNotFoundException.printStackTrace();
}
return "";
}
digest函數只是對簽名信息做處理,我沒有關心它。
繼續查找哪裏調用了getAPPSecretString()
查看代碼
if (localHttpResponse.getStatusLine().getStatusCode() != 200)
{ break label649; }
發現這是服務器端校驗簽名
if (this.updateItem.getStatus() == 1103) {
this.mHandler.sendEmptyMessage(1000);
}
在handleMessage裏
if (paramAnonymousMessage.what == 1000)
{
BlackName.this.popKuangInfo();
return;
}
而這個popKuangInfo()提示 VerLog.v(“有侵權”);並且會調用一個AlertDialog,這個dialog正好與盜版提示吻合。
for (String str1 = "確定";; str1 = "下載")
{
str2 = "退出";
AlertDialog.Builder localBuilder = new AlertDialog.Builder(this.mContext);
localBuilder.setTitle(this.updateItem.getTitle());
localBuilder.setMessage(this.updateItem.getDescription());
localBuilder.setPositiveButton(str1, this.mWarnClick);
localBuilder.setNegativeButton(str2, this.mWarnClick);
localBuilder.setCancelable(false).show();
return;
}
由於只知道error返回1103會顯示盜版,所以我直接讓getStatus的返回值爲其他(1101)
.method public getStatus()I
.locals 2
.prologue
.line 23
iget v0, p0, Lcn/easymobi/checkversion/item/UpdateItem;->status:I
const/16 v1,0x44d
return v1
.end method
編譯過後,正常進入app,接下來就可以進行購買破解了