這里北大青鳥(niǎo)深圳嘉華學(xué)校要分享一點(diǎn)關(guān)于安卓開(kāi)發(fā)教程的技術(shù)內(nèi)容,防止apk反編譯的技術(shù)——完整性校驗(yàn)。
一、完整性校驗(yàn)原理
所謂完整性校驗(yàn)就是我們用各種算法來(lái)計(jì)算一個(gè)文件的完整性,防止這個(gè)文件被修改。其中常用的方法就是計(jì)算一個(gè)文件的CRC32的值或者計(jì)算一個(gè)文件的哈希值。我們?cè)诜乐筧pk被反編譯的方法中也可以采用這種方法。我們知道apk生成的classes.dex主要由java文件生成的,它是整個(gè)apk的邏輯實(shí)現(xiàn)。所以我們可以對(duì)classes.dex文件進(jìn)行完整性校驗(yàn),來(lái)保證整個(gè)程序的邏輯不被修改。如果我們想要保證整個(gè)apk文件的完整性,也可以對(duì)整個(gè)apk文件進(jìn)行完整性校驗(yàn)。下面我們分別來(lái)實(shí)現(xiàn)對(duì)classes.dex文件和apk文件的完整性校驗(yàn)。
二、用crc32對(duì)classes.dex文件的完整性進(jìn)行校驗(yàn)
(1)可以打印出來(lái)我們的apk生的classes.dex文件的crc32的值,代碼如下:
注意:R.string.classesdex_crc的值現(xiàn)在可以是個(gè)隨機(jī)數(shù)。
(2)運(yùn)行程序打印結(jié)果,我的apk程序的classes.dex的crc32的值為713769644
(3)將上面程序的classes.dex文件的crc32的值,保存在資源文件字符串中classesdex_crc中(當(dāng)然也可以保存在服務(wù)器上,然后通過(guò)網(wǎng)絡(luò)獲取校驗(yàn)),然后再運(yùn)行上面的apk程序,打印如下:
Dex hasn't beenmodified!
(4)這時(shí)我們?cè)谏厦娴拇a中隨便加一行或者一個(gè)空格,然后重新編譯運(yùn)行會(huì)看到我們的程序的crc32的值改變了。程序打印如下:
Dex has beenmodified!
三、用哈希值對(duì)整個(gè)apk完整性進(jìn)行校驗(yàn)
由于我們要對(duì)整個(gè)apk的完整性進(jìn)行校驗(yàn),所以我們的算出哈希值就不能存在資源文件中了因?yàn)閍pk中任何的改動(dòng)都會(huì)引起最終apk生成的哈希值的不同。
(1)首先實(shí)現(xiàn)apk中計(jì)算自身哈希值的代碼,如下:
(2)用linux下的sha1sum命令計(jì)算我們的apk的哈希值,命令如下:
sha1sum verification.apk
(3)將(2)中生成的哈希值存到服務(wù)器上,然后在我們的代碼中從服務(wù)器獲取進(jìn)行完整性比較。
上面我們用計(jì)算crc32和哈希值的方法分別對(duì)classes.dex文件和整個(gè)apk完整性進(jìn)行了校驗(yàn),當(dāng)然兩個(gè)校驗(yàn)方法也可以互換使用。好了,今天的內(nèi)容就先介紹到這,接下來(lái)我們還將分享其他的Android Apk 防止反編譯技術(shù)。