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