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