導航:首頁 > 源碼編譯 > 位元組碼未被反編譯卻被注釋了

位元組碼未被反編譯卻被注釋了

發布時間:2023-01-31 03:07:12

㈠ 反編譯工具能反編譯出注釋嗎

編譯的時候注釋會變成一個空格.你能把空格反編譯成什麼?

java class文件反編譯中的注釋有什麼作用

注釋的內容是java位元組碼,注釋掉是為了防止IDE等工具報語法錯誤。
出現這個現象的原因是反編譯失敗了,也就是說反編譯不出該方法的源碼,為了不讓用戶誤認為這是個空方法,直接將位元組碼顯示出來是個好主意,但是直接將位元組碼顯示出來,IDE等工具是會報語法錯誤的,這時候以注釋的形式來表現我覺得是最好的方式。

㈢ 什麼是Java位元組碼

它是程序的一種低級表示,可以運行於Java虛擬機上。將程序抽象成位元組碼可以保證Java程序在各種設備上的運行
Java號稱是一門「一次編譯到處運行」的語言,從我們寫的java文件到通過編譯器編譯成java位元組碼文件(.class文件),這個過程是java編譯過程;而我們的java虛擬機執行的就是位元組碼文件。不論該位元組碼文件來自何方,由哪種編譯器編譯,甚至是手寫位元組碼文件,只要符合java虛擬機的規范,那麼它就能夠執行該位元組碼文件。

JAVA程序的運行

因為Java具有跨平台特性,為了實現這個特性Java執行在一台虛擬機上,這台虛擬機也就是JVM,Java通過JVM屏蔽了不同平台之間的差異,從而做到一次編譯到處執行。JVM位於Java編譯器和OS平台之間,Java編譯器只需面向JVM,生成JVM能理解的代碼,這個代碼即位元組碼,JVM再將位元組碼翻譯成真實機器所能理解的二進制機器碼。
位元組碼是怎麼產生的?

我們所編寫的程序都是.java格式,通常在執行的時候也許點擊一下eclipse的運行鍵就可以在控制台看到運行結果,但是也可以更酷一些,如果你裝了JDK,那就可以直接在以命令行的方式編譯運行你的.java文件,編譯後會形成.class文件,這個.class文件即位元組碼。
位元組碼怎麼解讀?

上圖是編譯好的位元組碼文件,即一堆16進制的位元組,如果使用IDE去打開,也許看到的是已經被反編譯的我們所熟悉的java代碼,但這才是純正的位元組碼

這里只介紹位元組碼由哪些部分組成, 具體的意思自行網路或者看文尾的連接, 有較為詳細的講解

上圖即位元組碼文件的組成部分, Class文件的結構不像XML等描述語言那樣鬆散自由。由於它沒有任何分隔符號,

所以,以上數據項無論是順序還是數量都是被嚴格限定的。哪個位元組代表什麼含義,長度是多少,先後順序如何,都不允許改變, 如上圖左側即每一部分規定的長度
魔數(Magic Number)

魔數是用來區分文件類型的一種標志,一般都是用文件的前幾個位元組來表示。
比如0XCAFE BABE表示的是class文件,那麼有人會問,文件類型可以通過文件名後綴來判斷啊?是的,但是文件名是可以修改的(包括後綴),那麼為了保證文件的安全性,將文件類型寫在文件內部來保證不被篡改。
至於為什麼是CAFE BABE估計大家也能猜到, 程序員與咖啡的不解之緣
版本號(Version)
版本號含主版本號和次版本號,都是各佔2個位元組。在此Demo種為0X0000 0033。其中前面的0000是次版本號,後面的0033是主版本號。通過進制轉換得到的是次版本號為0,主版本號為51。高版本的JDK能向下兼容以前版本的Class文件,但不能運行以後版本的Class文件,即使文件格式未發生任何變化. 這就是target參數的用處,可以在使用JDK 1.7編譯時指定-target 1.5
常量池(Constant Pool)
常量池是Class文件中的資源倉庫, 量池中主要存儲2大類常量:字面量和符號引用。字面量如文本字元串,java中聲明為final的常量值等等,而符號引用如類和介面的全局限定名,欄位的名稱和描述符,方法的名稱和描述符。常量池是一個表結構,在表的內容前有一個類型的計數器,表示常量池的長度
上面的表中描述了11中數據類型的結構,其實在jdk1.7之後又增加了3種(CONSTANT_MethodHandle_info,CONSTANT_MethodType_info以及CONSTANT_InvokeDynamic_info)。這樣算起來一共是14種
訪問標志(Access_Flag)
訪問標志信息包括該Class文件是類還是介面,是否被定義成public,是否是abstract,如果是類,是否被聲明成final。通過上面的源代碼,我們知道該文件是類並且是public。
0x 00 21:是0×0020和0×0001的並集。其中0×0020這個標志值涉及到位元組碼指令

