0x01 前言
java.lang.Runtime 因为有一个 exec方法可以执行本地命令,所以该类常常用来执行本地系统命令。
通过前面我们已经学习了通过反射的各种方法,那么本章节就已该类作为一个例子,实现反射调用exec方法。
0x02 本地whoami
0x03 不使用反射执行本地命令的代码
package 反射;import org.apache.commons.io.IOUtils;public class ExecCmdTest {public static void main(String[] args) {// 输出命令执行结果try {System.out.println(IOUtils.toString(Runtime.getRuntime().exec("whoami").getInputStream(),"UTF-8"));} catch (Exception e) {e.printStackTrace();}}}// 运行结果pmiaowu
0x04 通过反射调用Runtime执行exec
package 反射;import org.apache.commons.io.IOUtils;import java.io.InputStream;import java.lang.reflect.Constructor;import java.lang.reflect.Method;public class ExecCmdTest {public static void main(String[] args) {try {// 获取Runtime类对象Class runtimeClass = Class.forName("java.lang.Runtime");// 获取构造方法Constructor runtimeConstructor = runtimeClass.getDeclaredConstructor();runtimeConstructor.setAccessible(true);// 创建Runtime类实例 相当于 Runtime r = new Runtime();Object runtimeInstance = runtimeConstructor.newInstance();// 获取Runtime的exec(String cmd)方法Method runtimeMethod = runtimeClass.getMethod("exec", String.class);// 调用exec方法 等于 r.exec(cmd); cmd参数输入要执行的命令Process p = (Process)runtimeMethod.invoke(runtimeInstance, "whoami");// 获取命令执行结果InputStream results = p.getInputStream();// 输出命令执行结果System.out.println(IOUtils.toString(results, "UTF-8"));} catch (Exception e) {e.printStackTrace();}}}// 运行结果pmiaowu
