unsafe脚本怎样才是安全的??除了脚本对已有对象应该限于只读操作,
并且不应该持有对象的引用外,暂时所能想到的,先列几条吧:
1、启用unsafe模式:
修改BTrace启动参数 -Dcom.sun.btrace.unsafe=true
BTrace脚本注解:@BTrace(unsafe = true)
2、BTrace脚本类的ClassLoader为引导类加载器;
被跟踪的类的加载器仍为原类加载器不变;
agent在加载脚本类之前会对脚本类进行修改,
包括修改脚本方法名称、@TLS变量修改为ThreadLocal等;
3、BTrace脚本编译后,@OnMethod、@OnError等注解的方法,
将被添加到目标类中。而脚本中的公共调用方法,仍保留在脚本中。
所以,被注解的方法中可以引用目标类加载器可见的类型;
但脚本的公共调用方法中,只能引用引导类加载器可见的类型,
否则运行期报NoClassDefFoundError
4、进入方法为location = @Location(Kind.ENTER)
退出方法的途径有2个:
正常退出:location = @Location(Kind.RETURN)
异常退出:location = @Location(Kind.ERROR)
5、可以用-Dcom.sun.btrace.dumpClasses=true
-Dcom.sun.btrace.dumpDir=./yourDumpDir方式将修改后的类转储,
借助反编译工具查看增强后的代码;
6、BTrace1.2.2版本的BUG:
@OnMethod(clazz = "+my.Command", method = "execute")
如果agent附加到目标进程时,已经加载过“+”对应的子类,
那么只有已加载的子类会被修改,之后加载的子类不会被脚本代码所修改;
@BTrace(unsafe = true)
public class SampleScript {
@TLS
// 在转换后的Script脚本类中,@TLS变量会自动声明为ThreadLocal变量
static Object fooParam;
@OnMethod(clazz = "/my\\..*?Command/", method = "execute", type = "void(my.FooParam)")
public static void onExecute(@ProbeClassName
String className, AnyType fooParam) {
SampleScript.fooParam = fooParam;
}
@OnMethod(clazz = "/my\\..*?Command/", method = "execute", location = @Location(Kind.RETURN), type = "void(my.FooParam)")
public static void onExecuteReturn(@ProbeClassName
String className) {
BTraceUtils.println("execute return : className = " + className);
BTraceUtils.println("param : fooParam = " + fooParam);
// 这儿引用Foo1Command不会有问题
Foo1Command command = new Foo1Command();
System.out.println(command.toString());
// 在test()引用Foo1Command将抛出NoClassDefFoundError
test();
}
@OnMethod(clazz = "/my\\..*?Command/", method = "execute", location = @Location(Kind.ERROR), type = "void(my.FooParam)")
public static void onExecuteError(@ProbeClassName
String className, Throwable e) {
BTraceUtils.println("execute error : className = " + className);
BTraceUtils.println("param : fooParam = " + fooParam);
BTraceUtils.println("throw : message = " + e.getMessage());
}
public static void test() {
System.out.println("test...");
// 将抛出NoClassDefFoundError
Foo1Command command = new Foo1Command();
System.out.println(command.toString());
}
}
public class BTraceStarter {
public static void main(String[] args) throws Exception {
String classpath = System.getProperty("java.class.path");
if (!classpath.contains("tools.jar")) {
throw new RuntimeException("请在类路径中设置tools.jar!");
}
System.setProperty("com.sun.btrace.probeDescPath", ".");
System.setProperty("com.sun.btrace.dumpClasses", "true");
System.setProperty("com.sun.btrace.dumpDir", "./dump");
System.setProperty("com.sun.btrace.debug", "false");
System.setProperty("com.sun.btrace.unsafe", "true");
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入目标进程PID: ");
String pid = in.readLine();
String script = new File(BTraceStarter.class.getResource("SampleScript.class").getFile()).getCanonicalPath();
com.sun.btrace.client.Main.main(new String[] { pid, script });
}
}
分享到:
相关推荐
java魔法类:Unsafe应用
四、风险与注意事项 尽管UnSafe提供了强大的功能,但使用时必须谨慎。不恰当的使用可能导致数据不一致、内存泄漏甚至安全问题。此外,由于Java版本的更新,某些方法可能在未来的JDK中被弃用或改变行为,因此依赖于...
尽管`Unsafe`提供了强大且底层的接口,但它的使用需要谨慎。不当的使用可能导致内存泄漏、数据不一致、安全风险等问题。在大多数情况下,Java的标准API和并发工具已经足够处理大部分编程需求。不过,了解`Unsafe`的...
本文深入解析Java并发编程中的两个关键类:Atomic和Unsafe。...风险与挑战:文中也强调了使用这些高级特性时的风险和挑战,特别是Unsafe类的使用,需要特别注意以避免潜在的安全问题和稳定性影响。
标题“JDK Unsafe 源码注释”和描述提示我们,接下来的内容将围绕JDK中非标准的Unsafe类进行。Unsafe类是Sun公司内部的一个类,它不是JDK标准API的一部分,而存在于sun.misc包中。虽然Oracle发行的JDK版本不包含...
150602 14:40:02 [Warning] Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEMENT. INSERT… SELECT… ON DUPLICATE KEY UPDATE is unsafe because the order in ...
在Visual Studio中,开发者可能会遇到一个警告或错误,提示"This function or variable may be unsafe",这是由于Microsoft引入的安全开发生命周期(Security Development Lifecycle, SDL)检查机制。该机制旨在提高...
在本篇文档中,主题聚焦于“看雪2017安全开发者峰会ppt-10.Java_JSON反序列化之殇”,探讨了Java语言中JSON处理库的安全问题和防御措施。首先,我们将分析目前主流的JSON处理库,包括Gson、Jackson和Fastjson,并...
### CS使用Unsafe的方法向DLL传参 #### 背景介绍 在跨语言编程中,经常会出现需要在不同编程语言间传递数据的情况。比如,在C#中调用C/C++编写的动态链接库(DLL)时,就可能遇到类型不匹配的问题。本文将通过一个...
对Netty中的Unsafe做了简单的总结,构建自己的知识网!!!
3. **直接内存访问**:`Unsafe`可以分配非堆内存,不占用Java堆空间,但需要手动管理。这对于提高性能、减少垃圾收集的开销很有帮助,但同时也可能导致内存泄漏。 ### 2. `Unsafe`类源码分析 `Unsafe`类包含大量...
unsafe-helper-包含一些简单的方法,这些方法使使用sun.misc.Unsafe更容易。 unsafe-collection-在ArrayList上建模的示例列表,该列表不存储对集合内对象的引用,而是直接将元素复制到列表中。 这有一些有趣的特性...
跨站点脚本(Cross-Site Scripting,简称XSS)是一种常见的网络安全问题,它发生在攻击者能够在用户浏览器中注入恶意脚本时。这些脚本可以伪装成受信任的网站,从而窃取用户的敏感信息,如登录凭据或执行其他恶意...
值得注意的是,虽然这样可以绕过编译器的安全检查,降低编译错误,但同时也可能使程序更容易遭受安全攻击。因此,如果决定不使用安全检查,需要有充分的理由,并对潜在风险有清晰的认识。 微软提供SDL检查是为了...
JDK8中sun.misc包下的UnSafe类,想查看源码的就拿走,没积分的请与我联系!xtfggef@gmail.com
Java中的`Unsafe`类是一个非常特殊且强大的工具类,它提供了对Java内存模型的底层访问。这个类在`sun.misc`包下,由于其潜在的危险性和不稳定性,官方并不推荐直接使用,甚至在Java 9之后有计划移除部分功能。然而,...
在Java并发编程中,LockSupport和Unsafe是两个关键的工具类,它们提供了底层的线程控制功能,使得开发者能够深入地管理和控制线程的行为。LockSupport是Java并发库中的一个核心工具类,它提供了线程的阻塞和唤醒功能...
请注意,目前GameLisp需要最新版本的夜间锈病。 贡献 支持项目持续发展的最直接方法是通过 。如果您发现GameLisp有用或有趣,请考虑做出贡献! 错误报告和请求请求是受欢迎的。提交给作品的所有贡献将按以下所述获得...
《深入理解Java Unsafe类在JDK 1.5中的应用》 在Java编程语言中,`Unsafe`类是一个特殊的存在,它提供了对内存操作的直接访问权限,绕过了Java的一些安全机制。在JDK 1.5版本的`rt.jar`库中,`Unsafe`类扮演着一个...