javaast生成代碼 java 生成代碼

如何使用ANTLR4創建AST

ANTLR 是一個 Java 實現的詞法/語法分析生成程序,目前最新版本為 4.5.2,支持 Java,C#,JavaScript 等語言,這里我們用 ANTLR 4.5.2 來實現一個自己的腳本語言。

公司主營業務:成都做網站、網站建設、移動網站開發等業務。幫助企業客戶真正實現互聯網宣傳,提高企業的競爭能力。創新互聯公司是一支青春激揚、勤奮敬業、活力青春激揚、勤奮敬業、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業文化,感謝他們對我們的高要求,感謝他們從不同領域給我們帶來的挑戰,讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。創新互聯公司推出古田免費做網站回饋大家。

因為某些未知原因,ANTLR 官方的文檔似乎有些地方和 4.5.2 版的實際情況不太吻合,所以,有些部分,我們必須多方查找和自己實踐得到,所幸 ANTLR 的文檔比較豐富,其在 Github 上例子程序也很多,足夠我們探索的了。

如果你沒有編譯原理的基礎,只要寫過正則表達式,應該也能很快理解其規則,進而編寫自己的規則文件,事實上,因為結構更清晰, ANTLR 的規則文件,比正則表達式要簡單得多。

求教如何使用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調用這個模塊。

架構就這樣了,剩下的就是動手操作了

java parser

java parser是什么,讓我們一起了解一下?

Java Parser是基于JavaCC作為Java語言詞法解析的工具,支持Java語言生成AST(Abstract Syntax Tree抽象語法樹),在AST基礎上進行類型推斷分析,支持修改AST從而生成新的Java文件內容,支持從Java 1.0到14所有的版本的AST解析。

AST結構允許以一種簡單的編程方式使用Java代碼。可以專門操作Java文件,使用起來也更簡單。它提供了一種方便的機制,可以使用我們稱為“訪客支持”的功能來導航樹。這使開發人員能夠專注于在源代碼中識別有趣的模式,而不必編寫費力的樹遍歷代碼。該庫的最終主要功能是能夠操縱源代碼的基礎結構。然后可以將其寫入文件,為開發人員提供構建自己的代碼生成軟件的便利。

那么我們使用JavaParser theere時,總是希望進行很多操作。

例如,我們希望對整個項目進行操作,因此在給定目錄的情況下,我們將探索所有Java文件。 此類應有助于完成此任務:

package?me.tomassetti.support; import?java.io.File; public?class?DirExplorer?{ public?interface?FileHandler?{ void?handle(int?level,?String?path,?File?file); } public?interface?Filter?{ boolean?interested(int?level,?String?path,?File?file); } private?FileHandler?fileHandler; private?Filter?filter; public?DirExplorer(Filter?filter,?FileHandler?fileHandler)?{ this.filter?=?filter; this.fileHandler?=?fileHandler; } public?void?explore(File?root)?{ explore(0,?"",?root); } private?void?explore(int?level,?String?path,?File?file)?{ if?(file.isDirectory())?{ for?(File?child?:?file.listFiles())?{ explore(level?+?1,?path?+?"/"?+?child.getName(),?child); } }?else?{ if?(filter.interested(level,?path,?file))?{ fileHandler.handle(level,?path,?file); } } } }

對于每個Java文件,我們首先要為每個Java文件構建一個抽象語法樹(AST),然后對其進行導航。 這樣做有兩種主要策略:

1、使用訪客:要在特定類型的AST節點上進行操作時,這是正確的策略。

2、使用遞歸迭代器:這允許處理所有類型的節點。

用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的介紹,請參考

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.copySubtree(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.copySubtree( targetRoot.getAST(), (ASTNode) srcRoot.types().get(0))); //這是合法操作 targetRoot.types().add(targetRoot.getAST().newTypeDeclaration());

可以查百度百科的

分享名稱:javaast生成代碼 java 生成代碼
文章轉載:http://m.kartarina.com/article18/hgjsdp.html

成都網站建設公司_創新互聯,為您提供標簽優化全網營銷推廣定制網站企業建站靜態網站域名注冊

廣告

聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯

搜索引擎優化
主站蜘蛛池模板: 精品无码久久久久久久动漫| 无码 免费 国产在线观看91 | 色综合久久中文字幕无码| 少妇中文无码高清| 久久久久亚洲精品无码蜜桃| 免费无码一区二区| 亚洲中文久久精品无码1| | 一本色道久久HEZYO无码| 91久久九九无码成人网站| 无码专区国产精品视频| 日韩精品久久无码中文字幕| 国产精品午夜无码体验区| 无码精品人妻一区二区三区漫画| 国产精品无码制服丝袜| 久久无码人妻一区二区三区 | 亚洲国产精品无码AAA片| 免费A级毛片无码无遮挡内射| 中文字幕无码一区二区三区本日| 亚洲精品无码不卡在线播放| 大桥久未无码吹潮在线观看| 黑人巨大无码中文字幕无码| 亚洲毛片无码专区亚洲乱| 亚洲熟妇无码另类久久久| 麻豆亚洲AV成人无码久久精品| 少妇无码一区二区三区免费| 国产成人综合日韩精品无码不卡| 一夲道dvd高清无码| 少妇无码AV无码专区在线观看 | 伊人久久精品无码av一区| 无码熟熟妇丰满人妻啪啪软件 | 亚洲精品无码久久| 无码H肉动漫在线观看| 永久免费av无码网站yy| 亚洲精品无码不卡在线播HE| 国内精品无码一区二区三区| 亚洲精品97久久中文字幕无码| 全免费a级毛片免费看无码| 无码人妻精一区二区三区| 久久亚洲中文字幕无码| 曰韩无码二三区中文字幕|