在上一篇文章“手游apk破解及GooglePlay正版去驗(yàn)證經(jīng)驗(yàn)分享 ”中愧薛,遺留了一個(gè)問題:添加了代碼混淆的游戲如何處理排作?最近剛剛寫完這部分腳本厕氨,在此總結(jié)一下:
添加混淆的游戲咐熙,反編譯后代碼類名和方發(fā)名基本不可讀,負(fù)責(zé)正版驗(yàn)證部分的SDK會(huì)變成如下的樣子:
但代碼混淆并不能混淆字符串(這也是為什么要用加殼工具询刹、字符串編碼了)谜嫉,于是抱著希望耐著性子一個(gè)個(gè)點(diǎn)開終于找到唯一一個(gè)帶有字符串(也是唯一能看懂)的方法:
居然是對(duì)驗(yàn)證成功與否的常量定義!可謂一線生機(jī)凹联。由代碼可以看出這個(gè)類p中定義了3個(gè)常量a, b, c分別代表
LICENSED
, NOT_LICENSED
和RETRY
沐兰。接下來的工作似乎變得簡單了,只要找到引用了LICENSED
的地方蔽挠,那里應(yīng)該有一些條件來判斷驗(yàn)證結(jié)果為LICENSED
還是NOT_LICENSED
住闯,修改條件邏輯,讓其全部進(jìn)入LICENSED
的條件塊中即可澳淑。然而搜索一遍后發(fā)現(xiàn)2個(gè)地方引用了
LICENSED
:
- 如下圖比原,類似之前的推理邏輯,此函數(shù)判斷變量v0是否與
Lcom/android/vending/licensing/p;->a
(即LICENSED
)相同杠巡,從而返回true或false量窘,只要強(qiáng)行修改返回值就行,很方便的辦法:在return v0
之前插入將v0設(shè)為true的語句const/4 v0, 0x1
即可
- 如下圖所示氢拥,類
Lcom/android/vending/licensing/n
的函數(shù)a()僅僅返回了LICENSED
這個(gè)引用:
還好這也只是讓搜索變得稍復(fù)雜點(diǎn)蚌铜,只需再找到對(duì)這個(gè)函數(shù)的引用,將相應(yīng)的條件塊進(jìn)行修改即可嫩海。注意冬殃,搜索函數(shù)引用時(shí)記得查看是否為實(shí)現(xiàn)的接口函數(shù)。例如這里的函數(shù)a()就是對(duì)接口Lcom/android/vending/licensing/a
的實(shí)現(xiàn)出革。因此需要同時(shí)搜索兩個(gè)函數(shù)引用:
Lcom/android/vending/licensing/n;->a() //事實(shí)證明并不能搜到這條語句的引用
和
Lcom/android/vending/licensing/a;->a()
搜索結(jié)果只有一條造壮,在某個(gè)類中幾百行的函數(shù)中引用了Lcom/android/vending/licensing/a;->a()
:
代碼中在cond_9的條件塊中判斷了p2是否為0,然后跳入不同條件塊骂束,只需將是否為0的判斷注釋掉:
#if-nez p2, :cond_a
再在函數(shù)開始時(shí)便直接跳入cond_9(如下圖)耳璧,于是這個(gè)函數(shù)必然會(huì)跳入驗(yàn)證結(jié)果為LICENSED
的語句。
注意:這里的goto語句需要寫在變量聲明之后展箱,否則后面的代碼用到未經(jīng)聲明的變量會(huì)報(bào)錯(cuò)Verify Error旨枯。
最后,打包混驰、重簽名攀隔、安裝、運(yùn)行栖榨,GP上付費(fèi)購買的游戲也可以在其他手機(jī)上完美運(yùn)行啦(包括無Google Play框架手機(jī))昆汹! : )
此外,以上邏輯可以很方便的寫成腳本婴栽,全部是文本查找與替換满粗,無非是遍歷次數(shù)略多,不過作為工具腳本愚争,也不必花時(shí)間去優(yōu)化其運(yùn)行效率了映皆。