此代码注入非依赖注入,是hack里的 代码注入 场景是这样滴: 机器上有一个java进程,我不想停止它,但我想把一段代码植入进去,干 一些事情(获取一些信息,改变一些值,监控一些东西,或者其它猥琐的事情) 这个进程不能停,而且也没有预料到现在的事情,或者这个进程的代码完全不能修改。
好,这篇文章是要干这个事情,它基于 jvm的 jdi或者jvmti 接口 这里用的jvmti,jdi也可以,麻烦不少 应该jdk1。5 就有,需要用c写。1。6 支持另一种方式,java也可以写 以前做过类似的事情,代码找不到了,现在有实现了一番。
直接上代码: 被注入的代码是这样滴: while(true) { System。out。println(System。currentTimeMillis()); Thread。sleep(1000); } 每隔一秒输出当前时间,只是示意用。
不管什么java程序都行 我要注入的类,那个方法是固定的: package com。zms。inject; import java。lang。instrument。Instrumentation; public class MyAgent1 { public static void premain(String s) { premain(s, null); } public static void premain(String s, Instrumentation instru) { System。
out。println("I'm injected! 木哈哈哈哈哈"); System。out。printf("param: %s\n", s); } public static void agentmain(String args, Instrumentation inst) { premain(args, inst); } public static void agentmain(String args) { premain(args); } } 编译,打入jar包 MANIFEST。
MF Manifest-Version: 1。0 Created-By: 1。6。0_26 (Apple Inc。) Agent-Class: com。zms。inject。MyAgent1 Premain-Class: com。zms。
inject。MyAgent1 操作代码: import com。sun。tools。attach。*; import com。sun。tools。attach。spi。AttachProvider; VirtualMachine vm=VirtualMachine。
attach("24862"); //target java process pid System。out。println(vm); vm。loadAgent("/Users/zms/workspace/mt/out/production/agent1。
jar","Powered by zms!"); Thread。sleep(1000); vm。
detach();目标程序结果: 1317283652520 1317283653520 1317283654521 I'm injected! 木哈哈哈哈哈 param: Powered by zms! 1317283655521 1317283656522。
全部