【安卓】拿注冊(cè)碼的兩種方式
文章僅用于學(xué)習(xí)交流,請(qǐng)勿利用文章中的技術(shù)對(duì)任何計(jì)算機(jī)系統(tǒng)進(jìn)行入侵操作。利用此文所提供的信息而造成的直接或間接后果和損失,均由使用者本人負(fù)責(zé)。
首發(fā)吾愛(ài):https://www.52pojie.cn/thread-1826802-1-1.html
言歸正傳,前段時(shí)間和朋友聊到某項(xiàng)功能,他說(shuō)他是之前買的一個(gè)手機(jī)設(shè)備,那個(gè)手機(jī)可以實(shí)現(xiàn)這個(gè)功能,我當(dāng)時(shí)就來(lái)了興致,做了底層修改這么牛?
后來(lái)拿來(lái)看了看,手機(jī)刷了第三方rom和Magisk,利用一個(gè)app實(shí)現(xiàn)了這個(gè)功能(雖然愛(ài)思助手就有這個(gè)功能),但是有現(xiàn)成的app就想著研究一番,結(jié)果好家伙要驗(yàn)證碼?于是就有了下文(在安卓逆向中屬于非?;A(chǔ)了)
微信公眾號(hào):小惜滲透,歡迎大佬一起交流進(jìn)步
1. java理邏輯
打開軟件,圖片如下
隨便填寫點(diǎn)信息,然后點(diǎn)確定
查一下有沒(méi)有殼
沒(méi)有殼,直接拖進(jìn)jadx,然后搜索關(guān)鍵字校驗(yàn)失敗
,發(fā)現(xiàn)兩處,并且都在一個(gè)類中,先看第一處如下圖所示,主要是有兩個(gè)判斷分支,首先我們要知道我們想要激活成功肯定是需要讓代碼不能走到else分支里
-
先看最外層
if
語(yǔ)句判斷了regCode
的長(zhǎng)度是否大于6,這個(gè)regCode
看出是從控件中獲得,也就是我們輸入的注冊(cè)碼,所以這里得到信息,我們的注冊(cè)碼長(zhǎng)度要大于6 -
緊接著看內(nèi)層的
//可以看出它new了一個(gè)Date也就是當(dāng)前的日期,然后判斷finalDate是否大于當(dāng)前的日期
//finalDate的值為aqnuzcxq.getFinalDate(date),這個(gè)date是我的當(dāng)初輸入的注冊(cè)碼字符串從下標(biāo)為6(也就是第七個(gè)數(shù))到最后的截?cái)?/span>
//所以接下來(lái)我們需要跟進(jìn),看下getFinalDate函數(shù)
if (finalDate.compareTo(new Date()) > 0)
為了注釋方便,我將看下getFinalDate函數(shù)直接粘貼到下方
public static Date getFinalDate(String num) {
//聲明一個(gè)calendar對(duì)象
Calendar c = Calendar.getInstance();
//設(shè)定其日期為2019/12/1
c.setTime(new Date("2019/12/1"));
//調(diào)用add函數(shù)增加日期,其中6代表增加數(shù)字代表的是天數(shù)(依據(jù)如下圖),增加的值為hexDecode(num),也就是對(duì)num進(jìn)行16進(jìn)制轉(zhuǎn)10進(jìn)制后得到的數(shù)字
c.add(6, hexDecode(num));
//返回日期
return c.getTime();
}
至此,整理得到邏輯,當(dāng)我們輸入注冊(cè)碼的時(shí)候,軟件會(huì)截取從第7個(gè)起到末尾的字符串,然后利用hexDecode函數(shù)對(duì)其解碼得到一個(gè)數(shù)字,計(jì)算2019年12月1日加上這個(gè)數(shù)字并到的新的日期,用這個(gè)新的日期去對(duì)比今天的日期,判斷是否過(guò)期。
hexDecode和hexEncode在代碼中都有,比如我這里想讓其增加9999天,那么解碼前的原字符串應(yīng)該為多少呢,我這里寫了個(gè)demo,字符串為38259
加完之后,日期是多少呢?2047年,可以夠用了,所以這里我們得出我們激活碼的第后半部分可以寫個(gè)38259
既然后半部分有了,就差前半部分了,前辦部分的邏輯如下
可以看到代碼正常走的話,又會(huì)觸發(fā)校驗(yàn)失敗
的提示,所以我們要讓其走到前面的if
分支即可,因?yàn)榍懊娴?code>if分支有return
關(guān)鍵字,我們看一下這個(gè)if
分支,它獲取了tvMachineCode
這個(gè)控件的值作為第一個(gè)參數(shù),這個(gè)控件為前面圖中的
機(jī)器碼字段,并調(diào)用getFingerPrint
函數(shù),將返回值于regCode進(jìn)行比對(duì)
regCode從前面的代碼中聲明了(在第一張代碼圖中),它是我們注冊(cè)碼的前6位
我們跟進(jìn)一下getFingerPrint函數(shù),如下很簡(jiǎn)單,它就是將傳入的兩個(gè)參數(shù)想加然后進(jìn)行md5
加密,然后獲取前6位,看上圖,第一個(gè)參數(shù)我們知道了是機(jī)器碼
,第二個(gè)參數(shù)是keyCode
接下來(lái)找這個(gè)keyCode,從下向上看,最后追溯到show
函數(shù)的第三個(gè)參數(shù),這里我們只需找到哪里調(diào)用了show函數(shù)即可,在show函數(shù)上按x
,找到調(diào)用
只找到一處調(diào)用,就是它了,看第三個(gè)參數(shù)123456(脫敏了)
ok,既然如此我們前6位字符串也知道了,將機(jī)器碼和123456拼接,然后進(jìn)行md5加密,然后取前6位,最后拼接上我們之前逆出來(lái)的38259得到的字符串拿去激活
2. 改smali代碼的判斷分支
打開dex,搜索校驗(yàn)失敗
,翻到第一個(gè)判斷分支如下,這里v7是6,應(yīng)該是判斷長(zhǎng)度大于6那個(gè)位置,if-le
表示a小于等于b則調(diào),所以我們默認(rèn)長(zhǎng)度大于6這里不跳,接著往下看下一個(gè)判斷分支出現(xiàn)
這里的if-gtz
表示如果v9大于0則跳,所以我們這里需要將其改成反過(guò)來(lái)小于等于0則跳,所以這里改成if-ltz
第一個(gè)判斷分支解決,繼續(xù)向下找第二個(gè),如圖這個(gè)位置正對(duì)代碼中的equals比較處,這里if-eqz
表示a等于0則跳,那我們改成a不等于0,也就是if-nez
然后胡亂輸入即可
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-683624.html
? 這種方法不推薦,因?yàn)槊看芜M(jìn)應(yīng)用會(huì)有檢驗(yàn)是否過(guò)期函數(shù),當(dāng)然也可以對(duì)這個(gè)函數(shù)進(jìn)行修改或置空,當(dāng)然還有其它方式例如用frida進(jìn)行hook,這里由于時(shí)間關(guān)系就不多做贅述了。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-683624.html
到了這里,關(guān)于【安卓】拿注冊(cè)碼的兩種方式的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!