从Java源码来看Native命令执行方法( 二 )


文章插图
linux在linux下 , 在ProcessImpl#start的调用中将会创建一个UNIXProcess对象并返回

从Java源码来看Native命令执行方法

文章插图

从Java源码来看Native命令执行方法

文章插图
在UNIXProcess类的构造方法中 , 调用了forkAndExec这个native方法
从Java源码来看Native命令执行方法

文章插图
创建了一个一个进程 , 并返回了对应进程的pid
构造命令执行ProcessBuilder#start在上面的流程分析中 , 知道了在Runtime.getRuntime().exec()方法调用的下一层就是使用ProcessBuilder#start方法 。
如果hook掉了我们可以通过使用ProcessBuilder类来进行命令执行的构造 。
new ProcessBuilder("calc").start();
  • 1.
或者使用反射的思路构造
//method_1Class pro = Class.forName("java.lang.ProcessBuilder");((ProcessBuilder) pro.getConstructor(List.class).newInstance(Arrays.asList("calc.exe"))).start();//method_2Class pro = Class.forName("java.lang.ProcessBuilder");pro.getMethod("start").invoke(pro.getConstructor(List.class).newInstance(Arrays.asList("calc.exe")));//method_3Class pro = Class.forName("java.lang.ProcessBuilder");((ProcessBuilder) pro.getConstructor(String[].class).newInstance(new String[][]{{"calc.exe"}})).start();//method_4Class pro = Class.forName("java.lang.ProcessBuilder");pro.getMethod("start").invoke(pro.getConstructor(String[].class).newInstance(new String[][]{{"calc.exe"}}));
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
ProcessImpl从上面的分析可以知道 , 在windows环境下的JDK 。
ProcessImpl类的构造方法将会调用create方法执行native方法进行命令执行 。
【从Java源码来看Native命令执行方法】
从Java源码来看Native命令执行方法

文章插图
所以我们只需要反射获取ProcessImpl类的构造方法并实例化就会执行我们的恶意逻辑 。
UNIXProcess上面是针对windows的方式
针对linux , 在前面的分析中知道主要是在其start方法中调用了UNIXProcess类的构造方法 。
从Java源码来看Native命令执行方法

文章插图
执行forkAndExec这个native方法进行命令执行 。
other甚至于 , 我们知道最后主要是在create方法(windows)、forkAndExec方法(linux)中执行命令 , 我们同样可以通过反射这两个方法进行命令执行 。
本文作者:superLeeH ,  转载请注明来自




推荐阅读