導航:首頁 > 編程語言 > 抽象語法樹java

抽象語法樹java

發布時間:2022-09-18 08:37:11

⑴ 求教如何使用java編寫加殼程序

這個問題就需要來談談殼的架構問題了。
殼的三大架構
1.最早的殼幾乎都是virus演化來的,大部分都是匯編直接寫的。
好處就是直接可以把匯編代碼復制出來當作殼的loader代碼添加(感染)到程序上
知名的比如aspack,upx,telock,PESpin
2.隨著對於反調試要求越來越高,功能越來越多,代碼一多就難以維護。
於是誕生了新的殼架構,功能採用DLL開發,使用loader來載入
這里有兩個變種:
ShellCode Loader + DLL ASProtect。Themida,ACProtect等等你所熟悉的加密殼絕大部分都是這樣的架構
memory loader + DLL bigfoot為代表的bambam,ZProtect,eXPressor,npack,ChinaProtect等等
這種架構簡單,好維護,更好調試。其實許多其他殼或多或少的都使用這兩種架構
3.對於一些純VM的保護殼,由於沒有固定代碼(VMProtect等)
所以對於這樣的需求首先你需要一個codegen(這個東東將陪伴你寫殼的一生)
而且對於codegen其實完全可以構造一個完整的殼代碼(調試比較麻煩)
不管什麼語言開發的加殼軟體最終都要回到opcode操作上,而對於opcode其實用神馬語言都差不多
這三種架構介紹完了。那麼談談java寫殼的問題吧
其實可以簡單的從語言優勢上來解答:
如果說開發第三種殼用啥其實都差不多,Java和C#說不定更有優勢。
上面我們說到codegen的問題,真正不適合開發的地方其實主要是在各種地址轉換上面,
反匯編引擎反匯編的都是opcode結構,然後再將這些opcode串聯起來構造出AST,省下的就是mutation,vm,還是其他等等操作了,
如果單純為了解決opcode--->AST(Abstract Syntax Tree抽象語法樹)解決了地址轉換這個問題的話其實匯編,C\C++還是Java都差不多。
反而由於Java和C#這些語言有很好的容器可以更好的來控制對象
opcode生成其實也不是難事,這些用Java還是C++其實都差不多。
真正的難點就在於上面所說的殼Loader的開發上,不管是匯編,C\C++,Delphi(不管在國內外特別是國外其實許多殼都是Delphi開發的)
都可以直接開發DLL,直接拿來變形後塞進原始程序當作殼的Loader Main部分。
而Java就只能從codegen來構造殼代碼了。。。
這是一件很痛苦的事情(相信我~如果你用過Java寫過c語言編譯器-帶連接器的那種你就會明白痛苦了)
綜上所述~介於樓主的語言選擇問題,估計多數是只會Java,或者需要在web層調用。
那麼最好的辦法還是殼主體ASM,C\C++來開發,然後開發成命令行版本,然後Java調用這個模塊。
架構就這樣了,剩下的就是動手操作了

⑵ 用eclipse 編寫JAVA代碼時,他為什麼能自動識別語法錯誤及給出正確的寫法這是JAVA編譯器的哪種特性

