真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

javaast生成代碼 java 生成代碼

如何使用ANTLR4創(chuàng)建AST

ANTLR 是一個(gè) Java 實(shí)現(xiàn)的詞法/語(yǔ)法分析生成程序,目前最新版本為 4.5.2,支持 Java,C#,JavaScript 等語(yǔ)言,這里我們用 ANTLR 4.5.2 來(lái)實(shí)現(xiàn)一個(gè)自己的腳本語(yǔ)言。

公司主營(yíng)業(yè)務(wù):成都做網(wǎng)站、網(wǎng)站建設(shè)、移動(dòng)網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實(shí)現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競(jìng)爭(zhēng)能力。創(chuàng)新互聯(lián)公司是一支青春激揚(yáng)、勤奮敬業(yè)、活力青春激揚(yáng)、勤奮敬業(yè)、活力澎湃、和諧高效的團(tuán)隊(duì)。公司秉承以“開放、自由、嚴(yán)謹(jǐn)、自律”為核心的企業(yè)文化,感謝他們對(duì)我們的高要求,感謝他們從不同領(lǐng)域給我們帶來(lái)的挑戰(zhàn),讓我們激情的團(tuán)隊(duì)有機(jī)會(huì)用頭腦與智慧不斷的給客戶帶來(lái)驚喜。創(chuàng)新互聯(lián)公司推出古田免費(fèi)做網(wǎng)站回饋大家。

因?yàn)槟承┪粗?,ANTLR 官方的文檔似乎有些地方和 4.5.2 版的實(shí)際情況不太吻合,所以,有些部分,我們必須多方查找和自己實(shí)踐得到,所幸 ANTLR 的文檔比較豐富,其在 Github 上例子程序也很多,足夠我們探索的了。

如果你沒有編譯原理的基礎(chǔ),只要寫過(guò)正則表達(dá)式,應(yīng)該也能很快理解其規(guī)則,進(jìn)而編寫自己的規(guī)則文件,事實(shí)上,因?yàn)榻Y(jié)構(gòu)更清晰, ANTLR 的規(guī)則文件,比正則表達(dá)式要簡(jiǎn)單得多。

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

這個(gè)問(wèn)題就需要來(lái)談?wù)剼さ募軜?gòu)問(wèn)題了。

殼的三大架構(gòu)

1.最早的殼幾乎都是virus演化來(lái)的,大部分都是匯編直接寫的。

好處就是直接可以把匯編代碼復(fù)制出來(lái)當(dāng)作殼的loader代碼添加(感染)到程序上

知名的比如aspack,upx,telock,PESpin

2.隨著對(duì)于反調(diào)試要求越來(lái)越高,功能越來(lái)越多,代碼一多就難以維護(hù)。

于是誕生了新的殼架構(gòu),功能采用DLL開發(fā),使用loader來(lái)加載

這里有兩個(gè)變種:

ShellCode Loader + DLL ASProtect。Themida,ACProtect等等你所熟悉的加密殼絕大部分都是這樣的架構(gòu)

memory loader + DLL bigfoot為代表的bambam,ZProtect,eXPressor,npack,ChinaProtect等等

這種架構(gòu)簡(jiǎn)單,好維護(hù),更好調(diào)試。其實(shí)許多其他殼或多或少的都使用這兩種架構(gòu)

3.對(duì)于一些純VM的保護(hù)殼,由于沒有固定代碼(VMProtect等)

所以對(duì)于這樣的需求首先你需要一個(gè)codegen(這個(gè)東東將陪伴你寫殼的一生)

而且對(duì)于codegen其實(shí)完全可以構(gòu)造一個(gè)完整的殼代碼(調(diào)試比較麻煩)

不管什么語(yǔ)言開發(fā)的加殼軟件最終都要回到opcode操作上,而對(duì)于opcode其實(shí)用神馬語(yǔ)言都差不多

這三種架構(gòu)介紹完了。那么談?wù)刯ava寫殼的問(wèn)題吧

其實(shí)可以簡(jiǎn)單的從語(yǔ)言優(yōu)勢(shì)上來(lái)解答:

如果說(shuō)開發(fā)第三種殼用啥其實(shí)都差不多,Java和C#說(shuō)不定更有優(yōu)勢(shì)。

上面我們說(shuō)到codegen的問(wèn)題,真正不適合開發(fā)的地方其實(shí)主要是在各種地址轉(zhuǎn)換上面,

反匯編引擎反匯編的都是opcode結(jié)構(gòu),然后再將這些opcode串聯(lián)起來(lái)構(gòu)造出AST,省下的就是mutation,vm,還是其他等等操作了,

如果單純?yōu)榱私鉀Qopcode---AST(Abstract Syntax Tree抽象語(yǔ)法樹)解決了地址轉(zhuǎn)換這個(gè)問(wèn)題的話其實(shí)匯編,C\C++還是Java都差不多。

反而由于Java和C#這些語(yǔ)言有很好的容器可以更好的來(lái)控制對(duì)象

opcode生成其實(shí)也不是難事,這些用Java還是C++其實(shí)都差不多。

真正的難點(diǎn)就在于上面所說(shuō)的殼Loader的開發(fā)上,不管是匯編,C\C++,Delphi(不管在國(guó)內(nèi)外特別是國(guó)外其實(shí)許多殼都是Delphi開發(fā)的)

