JavaGUI编程总结及Java命令执行类Runtime的简单分析

前言

        各位读者大家好,好久不见,不知大家想我了吗?作者对大家甚是想念,这不带着新文章叒来了,本次文章主要是关于JavaGUI编程的开发思路总结以及对我们最常用的java木马中命令执行类Runtime的一个简要分析。

创作背景

        作者在前段时间和朋友聊起冰蝎的流量特征,于是想到了常用的几款webshell管理工具,心中萌生了自写webshell管理工具的想法。于是对当前缺乏的知识做了总结,首先需要掌握图形化的编程知识、其次要设计一个独有的加密机制和交互过程等,于是立刻着手学习GUI编程。

1.GUI编程语言选择

        在学习GUI编程时,对语言选择上又产生了困惑,是选择C语言还是Java语言,亦或者是最容易上手的python语言呢?于是对三种语言做了一个优劣权衡和取舍:

       对C语言来说,它开发出来的工具毫无疑问是效率最高并且对运行环境要求最低的,不需要额外的解释器环境,但是自身开发难度和系统兼容性问题无疑是一个大问题,必须随着系统的不断升级来维护代码。

        对Java语言来说,它开发出来的工具虽然效率不如C语言,但是以java自身的特性,通过独特的字节码文件来作为中间产物,只要安装版本匹配的jre,永远不用担心因系统升级导致代码无法执行的跨平台问题,同时Java面向对象的思想使其极易维护和拓展功能,这也是主流非爬虫类渗透工具都用Java编写的主要原因。(爬虫类的工具要以效率为最优,因此一般选择c语言进行开发,例如很多厂商的扫描器等)

        对Python语言来说,效率方面与java相似,不如C高效,优势也在于跨平台性并且代码编写简单,单纯以实现功能的角度而言,python是不二之选。但是站在长远的角度来说它的可维护性和可扩展性就远差于Java,想要二次开发的难度较大,虽然python和c#也提供了对象的编写,但是比起Java以面向对象立身的语言来说,仍有不小的差距。

        经过前面的分析,作者本身是为了实现webshell的功能,对运行效率并无要求,并且要兼顾今后添加新内容的便利性,最终决定以Java语言进行入手。

2.JavaGUI编程实操(拼图游戏)

       

2.1前期准备阶段分析

        作者查阅大量资料后,发现Java本身并不适合用来编写图形化工具,它主要是作为JavaWeb服务器发挥功能,很少直接与客户端打交道,因此关于JavaGUI的课程讲解也屈指可数,网上大部分的课程使用的也是AWT包进行开发,而其因为是伴随Java1.0的早期产物,对中文的兼容性差,现在已被渐渐淘汰,使用Swing包进行替代。经过大量搜寻,作者在网上寻找到了一个使用Swing包编写拼图游戏的项目实战,于是以此来打开GUI编程的大门。

2.2设计注意点

        由于代码较多,作者本身也不是教大家从0开始写游戏,主要是编程思路的总结,就概括谈谈整体框架设计及注意点。

2.2.1主界面(JFrame)设计

        JFrame作为整个图形界面的框架,必然是包含一切图形设计的载体,因此所有在主界面的中用到的对象都应该包含在主界面中。部分代码展示:

2.2.2菜单栏设计

        菜单栏对象是位于主界面内的,因此可以将菜单栏对象的初始化打包成一个成员方法,在实例化主界面对象时在构造方法中自动调用执行即可。部分代码展示:

2.2.3游戏页面设计

        与菜单栏类似,因为游戏界面自身也要在主界面中展示,因此也将其初始化打包成一个成员函数,在实例化主界面对象时进行初始化即可。部分代码展示:

2.2.4游戏逻辑设计

        原理:拼图游戏的本质就是交换图片的位置,因此可以通过二维数组来进行设计,通过产生随机的二维数组来打乱图片初始位置,再通过对数组元素的交换实现图片位置的交换。

        注意:作者在编写逻辑时,基于"面向对象"的思想,将逻辑实现部分单开了一个新的类进行编写,而项目中原本是作为本类的一个成员函数进行实现,本以为是对代码的进一步优化,但实际却并非如此,由于将逻辑部分写在了其它类中,使得作者每次使用都需要通过该类的实例对象进行使用,由于该功能使用的极为频繁,反而导致代码变得更繁琐。但是相信在可维护性方面,作者比原项目做的更优秀。部分代码展示:

2.2.5入口函数

        入口函数还是Java一贯的风格,一行代码足以。(不得不说,Java虽然写起来有时候挺招人烦,但是写好后的代码真是美如画,层次分明,结构简单)

2.2.6一些杂项优化

        在代码中部分地方需要用到Java提供的一些抽象类中的方法,原项目中对这些类都创建了实例对象,但是作者认为这是很不必要的,因为这些类的实例大多只使用了一次,根本无需单独创建实例对象,而是直接通过匿名内部类的方式将其进行实例,对代码进一步进行了简化,同时节省一点内存空间。总之经过各项调整,也是成功将项目实现,并且没有冗余代码和警告信息。

2.2.7项目展示

游戏界面:

通关界面:

        补充:这里主要展示游戏过程和胜负判定,其它附加功能就不一一展示。(还有希望流萤没死,听见了吗米哈游)

3.Runtime类命令执行分析

3.1前情提要

        我们知道Runtime类在Java木马中是一个十分关键的类,因为我们黑客通过Java执行系统命令就要依靠此类中的exec函数。那不知你们是否产生过这样的疑问,为什么使用此类的exec函数时,都是统一通过"getRuntime().exec"进行获调用,而不是"类名.exec"或"实例对象.exec",接下来作者就从该类的定义给大家解释原因。

3.2Runtime类分析

3.2.1类声明分析

        我们首先看Runtime类的定义:(如下图)        分析:我们可以看到Runtime类是通过"public"进行定义的,并且并没有带"final"关键字,那么按道理来说是可以直接创建实例对象的,但实际上却并非如此,我们继续往下看。

3.2.2构造方法分析

        寻找Runtime类的构造方法:(如下图)

        分析:我们发现它将构造方法定义为了私有成员,私有成员无法被类外的函数调用,因此导致无法对Runtime类进行实例化。

3.2.3getRuntime函数分析

        我们寻找getRuntime函数的的定义:(如下图)

        分析:我们发现该函数为我们返回了一个变量currentRuntime,这个变量又是什么呢,我们找找它的定义位置。

        补充:在Java中get函数一般用于对外提供类中私有成员的值,这是为了安全考虑,确保关键的类内成员变量不能被外部直接修改。

3.2.4currentRuntime分析

        我们寻找到currentRuntime的定义:(如下图)

        分析:我们发现改变量就是Runtime类的实例对象本身,我们通过getRuntime函数获取到的就是本类的实例对象,因此可以通过"getRuntime().exec()"的方式调用命令执行函数,至此真相大白。

3.3Runtime设计原因

        Runtime类为什么要这么设计呢,其实原因很简单。Runtime类本身是一个关于程序当前运行环境的类,因此它并不像一般的JavaBean可能需要用到多个实例对象,需要多次创建实例。因此为了避免开发人员创建多个Runtime类的实例对象空耗内存,就通过这种方式限制每次调用都使用同一个实例对象,就避免了内存的浪费。但是我同样疑惑为什么不将其定义为工具类,如果有Java开发大佬看到本文,希望可以指点一下作者,感激不尽。

总结

        emm.....时候不早了,早些休息,没有什么想说的,拜了个拜.......

  • 22
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值