這是靠eclipse自帶的插件實現的,的確屬於靜態分析。動態分析我不太了解,可能會涉及到jvm,但主要是在編譯器內獲取一些動態信息,如果想對java的多態進行分析就需要動態分析,即在編譯時獲取具體調用的類的信息。但如果是問eclipse的語法糾錯,遠沒涉及那麼高級的內容。
如果你去看eclipse文件夾下的plugins文件夾,你能找到類似org.eclipse.jdt.XXX.XXX的若干jar文件,那些包就是eclipse專門用以處理java代碼分析工作的jdt插件工具包。他能抽取java代碼的AST(抽象語法樹),也就是編譯時用到的數據結構,你若學過編譯原理就知道了,反正我還沒學。如果做一些java方面的逆向工程,你甚至可以引用eclipse的jdt包,將java項目的代碼通過相應介面(你可以在網上找到jdt的api和實例代碼)傳進去,獲取代碼中的類,欄位,方法,和更細節的信息。
而jdt中也包含檢測,處理語法錯誤的包,可以發現並糾正語法錯誤。這一特點還可以用來做一些正向工程(如自修改或動生成代碼)。
哦,還有,針對你的問題還要說,這點特性不是編譯器的,而是編輯器eclipse的。注意,絕對是編輯器的特點!雖然涉及到語法問題,但在eclipse糾錯時,還沒有調用編輯器,即程序還沒有編輯。只有在運行程序前eclipse才會調用編輯器。編譯一次不容易,每次糾錯都調用編譯器的話開銷太大,糾錯的反應速度絕對不會像平時eclipse做的那麼快。
實際上eclipse可以說就是由各種插件組成的,它本身只提供一個供各種插件運行的平台,本身功能很簡單,但就是通過向jdt這樣的插件包實現各種復雜的功能。

⑶ java方法中變數用final修飾對性能有影響!你覺得呢

在java中使用final修飾類型(包括類和介面)或類的成員與修飾方法中的普通變數從JVM的角度上看是不一樣的!鑒於你談論的是用其修飾方法中普通變數的形式,故簡單說一下這方面的東東。

是否使用final修飾方法中普通變數對JVM來說沒有區別!使用final修飾方法中普通變數主要是為了給Java前端編譯器(如javac)看的!也就是說方法中被final修飾的普通變數在前端編譯時被javac檢查並保證該變數不會在作用域內被改變新值,但被編譯成位元組碼後用於修飾方法中普通變數的final就已經不存在了!說的再具體點就是你用或不用final修飾方法中普通變數而生成的位元組碼文件(.class文件)沒有區別(建議你用某種Class文件編輯器查看一下)!!! 當然在編譯過程中會掃描final關鍵字並對其生成詞法單元(Token),同時生成的抽象語法樹(AST)在未優化之前也是有區別的。
故如你所說的「普通方法中變數用final修飾的,方法結束後jvm是不會回收這個變數的,也就不會釋放內存!」這個要看該變數的作用域(比如是否發生常見的方法或線程逃逸等情況)以及是否賦值為字面量(比如字元串字面量"XXX"在載入時會被拘留(intern)在運行時常量池中,而不會在方法結束後下次GC時被回收,但這與final修飾無關!) 等特殊情況,但其是否被回收與是否僅被final修飾無關!!

至於用final修飾類型(包括類和介面)或類的成員從JVM角度考慮就和上面的很不一樣了,比如你談到的被final修飾的方法,雖然從虛擬機規范層面上講也使用invokevirtual位元組碼調用,但其實它已經屬於非虛方法,在JVM的角度上完全可以(當然還要看具體JVM如何實現)用指向目標方法對象的指針來作為解析的結果(直接引用),而不用再通過虛方法表進行每次執行時的動態分派過程,從而提高運行效率。再比如你談到的內聯,就我所知不用final修飾的方法在運行時只要JVM判斷其滿足一定條件(比如常見的HotSpot虛擬機對「熱點」方法的判斷)時也會根據具體情況進行內聯(守護內聯機制或內聯緩存機制)這種基礎優化機制,這方面就不多說了。(有些跑題了,呵呵)

最後想說的就是不推薦僅為了有可能提高的一點執行效率而盡可能多的使用或者濫用final(同樣也適用於static等關鍵字),首先提升程序執行效率應該更多的從演算法復雜度、業務流程合理性、軟體架構合理性以及後期運行時環境調優上著手,而僅從某種語法內部運行機制上打主意意義不大!當然《Effective Java》中還是給出了不少關於使用java方面有意義的指引。其次不同的JVM產品或相同JVM產品不同版本或相同版本不同JVM配置參數都可能對同一語法機制在內部有不同的運行策略,很有可能原本希望提升執行效率的手段在某種運行時環境下卻成了瓶頸。再者就算不考慮代碼的可讀性和可維護性,但在注釋時又如何去說明僅為了提升性能而用的final或其他關鍵字呢?(當然可以忽視掉對它們的注釋,我想這也是造成樓主提問的原因。)