類索引(This Class Name)
類索引用於確定類的全限定名
0×00 03 表示引用第3個常量,同時第3個常量引用第19個常量,查找得」com/demo/Demo」。#3.#19
父類索引(Super Class Name)
0×00 04 同理:#4.#20(java/lang/Object)
介面索引(Interfaces)
通過上邊位元組碼圖可以看到,這個介面有2+n個位元組,前兩個位元組表示的是介面數量,後面跟著就是介面的表。我們這個類沒有任何介面,所以應該是0000。果不其然,查找位元組碼文件得到的就是0000。
欄位表集合(fields)
欄位表用於描述類和介面中聲明的變數。這里的欄位包含了類級別變數以及實例變數,但是不包括方法內部聲明的局部變數。接下來就是2+n個欄位屬性。我們只有一個屬性a,所以應該是0001。查找文件果不其然是0001。
該區域含有欄位的訪問標志, 訪問許可權, 欄位的名稱索引, 欄位的描述符索引, 屬性表
描述符的作用就是用來描述欄位的數據類型、方法的參數列表和返回值。而屬性表就是為欄位表和方法表提供額外信息的表結構。對於欄位來說,此處如果將欄位聲明為一個static final msg = "aaa"的常量,則欄位後就會跟著一個屬性表,其中存在一項名為ConstantValue,指向常量池中的一個常量,值為的"aaa"。
方法(methods)
包含訪問標志表, 方法名索引 , 方法描述符索引, 屬性表數量,等
Attribute
0×0001 :同樣的,表示有1個Attributes了。
0x000f : #15(「SourceFile」)
0×0000 0002 attribute_length=2
0×0010 : sourcefile_index = #16(「Demo.java」)
SourceFile屬性用來記錄生成該Class文件的源碼文件名稱。

㈣ 如何有效的防止Java程序被反編譯和破解

由於Java位元組碼的抽象級別較高,因此它們較容易被反編譯。下面介紹了幾種常用的方法,用於保護Java位元組碼不被反編譯。通常,這些方法不能夠絕對防止程序被反編譯,而是加大反編譯的難度而已,因為這些方法都有自己的使用環境和弱點。
1.隔離Java程序
最簡單的方法就是讓用戶不能夠訪問到Java Class程序,這種方法是最根本的方法,具體實現有多種方式。例如,開發人員可以將關鍵的Java Class放在伺服器端,客戶端通過訪問伺服器的相關介面來獲得服務,而不是直接訪問Class文件。這樣黑客就沒有辦法反編譯Class文件。目前,通過介面提供服務的標准和協議也越來越多,例如 HTTP、Web Service、RPC等。但是有很多應用都不適合這種保護方式,例如對於單機運行的程序就無法隔離Java程序。
2.對Class文件進行加密
為了防止Class文件被直接反編譯,許多開發人員將一些關鍵的Class文件進行加密,例如對注冊碼、序列號管理相關的類等。在使用這些被加密的類之前,程序首先需要對這些類進行解密,而後再將這些類裝載到JVM當中。這些類的解密可以由硬體完成,也可以使用軟體完成。
在實現時,開發人員往往通過自定義ClassLoader類來完成加密類的裝載(注意由於安全性的原因,Applet不能夠支持自定義的ClassLoader)。自定義的ClassLoader首先找到加密的類,而後進行解密,最後將解密後的類裝載到JVM當中。在這種保護方式中,自定義的ClassLoader是非常關鍵的類。由於它本身不是被加密的,因此它可能成為黑客最先攻擊的目標。如果相關的解密密鑰和演算法被攻克,那麼被加密的類也很容易被解密。
3.轉換成本地代碼
將程序轉換成本地代碼也是一種防止反編譯的有效方法。因為本地代碼往往難以被反編譯。開發人員可以選擇將整個應用程序轉換成本地代碼,也可以選擇關鍵模塊轉換。如果僅僅轉換關鍵部分模塊,Java程序在使用這些模塊時,需要使用JNI技術進行調用。當然,在使用這種技術保護Java程序的同時,也犧牲了Java的跨平台特性。對於不同的平台,我們需要維護不同版本的本地代碼,這將加重軟體支持和維護的工作。不過對於一些關鍵的模塊,有時這種方案往往是必要的。為了保證這些本地代碼不被修改和替代,通常需要對這些代碼進行數字簽名。在使用這些本地代碼之前,往往需要對這些本地代碼進行認證,確保這些代碼沒有被黑客更改。如果簽名檢查通過,則調用相關JNI方法。
4.代碼混淆
代碼混淆是對Class文件進行重新組織和處理,使得處理後的代碼與處理前代碼完成相同的功能(語義)。但是混淆後的代碼很難被反編譯,即反編譯後得出的代碼是非常難懂、晦澀的,因此反編譯人員很難得出程序的真正語義。從理論上來說,黑客如果有足夠的時間,被混淆的代碼仍然可能被破解,甚至目前有些人正在研製反混淆的工具。但是從實際情況來看,由於混淆技術的多元化發展,混淆理論的成熟,經過混淆的Java代碼還是能夠很好地防止反編譯。下面我們會詳細介紹混淆技術,因為混淆是一種保護Java程序的重要技術。

