有的時(shí)候,我們想分析一個(gè)程序的java層邏輯,進(jìn)行反編譯后,發(fā)現(xiàn)代碼所有的函數(shù)名、變量名、類(lèi)名等都成了一些雜亂無(wú)章的名字,沒(méi)有任何規(guī)律可言,這是怎么回事呢?其實(shí)程序是被混淆了。
混淆是什么?
混淆是通過(guò)一些工具,對(duì)函數(shù)名、變量名、類(lèi)名、字段進(jìn)行批量重命名。
混淆的例子以及作用
例子:
先來(lái)看一下沒(méi)有被混淆的例子:這是我們自己寫(xiě)的程序,反編譯:

發(fā)現(xiàn)邏輯很清楚,反編譯之后的源碼和我們寫(xiě)的代碼完全一樣,我們寫(xiě)的應(yīng)用就是一只被宰的羊,誰(shuí)都可以咬一口。
代碼保護(hù)的第一步就是混淆,就是對(duì)代碼動(dòng)下手腳,讓反編譯出來(lái)的代碼不這么容易看懂。
打開(kāi)andoridkiller工具,以X右為例子

打開(kāi)一個(gè)smail文件夾:

發(fā)現(xiàn)里面都變成了這種:這種只是初級(jí)的混淆,還有一些可能混淆成外文的。
正常的開(kāi)發(fā)中是不會(huì)有這種命名的

隨便點(diǎn)進(jìn)去看一個(gè),雖然有影響的,但是影響不大。

需要借助一個(gè)工具:jdax-gui;
看一下這工具能把我們的代碼還原成什么程序:

我們可以借助一些工具達(dá)到簡(jiǎn)單的混淆的目的,點(diǎn)擊這個(gè)

圖標(biāo),它會(huì)把我們的代碼重新混淆。

重新打開(kāi),這里會(huì)對(duì)我們的代碼重新反編譯并且重命名,可以方便我們來(lái)區(qū)分。

混淆無(wú)非就是增加我們的逆向時(shí)間,放到j(luò)dax-gui里面是為了好看一些,但是整體的邏輯是不會(huì)混淆的。
也就說(shuō),代碼混淆并不能一勞永逸的解決代碼保護(hù)的問(wèn)題,只是把讀代碼的時(shí)間變得比開(kāi)發(fā)代碼的時(shí)間還要長(zhǎng),當(dāng)然,有些核心代碼最好不要放在Java中,有一些非常有毅力的人,還是愿意花這個(gè)時(shí)間的。
ProGuard介紹以及混淆特點(diǎn)
(1)ProGuard會(huì)檢測(cè)和移除封裝中未使用的類(lèi)、字段、方法和屬性,包括自帶代碼庫(kù)中未使用的項(xiàng)。
(2)ProGuard還可以優(yōu)化字節(jié)碼,移除未使用到的代碼指令,以及用短名稱混淆其余的類(lèi)、字段和方法。
本文由網(wǎng)上采集發(fā)布,不代表我們立場(chǎng),轉(zhuǎn)載聯(lián)系作者并注明出處:http://m.zmlzfb.cn/shbk/48702.html