羅嗦了一大堆,也不知是否是你想談論的,希望對彼此有幫助吧。
個人看法,屬於原創,僅供參考,水平有限,錯誤難免,接受指正,謝謝。

⑷ 期貨PMD值是怎麼意思

參照網路解釋
PMD是一種開源分析Java代碼錯誤的工具。與其他分析工具不同的是,PMD通過靜態分析獲知代碼錯誤。也就是說,在不運行Java程序的情況下報告錯誤。PMD附帶了許多可以直接使用的規則,利用這些規則可以找出Java源程序的許多問題。此外,用戶還可以自己定義規則,檢查Java代碼是否符合某些特定的編碼規范。
PMD的核心是JavaCC解析器生成器。PMD結合運用JavaCC和EBNF(擴展巴科斯-諾爾範式,Extended Backus-Naur Formal)語法,再加上JJTree,把Java源代碼解析成抽象語法樹(AST,Abstract Syntax Tree)。
PMD是一款採用BSD協議發布的Java程序代碼檢查工具。該工具可以做到檢查Java代碼中是否含有未使用的變數、是否含有空的抓取塊、是否含有不必要的對象等。該軟體功能強大,掃描效率高
在期貨中應該是一種個人所設置的或者編程的一個期貨指標,或者就是
偏振模色散指單模光纖中偏振色散,簡稱PMD(=Polarization Mode Dispersion),是由光纖橫截面微小的不對稱性引起的色散。這種不對稱性引起兩個相互垂直的基本偏振模以不同的速度傳播。由於經歷了色散,即脈沖擴展,當接收器接收到這個合成的脈沖時要比發送端的脈沖寬。
起因於實際的單模光纖中基模含有兩個相互垂直的偏振模,沿光纖傳播過程中,由於光纖難免受到外部的作用,如溫度和壓力等因素變化或擾動,使得兩模式發生耦合,並且它們的傳播速度也不盡相同,從而導致光脈沖展寬,展寬量也不確定,便相當於隨機的色散。隨著傳輸速率的提高,該色散對通信系統的影響愈來愈明,而且越來越不可低估。有文獻給出由PMD限制的系統最大距離按公式:L最大值=1000/(PMD.比特率)2,式中:L單位為(根號)km,PMD單位為PS/KM,以及比特率單位為Gb/s。國際上一些標准組織,如IEC、TIA和ITU考慮制定這種隨機性色散的統計特性和相應的測試方法。

⑸ java問題,動態修改java類裡面的一個方法

//創建文件輸出流
PrintStream ps=new PrintStream("./log.txt");
//設置新的輸出流 System.setErr(ps);

System類的out、err、in成員變數都是final類型的,不能直接復制,要通過setOut()、setErr(),setIn()方法來改變流。上例是通過setOut()方法改變輸入流輸入位置,將輸出重定向到一個固定的目錄,實現程序日誌
e.printstacktrace 默認用的就是System的輸出

⑹ 如何使用php-parser生成抽象語法樹

其明顯例Eclipse CDTparser
完全用Java實現手寫遞歸降parser能C或C++源碼parseAST供Eclipse CDTIDE功能使用支持C99語(包括GCC擴展)、C++語(我沒仔細看現支持版本)等
並用於實際編譯(跟Eclipse JDTEclipse Compiler for Java同);實際編譯交給諸GCC、xlc類編譯器完
關於Eclipse CDTC與C++ parser介紹請參考

⑺ 請問有工具可以直接將java源程序代碼變成抽象語法樹嗎

好像沒有 至少我沒見過

⑻ 用Java怎麼解析C/C++代碼生成AST抽象語法樹結構

