02_反汇编_反编译
實(shí)際上安卓的應(yīng)用都是zip包,只不過(guò)把zip擴(kuò)展名修改了,修改成了APK.所以如果你想拿到它的圖片的話,實(shí)際上特別簡(jiǎn)單,你就把它這個(gè).apk換成.zip.換成.zip之后這里的圖片資源就都可以拿到了.
有些公司可能美工的水平或者美工的人數(shù)比較少,項(xiàng)目還比較急,這個(gè)時(shí)候就上網(wǎng)上去找。看誰(shuí)的比較好看。下載下來(lái)之后擴(kuò)展名換一換換成.zip就把它里面的資源就都拿出來(lái)了。這樣就減少了一些成本。所以說(shuō)這就是一個(gè)比較簡(jiǎn)單的辦法。
它大部分圖片都是放在hdpi。
用像素密度來(lái)區(qū)分不同的圖片的文件夾。
?x越多,代表當(dāng)前這個(gè)文件夾所對(duì)應(yīng)的圖片的分辨率、支持的像素密度就越高。
但是實(shí)際上大部分的應(yīng)用并不會(huì)把所有的圖片,每一個(gè)都搞出一份來(lái)丟到不同的目錄下。這是沒(méi)有人那么做的,因?yàn)槟阋敲锤愕脑捘愕膽?yīng)用的體積就會(huì)比較大了。它會(huì)根據(jù)不同的像素密度對(duì)這個(gè)圖片進(jìn)行壓縮或者放大,就是自動(dòng)去實(shí)現(xiàn)。大部分情況咱們只需要把這個(gè)東西丟在比較常見(jiàn)的像素密度的文件夾里,就是xhdpi或者是hdpi.這樣就可以了。因?yàn)楝F(xiàn)在像mdpi的手機(jī)基本上已經(jīng)絕跡了。ldpi和mdpi的手機(jī)特別特別少。所以咱們只需要把它放在hdpi和xhdpi.通過(guò)這種方式只能去拿到它的圖片資源,你像所有的XML文件咱們是看不到的。
早期的反編譯工具:
apktool是幫助把你的應(yīng)用進(jìn)行反編譯的。
反編譯之后咱們拿到的就是這兩個(gè)東西
反編譯之后再去看res/anim下相關(guān)的XML文件就沒(méi)有問(wèn)題了。
這樣咱們就只能看到XML和它的資源。但是咱們現(xiàn)在是看不到源代碼的。想看源代碼就要用另外一個(gè)工具dex2jar.安卓中所有的.class最終都會(huì)打包生成一個(gè)dex文件。dex文件通過(guò)dex2jar可以轉(zhuǎn)換成.jar.之前通過(guò).jar來(lái)查看java代碼就使用了一個(gè)工具叫JD-GUI.把.jar丟進(jìn)去,丟進(jìn)去之后就可以看到它對(duì)應(yīng)的java的源代碼了。
所以呢早期要通過(guò)三個(gè)工具:apktool、dex2jar、jd-gui這三個(gè)工具才可以把應(yīng)用進(jìn)行反編譯。但是現(xiàn)在安卓逆向助手就把這些東西打了個(gè)包,我們可以使用安卓逆向助手的圖形化界面進(jìn)行反編譯操作了,不用去記那些命令了。
?
?
?
?
java基礎(chǔ)講過(guò),java不管是方法名還是類(lèi)名都應(yīng)該是有意義的,不能隨便寫(xiě)。但是實(shí)際上在打包之前,它做了一件事情叫做混淆,混淆的作用就是迷惑你。提高了你把它代碼讀懂的難度。因?yàn)樗念?lèi)名都沒(méi)有意義。而且它的項(xiàng)目都比較大,有那么多個(gè)文件,都是a、b、c、d、e、f、g的。你想把它拆出來(lái)的話可能就比較費(fèi)工夫了。安卓其實(shí)也沒(méi)有特別復(fù)雜的一些邏輯,你有工夫猜它還不如自己寫(xiě)了。花功夫也是沒(méi)問(wèn)題的,也能猜個(gè)大概。但是真要花那么多時(shí)間去搞這個(gè)事的話還真不如自己寫(xiě)了。所以說(shuō)一般的應(yīng)用在上線之前都會(huì)去進(jìn)行一個(gè)混淆的操作。但是有一些小的應(yīng)用它也就懶得做這些事了,可能在混淆的過(guò)程當(dāng)中會(huì)出現(xiàn)一些問(wèn)題。比如你引入一些第三方的庫(kù),它這個(gè)庫(kù)實(shí)際上在放到你的項(xiàng)目里面已經(jīng)做了一次混淆了。做了混淆的話呢你再混淆它的時(shí)候就得加一些例外的情況。如果說(shuō)這個(gè)小公司有一些開(kāi)發(fā)的人懶得去搞這個(gè)事可能也就不混淆,拿著這個(gè)源代碼直接就傳上去了。所以你上市場(chǎng)上去找一些下載量不是很大的應(yīng)用,你去翻一翻,也會(huì)有一定的積累能直接拿到它的源代碼。
看一下這個(gè)java反編譯之后實(shí)際上我拿到的就是混淆之前的源碼。實(shí)際上我拿到的就是java的源代碼.只不過(guò)呢它在打包之前做了一次混淆,雖說(shuō)通過(guò)混淆可以去提高這個(gè)代碼被破譯的難度,但是呢真的去做的話實(shí)際上有一些邏輯還是可以看出來(lái)的。比如一些數(shù)據(jù)結(jié)構(gòu),例如HashMap
private int a = 0;private int b = 0;private int c = 0;private int d = 0;private HashMap e = new HashMap();還有一些是Map.Entry
Map.Entry localEntry = (Map.Entry)localIterator1.next();這些你真的是花點(diǎn)功夫的話,相對(duì)還是比較容易給它還原成最開(kāi)始的樣子。如果是沒(méi)進(jìn)行混淆的,例如之前寫(xiě)的ip撥號(hào)器.
?
如果你沒(méi)做混淆的話基本上就相當(dāng)于把你的源代碼就丟到市場(chǎng)上了。正常來(lái)講咱們發(fā)布之前都要對(duì)它進(jìn)行混淆。關(guān)于混淆這部分的內(nèi)容以后在就業(yè)之前還會(huì)有幾天的課程。關(guān)于加密、打包、還有混淆相關(guān)的內(nèi)容。現(xiàn)在咱們只需要搞清楚你反編譯之后能拿到一個(gè)什么樣的代碼這樣就可以了。
所以說(shuō)如果你不做混淆這個(gè)java代碼基本上就是相當(dāng)于你把它丟到市場(chǎng)上去了。如果你不混淆的話,差不多就相當(dāng)于你把這個(gè)源碼就直接發(fā)到市場(chǎng)上了。你辛辛苦苦敲的這些東西別人一眼就可以看到。很簡(jiǎn)單,點(diǎn)一點(diǎn)就可以拿到它。
這個(gè)就是java的反編譯的過(guò)程。
C的相對(duì)來(lái)講就更安全一些。 有一個(gè)對(duì)C進(jìn)行反匯編的工具。
?
?
?
這就是匯編的代碼。PUSH就是壓到寄存器里面。PUSH壓到棧里。MOVS在寄存器里給它挪一挪。這個(gè)都是在ARM下的匯編的代碼。如果你不懂匯編那就看不懂了。所以這個(gè)就相對(duì)來(lái)講要比java要安全一些。
現(xiàn)在這個(gè)工具也有通過(guò)匯編給猜出C的功能。按F5
Pseudcode-A:偽代碼-A.這就能通過(guò)匯編猜出它的偽代碼出來(lái).雖說(shuō)它猜出了C的偽代碼,但是實(shí)際上咱們寫(xiě)的跟這個(gè)還是差距蠻大的。專(zhuān)門(mén)做JNI的逆向的,可以自己去先寫(xiě),寫(xiě)完之后他拿著自己的代碼去進(jìn)行反匯編。反匯編之后看一看這個(gè)東西長(zhǎng)成什么樣。
一看什么helloFromJava是方法名,()V是方法簽名.也可以去猜你是要C回調(diào)Java.
所以說(shuō)呢你說(shuō)哪一種方式特別特別的安全,這個(gè)沒(méi)有太特別安全的。只要被高水平的黑客盯上的話,被破解就是時(shí)間的問(wèn)題。但是呢你要這么搞的話相對(duì)來(lái)講這個(gè)安全性會(huì)高許多,比java的代碼要高許多。所以一般都要把跟錢(qián)相關(guān)的,或者說(shuō)像銀行這樣的應(yīng)用,去跟動(dòng)物相關(guān)的加密的這些業(yè)務(wù)邏輯,都要放在C這邊去處理。而且C的代碼它也可以去混淆。你也可以給它起一些很惡心的名字。也可以給代碼里面加一些垃圾代碼。所以說(shuō)呢通過(guò)C來(lái)去做跟安全相關(guān)的這些業(yè)務(wù)邏輯,它是比java要安全很多。
這個(gè)就是java和C之間的反編譯和反匯編的對(duì)比。實(shí)際上java的這個(gè)反編譯直接就拿到了之前寫(xiě)的源碼,或者說(shuō)是混淆之后的源代碼。但是C的這個(gè).so文件對(duì)它進(jìn)行反匯編你即使猜一下它的偽代碼看起來(lái)呢也不是太靠譜。所以C的.so要比java的.dex或者是.jar或者是.class要安全許多。
轉(zhuǎn)載于:https://www.cnblogs.com/ZHONGZHENHUA/p/7148633.html
總結(jié)
以上是生活随笔為你收集整理的02_反汇编_反编译的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 二手书城开发步骤
- 下一篇: js 根据固定位置获取经纬度--腾讯地图