㈠ JVM_位元組碼文件(ClassFile)詳解
我們知道 javac 命令可以將 .java 文件編譯成 .class 文件,而這個 Class 文件 中包含了 Java虛擬機 指令集、符號表以及若干其他輔助信息;最終將在 Java虛擬機 運行。
本文是以 JVM8 為例的。
每一個 Class文件 都有如下的 ClassFile 文件結構:
先簡單介紹一下 ClassFile 文件結構各部分含義:
描述符是表示欄位或方法類型的字元串。
欄位描述符表示類、實例或局部變數的類型。
從上面文法可以看出,欄位描述符中一共有三個類型:
方法描述符包含 0 個或者多個參數描述符以及一個返回值描述符。
看了描述符,可能大家有點疑惑,泛型信息怎麼表示啊?
常量池的通用格式如下:
目前 JVM8 中一共用 14 種常量類型,分別如下:
我們知道要使用一個欄位或者調用一個方法,就必須知道欄位或者方法所屬類符號引用,和欄位的名字和類型,方法的名字和方法參數類型以及方法返回值類型。
但是我們知道類是能繼承的,那麼子類調用父類的方法或者欄位,這里的所屬類符號引用,到底是子類本身還是父類的呢?
我們知道類,方法,欄位都有不同的訪問標志,在 Class 文件 中使用一個 u2 類型數據項來存儲,也就是最多可以有 16 個不同標志位。
在類,方法,欄位中有相同的標志,也有不同的標志,總體規劃,我們可以藉助 Modifier 類的源碼來了解:
在 Modifier 類中,類的訪問標志:
我們知道在 java 中類可以用的修飾符有: public , protected , private , abstract , static , final , strictfp 。
但是我們再看 Class 文件 中類的訪問標志:
仔細看,你會發現有些不同點:
在 Modifier 類中,欄位的訪問標志:
我們知道在 java 中欄位可以用的修飾符有: public , protected , private , static , final , transient 和 volatile 。
但是我們再看 Class 文件 中欄位的訪問標志:
Class 文件 中欄位的訪問標志和 java 中欄位的修飾符差不多,只是多了 ACC_SYNTHETIC 和 ACC_ENUM 兩個標志。
在 Modifier 類中,方法的訪問標志:
我們知道在 java 中方法可以用的修飾符有:
public , protected , private , abstract , static , final , synchronized , synchronized 和 strictfp 。
但是我們再看 Class 文件 中方法的訪問標志:
欄位詳情 field_info 的格式如下:
方法詳情 method_info 的格式如下:
關於 Class 文件 中屬性相關信息,我們再後面章節介紹。
我們可以通過 javap 的命令來閱讀 Class 文件 中相關信息。
這個是最簡單的一個類,沒有任何欄位和方法,只繼承 Object 類,我們來看看它編譯後的位元組碼信息,通過 javap -p -v T.class 的命令:
我們重點關注常量池相關信息,會發現雖然 T.class 很乾凈,但是也有 15 個常量,來我們依次分析:
與之前的例子相比較,多了一個欄位和方法,那麼得到的位元組碼信息如下:
但是你會發現常量池中怎麼沒有這個欄位 name 的 CONSTANT_Fieldref_info 類型的常量呢?
那是因為我們沒有使用這個欄位。
多寫了一個方法 test1 來調用 name 欄位和 test 方法,那麼得到的位元組碼信息如下:
這里定義一個父類 TParent ,有一個公共欄位 name 和方法 say 。子類
㈡ 安卓app應用製作好了 如何更改啊
一、製作好的 .apk 文件如果有源碼,可以在源碼中進行修改,修改完成後重新生成即可。
二、使用類似RE管理器之類的工具,但是如果存在以後兩種情況是改不了的。
1、APP非自身開發創建。
2、簽名已經生成,無修改簽名的許可權。
㈢ 什麼是位元組碼文件
位元組碼文件是經過編譯器預處理過的一種文件,是JAVA的執行文件存在形式,
Java源程序(.java)要先編譯成與平台無關的位元組碼文件(.class),然後位元組碼文件再解釋成機器碼運行。解釋是通過Java虛擬機來執行的。
它本身是二進制文件,但是不可以被系統直接執行,而是需要虛擬機解釋執行,由於被預處理過,所以比一般的解釋代碼要快,但是仍然會比系統直接執行的慢。
(3)app中如何修改位元組碼文件擴展閱讀:
在計算機中,數據只用0和1兩種表現形式,(這里只表示一個數據點,不是數字),一個0或者1佔一個「位」,而系統中規定8個位為一個位元組,用來表示常用的256個字母、符號、控制標記,其中用一個位來進行數據校驗,其他七個位用來記錄數據。
按計算機中的規定,一個英文的字元佔用一個位元組,(如,."':;avcAVC都佔用一個位元組),而一個漢字以及漢字的標點符號、字元都佔用兩個位元組,(如,。「」:;AVCavc他們就得佔用兩個位元組)。
另外,他們是沒有辦法比較的,只能將一個字元佔用一個位元組,N個字元佔用N個位元組。
K是千 M是兆 G是吉咖 T是太拉 8bit(位)=1Byte(位元組) 1024Byte(位元組)=1KB 1024KB=1MB 1024MB=1GB 1024GB=1TB 1024TB=PB 1024PB=1EB 1024EB=1ZB 1024ZB=1YB 1024YB=1BB。
目前最大的計量單位是1BB (Brontobyte)= 1024 YB=10^27。
㈣ Android APP加密方法都有哪些
偽加密是Android4.2.x系統發布前的Android加密方式之一,通過java代碼對APK(壓縮文件)進行偽加密,其修改原理是修改連續4位位元組標記為」P K 01 02」的後第5位位元組,奇數表示不加密偶數表示加密。
Android APP加密方法都有哪些?
雖然偽加密可以起到一定防破解作用,但也會出現問題,首先使用偽加密對其 Android APK加密後市場無法對其進行安全檢測,導致部分市場會拒絕這類APK上傳;其次,偽加密的加密方式和解密方式也早已公布導致它的安全程度也大大降低;再次,Android4.2.x系統無法安裝偽加密的APK;最後偽加密只是對APK做簡單保護,在java層源碼加殼保護、核心so庫、資源文件、主配文件、第三方架包方面卻沒有任何保護處理。Android APP加密方法都有哪些?
混淆保護
把原來有具體含義的類名,變數名,方法名,修改成讓人看不懂的名字,例如方法名getUserName編程了方法名。Android APP加密方法都有哪些?
混淆保護只是增加了代碼閱讀難度,對於破解基本上是沒有實質性作用的!Android APP加密方法都有哪些?
運行時驗證
運時驗證,主要是指在代碼啟動的時候本地獲取簽名信息然後對簽名信息進行檢驗來判斷自己的應用是否是正版,如果簽名信息不是正版則提示盜版或者直接崩潰。當然你可以把必要的數據放在伺服器端。Android APP加密方法都有哪些?破解:找到smali文件中,判斷是否相等的部分。改為常量true,即失效。
總之,反編譯一些apk之後,只要是java代碼寫的總會有smil文件。對於smil文件,如果耐心讀的話,還是可以查看到一些關鍵代碼的。
相較於應用來說,游戲apk因為採用cocos2d-x或者 unity3D,採用的是c++和c# 編寫的跨平台程序,在apk採用JNI的方式。所以沒有smali,可以防止靜態被破解apk包。Android APP加密方法都有哪些?
當然游戲包apk在運行的時候,會把.*so載入到內存中。動態也是可以在內存中抓取相應的數據。只不過NDK相對於smali破解來說,根部不是一個層級的關系。=
㈤ 如何修改apk游戲文件
修改的方法如下參考:
1.將需要修改的apk包復制到apktool路徑中。注意:您需要將文件名更改為123apk。