其中一個明顯的例子是Eclipse CDT里的parser。
它是完全用Java實現的,手寫的遞歸下降parser,能把C或C++源碼parse成AST供Eclipse CDT的IDE功能使用。它支持C99語法(包括GCC擴展)、C++語法(我沒仔細看現在支持到什麼版本了)等。
它並不用於實際的編譯(這跟Eclipse JDT里的Eclipse Compiler for Java不同);實際編譯還是交給諸如GCC、xlc之類的編譯器去完成。
關於Eclipse CDT里的C與C++ parser的介紹,請參考

⑼ Java 虛擬機一樣的速度甚至出現AOT編譯方式嗎

不論是物理機還是虛擬機,大部分的程序代碼從開始編譯到最終轉化成物理機的目標代碼或虛擬機能執行的指令集之前,都會按照如下圖所示的各個步驟進行:

⑽ JDT的JDT

(java development tooling)是Eclipse提供的一組API。其功能引用其官方文檔上的說法:
Programmatically manipulate Java resources, such as creating projects, generating Java source code, performing builds, or detecting problems in code. Programmatically launch a Java program from the platform. Provide a new type of VM launcher to support a new family of Java runtimes. Add new functions and extensions to the Java IDE itself. 總之,提供了一系列強大的API供我們操作Java代碼。
JDT實際上是將Java代碼構建成一個基於DOM結構的抽象語法樹AST(Abstract Syntax Tree )。代碼中的每個部分都對應一個ASTNode,許多的ASTNode就構成了這個抽象的語法樹。Java Class一般對應Compilation Unit node,該節點也是AST樹上的頂點。創建一個AST如下:
java 代碼
ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setSource(.toCharArray()); CompilationUnit unit = (CompilationUnit) parser.createAST(null); unit.recordModifications(); AST ast = unit.getAST();
其中createAST,當parse需要較長時間時,可以採用createAST(new NullProgressMonitor()),否則直接傳null即可。
recordModifications()用於記錄節點的變動,比如修改、刪除等,當需要對AST樹進行變動操作時,必須要預先調用這個方法。
比較重要的是:一個AST樹上的所有節點必須都屬於該AST。不允許直接將其他AST樹上的節點添加該AST樹上。否則會拋出java.lang.IllegalArgumentException異常。須使用ASTNode.Subtree(AST target, ASTNode node)返回一個目標樹的深度拷貝,才能進行添加操作。例如: java 代碼ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setSource(.toCharArray()); CompilationUnit targetRoot= (CompilationUnit) parser.createAST(null); targetRoot.recordModifications(); parser.setSource(class T{}」.toCharArray()); CompilationUnit srcRoot= (CompilationUnit) parser.createAST(null); //這是非法操作,兩者的AST源不一樣 targetRoot.types().add(srcRoot.types().get(0)); //這是合法操作 targetRoot.types().add(ASTNode.Subtree( targetRoot.getAST(), (ASTNode) srcRoot.types().get(0))); //這是合法操作 targetRoot.types().add(targetRoot.getAST().newTypeDeclaration());

閱讀全文

與抽象語法樹java相關的資料

熱點內容
壓縮因子定義 瀏覽:966
cd命令進不了c盤怎麼辦 瀏覽:212
葯業公司招程序員嗎 瀏覽:972
毛選pdf 瀏覽:659
linuxexecl函數 瀏覽:727
程序員異地戀結果 瀏覽:374
剖切的命令 瀏覽:228
干什麼可以賺錢開我的世界伺服器 瀏覽:290
php備案號 瀏覽:990
php視頻水印 瀏覽:167
怎麼追程序員的女生 瀏覽:487
空調外壓縮機電容 瀏覽:79
怎麼將安卓變成win 瀏覽:459
手機文件管理在哪兒新建文件夾 瀏覽:724
加密ts視頻怎麼合並 瀏覽:775
php如何寫app介面 瀏覽:804
宇宙的琴弦pdf 瀏覽:396
js項目提成計算器程序員 瀏覽:944
pdf光子 瀏覽:834
自拍軟體文件夾名稱大全 瀏覽:328