都可以直接開發(fā)DLL,直接拿來(lái)變形后塞進(jìn)原始程序當(dāng)作殼的Loader Main部分。

而Java就只能從codegen來(lái)構(gòu)造殼代碼了。。。

這是一件很痛苦的事情(相信我~如果你用過(guò)Java寫過(guò)c語(yǔ)言編譯器-帶連接器的那種你就會(huì)明白痛苦了)

綜上所述~介于樓主的語(yǔ)言選擇問(wèn)題,估計(jì)多數(shù)是只會(huì)Java,或者需要在web層調(diào)用。

那么最好的辦法還是殼主體ASM,C\C++來(lái)開發(fā),然后開發(fā)成命令行版本,然后Java調(diào)用這個(gè)模塊。

架構(gòu)就這樣了,剩下的就是動(dòng)手操作了

java parser

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

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

AST結(jié)構(gòu)允許以一種簡(jiǎn)單的編程方式使用Java代碼??梢詫iT操作Java文件,使用起來(lái)也更簡(jiǎn)單。它提供了一種方便的機(jī)制,可以使用我們稱為“訪客支持”的功能來(lái)導(dǎo)航樹。這使開發(fā)人員能夠?qū)W⒂谠谠创a中識(shí)別有趣的模式,而不必編寫費(fèi)力的樹遍歷代碼。該庫(kù)的最終主要功能是能夠操縱源代碼的基礎(chǔ)結(jié)構(gòu)。然后可以將其寫入文件,為開發(fā)人員提供構(gòu)建自己的代碼生成軟件的便利。

那么我們使用JavaParser theere時(shí),總是希望進(jìn)行很多操作。

例如,我們希望對(duì)整個(gè)項(xiàng)目進(jìn)行操作,因此在給定目錄的情況下,我們將探索所有Java文件。 此類應(yīng)有助于完成此任務(wù):

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); } } } }

對(duì)于每個(gè)Java文件,我們首先要為每個(gè)Java文件構(gòu)建一個(gè)抽象語(yǔ)法樹(AST),然后對(duì)其進(jìn)行導(dǎo)航。 這樣做有兩種主要策略:

1、使用訪客:要在特定類型的AST節(jié)點(diǎn)上進(jìn)行操作時(shí),這是正確的策略。

2、使用遞歸迭代器:這允許處理所有類型的節(jié)點(diǎn)。

用Java怎么解析C/C++代碼生成AST抽象語(yǔ)法樹結(jié)構(gòu)

其中一個(gè)明顯的例子是Eclipse CDT里的parser。

它是完全用Java實(shí)現(xiàn)的,手寫的遞歸下降parser,能把C或C++源碼parse成AST供Eclipse CDT的IDE功能使用。它支持C99語(yǔ)法(包括GCC擴(kuò)展)、C++語(yǔ)法(我沒仔細(xì)看現(xiàn)在支持到什么版本了)等。

它并不用于實(shí)際的編譯(這跟Eclipse JDT里的Eclipse Compiler for Java不同);實(shí)際編譯還是交給諸如GCC、xlc之類的編譯器去完成。

關(guān)于Eclipse CDT里的C與C++ parser的介紹,請(qǐng)參考

JDT的好處是什么?

JDT(java development tooling)是Eclipse提供的一組API。其功能引用其官方文檔上的說(shuō)法:

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. 總之,提供了一系列強(qiáng)大的API供我們操作Java代碼。

JDT實(shí)際上是將Java代碼構(gòu)建成一個(gè)基于DOM結(jié)構(gòu)的抽象語(yǔ)法樹AST(Abstract Syntax Tree )。代碼中的每個(gè)部分都對(duì)應(yīng)一個(gè)ASTNode,許多的ASTNode就構(gòu)成了這個(gè)抽象的語(yǔ)法樹。Java Class一般對(duì)應(yīng)Compilation Unit node,該節(jié)點(diǎn)也是AST樹上的頂點(diǎn)。創(chuàng)建一個(gè)AST如下:

java 代碼

ASTParser parser = ASTParser.newParser(AST.JLS3); parser.setSource("".toCharArray()); CompilationUnit unit = (CompilationUnit) parser.createAST(null); unit.recordModifications(); AST ast = unit.getAST();

其中createAST,當(dāng)parse需要較長(zhǎng)時(shí)間時(shí),可以采用createAST(new NullProgressMonitor()),否則直接傳null即可。

recordModifications()用于記錄節(jié)點(diǎn)的變動(dòng),比如修改、刪除等,當(dāng)需要對(duì)AST樹進(jìn)行變動(dòng)操作時(shí),必須要預(yù)先調(diào)用這個(gè)方法。

比較重要的是:一個(gè)AST樹上的所有節(jié)點(diǎn)必須都屬于該AST。不允許直接將其他AST樹上的節(jié)點(diǎn)添加該AST樹上。否則會(huì)拋出java.lang.IllegalArgumentException異常。須使用ASTNode.copySubtree(AST target, ASTNode node)返回一個(gè)目標(biāo)樹的深度拷貝,才能進(jìn)行添加操作。例如: 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 生成代碼
URL地址:http://weahome.cn/article/hgjsdp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部