导航:首页 > 编程语言 > 抽象语法树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 浏览:657
linuxexecl函数 浏览:725
程序员异地恋结果 浏览:372
剖切的命令 浏览:226
干什么可以赚钱开我的世界服务器 浏览:288
php备案号 浏览:989
php视频水印 浏览:166
怎么追程序员的女生 浏览:487
空调外压缩机电容 浏览:79
怎么将安卓变成win 浏览:459
手机文件管理在哪儿新建文件夹 浏览:724
加密ts视频怎么合并 浏览:775
php如何写app接口 浏览:804
宇宙的琴弦pdf 浏览:396
js项目提成计算器程序员 浏览:944
pdf光子 浏览:834
自拍软件文件夹名称大全 浏览:328