㈤ 文件反編譯中的注釋有什麼作用

1.打開ILSpy軟體,點擊File , 打開,選擇所要反編譯的.exe文件,點擊確定。

2.選中要保存的反編譯項目名稱,點擊保存代碼。

5.注意,反編譯出來的dll,及窗體文件都是在每個文件夾下面的,且是每個dll對應一個,如下圖:

下面主要就反編譯中出現的一些錯誤做下說明:

A.對應上面的如果是dll反編譯出來的,如果是公司常用的dll,就可以直接把該項目中的文件夾刪除,然後把原有的dll添加引用即可;

B.在打開窗體設計時,多數情況下會出現以下錯誤:

雙擊錯誤即可跳轉到資源文件錯誤的代碼行中去,可以根據上面提示的行號進行查找,找到後注釋即可!

C.在處理完以上錯誤後,往窗體中添加控制項時可能會引發以下錯誤error CS1508:

解決方法:在解決方案資源管理器中找到對應的窗體如名為X,在這個窗體的附近會新生成一個X.resoures,選中,右鍵,從項目中排除,再編譯即可!如下圖:

㈥ C++中的注釋,如//和/* */的注釋內容,會參與編譯嗎即反編譯時會被看到嗎

這個建議在CSDN技術專區裡面找到答案。

(6)位元組碼未被反編譯卻被注釋了擴展閱讀:由硬體系統和軟體系統所組成,沒有安裝任何軟體的計算機稱為裸機。可分為超級計算機、工業控制計算機、網路計算機、個人計算機、嵌入式計算機五類,較先進的計算機有生物計算機、光子計算機、量子計算機等。計算機發明者約翰·馮·諾依曼。計算機是20世紀最先進的科學技術發明之一,對人類的生產活動和社會活動產生了極其重要的影響,並以強大的生命力飛速發展。它的應用領域從最初的軍事科研應用擴展到社會的各個領域。

㈦ 我反編譯了一個APK程序,裡面void run() 是被注釋的代碼

這是因為這個方法比較長的原因,一般是反編譯不出來的,這些你看到的是dalvik位元組碼,如果你研究過這種位元組碼,可以人為的去反編譯成java代碼,這些就是java代碼對應的dalvik位元組碼形式

㈧ 反編譯怎麼不能產生注釋

C++編譯器在編譯的時候 把無用的注釋跳過了
因為如果把這些信息帶上的話可執行代碼會變大

如果是java的話,反編譯了會有注釋的,因為java只是把源文件編譯成了位元組碼,同時注釋也編譯了,在運行的時候,會跳過注釋的

閱讀全文

與位元組碼未被反編譯卻被注釋了相關的資料

熱點內容
電腦上如何上小米雲伺服器地址 瀏覽:917
手機資料解壓密碼 瀏覽:442
44引腳貼片單片機有哪些 瀏覽:690
阿里程序員腦圖 瀏覽:189
廣東編程貓學習班 瀏覽:708
上海數控編程培訓學校 瀏覽:313
怎麼下載我的解壓神器 瀏覽:634
lib文件無用代碼會編譯嗎 瀏覽:28
我的世界嗨皮咳嗽伺服器怎麼下 瀏覽:1002
mvn命令順序 瀏覽:978
車貸還完多少時間解壓 瀏覽:964
java頁面開發 瀏覽:818
學編程的小發明 瀏覽:25
為什麼說程序員喜歡格子 瀏覽:253
代碼編譯後叫什麼 瀏覽:969
電腦文件夾做了保護怎麼刪除 瀏覽:678
php資料庫連接全局 瀏覽:528
葫蘆島有程序員嗎 瀏覽:986
小胖機器人顯示無命令 瀏覽:775
一日一畫pdf 瀏覽:99