首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

CAPTAIN HOOK - 如何(不)寻找 JAVA 应用程序中的漏洞

因此,我和我的同事将工具的目标设定为能够跟踪任意方法调用,将有趣的与堆栈跟踪和输入一起记录给专家,并区分方法调用的输入是否是用户-控制与否。...从这一点来看,我认为在虚拟机、容器或主机以外的任何地方设置 Java 应用程序会更容易。此外,为了使该工具尽可能通用,该工具必须独立于目标软件的执行环境。...目标 0 - 选择一个典型的目标 为了创建一个工具来帮助审计人员发现大型闭源 Java 应用程序中的漏洞,其中很大一部分是识别典型的“大型闭源 Java 应用程序”并尝试使用我的工具重新发现公共漏洞。...,因此,我认为能够更改任何方法的实现会很酷。...在前面的示例中,重写该方法可能会很有趣,以便它直接调用用户输入,而不需要清理部分。Frida 是完美的工具,所以我决定将它与 Java 调试接口结合使用。

82610

JVM笔记二双亲委派机制

双亲委派机制的执行过程: 如果一个类加载器收到了类加载的请求,这个类加载器不会先尝试加载这个类,而是会先把这个请求委派给自己的父类加载器去完成,在每个层次的类加载器都是依此类推的。...因此所有的类加载器请求其最后都应该被委派到顶层的启动类加载器中(Bootstrap),只有当父类的加载器在自己管辖范围内(文末会介绍每个类加载器管理范围的)没有找到所需要的类的时候,子类加载器才会尝试自己去加载的...这就是为什么如果我们自己写java.lang.string类的时候,是不行的。 我们可以自己尝试着创建一个java.lang.String类,类里面只有一个main方法,执行会是什么样的呢?...根据提示,我们就能知道,自己写的string类在启动的时候,类加载了,向上父类委派,最终委派到启动类加载器了,启动了加载器发现自己管辖的范围内存在String类,然后调用Main方法的时候,发现没有这个方法...这个流程执行的简图: 双亲委派流程示意图 ​ 图二:双亲委派机制流程图 双亲委派机制的好处 JVM为什么要使用双亲委派这种机制呢?有什么好处呢?

97300
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Java程序员必备基础结构图

    Java虚拟机栈 线程私有的,生命周期与线程相同。 每个方法被执行的时候都会创建一个"栈帧",用于存储局部变量表(包括参数)、操作数栈、动态链接、方法出口等信息。...如果其他线程调用 notify() / notifyAll() ,会唤醒WaitSet中的某个线程,该线程再次尝试获取monitor锁,成功即进入Owner区域。...Eden和Survivor比例是8:1~ “半区复制”缺点是浪费可用空间,并且,如果对象存活率高的话,复制次数就会变多,效率也会降低。 12.标记-整理算法示意图 ?...栈帧是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址信息。...Java语言定义了6种线程池状态: 新建(New):创建后尚未启动的线程处于这种状态 运行(Running):线程开启 start()方法,会进入该状态。

    57321

    浅谈Java中字符串的初始化及字符串操作类

    如果存在会直接返回该引用, 如果不存在则会在堆内存中创建该字符串对象, 然后到字符串常量池中注册该字符串。 在本案例中虚拟机首先会到字符串常量池中查找是否有存在"hello"字符串对应的引用....由于第一行代码采用的是new的方式创建字符串, 所以在字符串常量池中没有保存"hello world"对应的引用, 虚拟机会在常量池中进行注册, 注册完后的内存示意图如下: ?...也就是说每次拼接都会new出两个对象, 并进行两次方法调用, 如果拼接的次数过多, 创建对象所带来的时延会降低系统效率, 同时会造成巨大的内存浪费....而且当内存不够用时, 虚拟机会进行垃圾回收, 这也是一项相当耗时的操作, 会大大降低系统性能。...StringBuilder对象, 运行时期没有创建过其他任何对象, 每次循环只调用一次append方法.

    55230

    Java 的异常处理机制

    介绍 ErroError 类对象一般是由虚拟机生成并抛出,绝大部分的 Error 都会导致虚拟机自身处于不可恢复的状态,是程序无法控制和处理的。当出现 Error 时,一般会选择终止线程。...---常见的编译时异常有:FileNotFoundException:当尝试打开由指定路径表示的文件失败时抛出ClassNotFoundException:当应用程序尝试通过其字符串名称加载类时抛出,以下三种方法加载...Class.forName(java.lang.String)ClassLoader.findSystemClass(java.lang.String)ClassLoader.loadClass(java.lang.String...这是异常处理中要特别注意的事情,因为生吞异常很可能会导致难以诊断的诡异情况。如果我们没有把异常抛出,也没有把异常记录到日志系统,程序可能会在后续出现难以排查的 bug。...异常处理时,性能开销大的地方我们从性能角度来审视一下 Java 的异常处理机制,这里有两个性能开销相对大的地方:try-catch 代码段会产生额外的性能开销,或者换个角度说,它往往会影响 JVM 对代码进行优化

    73770

    Java 中文官方教程 2022 版(四十四)

    调用方法时的 IllegalAccessException 如果尝试调用private或其他不可访问方法,则会抛出IllegalAccessException。...MethodTroubleAgain示例展示了尝试在另一个类中调用私有方法导致的典型堆栈跟踪。...从 Method.invoke()中抛出的 IllegalArgumentException Method.invoke()已经被改造成为可变参数方法。这是一个巨大的便利,但可能会导致意外行为。...尝试调用不可访问构造函数时出现 IllegalAccessException 如果尝试调用私有或其他不可访问的构造函数,则可能会抛出IllegalAccessException。...如果尝试缩小范围会导致IllegalArgumentException ArrayTroubleToo示例包含的代码会失败,因为它尝试执行一个可能会丢失数据的操作: import java.lang.reflect.Array

    22900

    JVM常见面试题(三):类加载器,双亲委派模型,类装载的执行过程

    通过加载字节码数据放入内存转换成byte[],接下来调用虚拟机底层方法将byte[]转换成方法区和堆中的数据1.2 应用场景企业级应用SPI机制类的热部署Tomcat类的隔离大量的面试题什么是类的双亲委派机制打破类的双亲委派机制自定义类加载器解决线上问题使用...有以下几种情况:创建类的实例(对象)调用类的类方法访问类或者接口的类变量,或者为该类变量赋值使用反射方式来强制创建某个类或接口对应的java.lang.Class对象初始化某个类的子类直接使用java.exe...主要目的是保证Java程序运行的基础类被正确地加载,比如java.lang.String,Java虚拟机需要确保其可靠性。...——启动类加载器加载,根据双亲委派机制,它的优先级是最高的String类能覆盖吗:在自己的项目中去创建一个java.lang.String类,会被加载吗?...通过加载字节码数据放入内存转换成byte[],接下来调用虚拟机底层方法将byte[]转换成方法区和堆中的数据(3)类加载器有哪些/有几种常见的类加载器启动类加载器(BootStrap ClassLoader

    9410

    JVM双亲委派机制

    1.双亲委派机制原理 Java虚拟机对 class 文件采用的是按需加载的方式,也就是说当需要使用该类时才会将它的 class 文件加载到内存中生成 class 对象。...而且加载某个类的class文件时,Java虚拟机采用的是双亲委派模式,即把请求交由父类处理,它是一种任务委派模式 如果一个类加载器收到了类加载请求,它并不会自己先去加载,而是把这个请求委托给父类的加载器去执行...; 如果父类加载器还存在其父类加载器,则进一步向上委托,依次递归,请求最终将到达顶层的启动类加载器; 如果父类加载器可以完成类加载任务,就成功返回,倘若父类加载器无法完成此加载任务,子加载器才会尝试自己去加载...3.双亲委派机制的优势 避免类的重复加载 保护程序安全,防止核心API被随意篡改 自定义类:java.lang.String 没有调用 自定义类:java.lang.ShkStart(报错:阻止创建...java.lang开头的类) 4.沙箱安全机制 自定义String类时:在加载自定义String类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载jdk自带的文件(rt.jar包中

    34630

    Java虚拟机详解(十一)------双亲委派模型

    本篇博客,我们来介绍Java虚拟机的双亲委派模型,在介绍之前,我先抛出一个问题:   我们知道,在JDK源码中,有各种Java自带的类,比如java.lang.String,java.util.List...,只有父类加载器反馈到无法完成这个加载请求(它的搜索范围没有找到这个类),子加载器才会尝试自己去加载。   ...如果父类加载失败,则在抛出 ClassNotFoundException 异常后,在调用自己的 findClass 方法进行加载。 4、自定义类加载器   先说说我们为什么要自定义类加载器?...②、动态创建   比如很有名的动态代理。 ③、从非标准的来源加载代码   我们不用非要从class文件中获取定义此类的二进制流,还可以从数据库,从网络中,或者从zip包等。   ...通过第 3 小节的 java.lang.ClassLoader 类的源码分析,类加载时根据双亲委派模型会先一层层找到父加载器,如果加载失败,则会调用当前加载器的 findClass() 方法来完成加载

    31910

    Java 中文官方教程 2022 版(四十三)

    对于每种类型的对象,Java 虚拟机实例化一个不可变的java.lang.Class实例,该实例提供了用于检查对象的运行时属性的方法,包括其成员和类型信息。Class还提供了创建新类和对象的能力。...编译器警告:“注意:…使用了未经检查或不安全的操作” 当调用方法时,会检查参数值的类型并可能进行转换。...ClassWarning调用getMethod()会导致典型的未经检查的转换警告: import java.lang.reflect.Method; public class ClassWarning...中定义,与方法的 API 类似,但有两个主要例外:首先,构造函数没有返回值;其次,调用构造函数会为给定类创建一个新的对象实例。...特别是,这些工具将不得不处理更大的.class文件,并且 Java 虚拟机(JVM)将使用更多内存。此外,一些参数名称,如secret或password,可能会暴露有关安全敏感方法的信息。

    19300

    一文了解安卓APP逆向分析与保护机制

    优化代码,非入口节点类会加上private/static/final,没有用到的参数会被删除,一些方法可能会变成内联代码; 混淆(Obfuscate):使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名...但是如上所示,dex文件在加固时,针对中间缺失的一部分数据会以解密后的数据来替换,有的时候这种拆分替换也会导致数据不准确。那么到底应该拆分什么样的数据呢?就需要了解一下dex文件的数据结构。...GetStaticDoubleFieldSetStaticDoubleField GetDoubleField SetDoubleField … (byte, object, int,long…) 其二是反射调用类方法...通过HOOKJNI 接口实现虚拟机加固逆向分析 通过HOOK JNI 接口不用逆向底层,就可以了解APP大致的调用流程。...但是对于复杂的调用过程,或者虚拟化方法数量较多的情况,这种逆向分析手段看起来会比较混乱;对于不需要返射到Java层执行的指令,如算术、逻辑运算等,则无法监控到。

    1.6K30

    Java反射机制及其使用

    准备:正式为类变量(static)分配内存并设置类变量默认初始值的阶段,这些内存都将在方法区中进行分配。 解析:虚拟机常量池内的符号引用(常量名)替换为直接引用(地址)的过程。...虚拟机会保证一个类的()方法在多线程环境中被正确加锁和同步。...; /* 调用newInstance(),创建运行时类的对象。...实际上对象还是通过调用类的无参构造函数创建的, 若没有无参构造函数,则报错。 要想此方法正常的创建运行时类的对象,要求: 1.运行时类必须提供空参的构造器 2.空参的构造器的访问权限得够。...参数一:方法的调用者 * 参数二:给方法形参赋值的实参,若有多个参数,则写多个 * 返回值:被调用方法的返回值。

    54830

    《零基础 Java 开发 》 第五章 数组第五章 数组

    需要注意的是, 如果我们使用一个未作初始化的数组对象,会导致空指针异常 java> int[] x = null; int[] x = null java> x[0] java.lang.NullPointerException...如果没有足够的堆空间,创建数组的时候会抛出 OutofMemoryError : java> int[] xLargeArray = new int[10000000*1000000000] java.lang.OutOfMemoryError...Arrays.toString : 将数组转化成字符串 如果我们直接对一个数组调用 Object对象的 默认toString 方法,我们会得到如下输出 java> x int[] x = [1, 2,...不用担心,Arrays 类中已经为我们准备好了 copyOf 方法。我们可以直接调用 copyOf 方法对数组进行扩容。..."] 需要注意的是,调用 sort 方法时,传入的数组中的元素不能有 null 值,否则会报空指针异常 String[] s = {"JS", "Java", "Kotlin", "Scala", null

    1.2K30

    synchronized

    JVM就是根据该标示符来实现方法的同步的:当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,获取成功之后才能执行方法体...也可以通过参数:-XX:BiasedLockingStartupDelay=0来关闭延迟 2.轻量级锁 我们继续上述场景来说,当前锁已经是偏向锁或为无锁状态(锁标志位为“01”状态),虚拟机首先将当前线程的栈帧中创建用于存储锁记录...虚拟机不会让每一个尝试使用自旋获取锁的线程都会自旋规定的次数,这样对资源利用不友好对,所以JDK采用来更“聪明”的方式——自适应自旋,简单来说就是线程如果自旋成功了,则下次自旋的次数会更多,如果自旋失败了...如果有其他线程因为自旋多次导致轻量级锁升级成了重量级锁,那么CAS操作会失败,此时会释放锁并唤醒被阻塞的线程。锁膨胀的流程图如下图所示。 ?...虚拟机不仅会忽略程序员编写无用的同步,也会对一些本身具有同步性质的操作,进行反复调用而增加无用的加锁。

    49010

    浅谈 Java Agent 内存马

    即在运行 main 方法之前会先去调用我们 jar 包中 Premain-Class 类中的 premain 方法 接下来我们来看一下 Demo 首先创建一个类,来实现 premain 的这个方法 import...,我们可以调用该函数,来重新触发这个Transformer的拦截,以此达到对已加载的类进行字节码修改的效果 Demo 首先利用 addTransformer 注册一个 transformer ,然后创建一个...在调用Instrumentation实例的方法时,这些方法会使用ClassFileTransformer接口中提供的方法进行处理。...,所以我们这里利用 agentmain 方法来尝试注入我们的内存马 其实在上文中如何动态修改对应类的字节码已提过,所以我们现在第一件事是需要找到对应的类中的某个方法,这个类中的方法需要满足两个要求 该方法一定会被执行...还有就是之前看大哥们说过,在有的环境下agent内存马注入之后网站会崩掉,听他们说是有可能因为虚拟内存不够了而导致的,所以具体使用的话还是需要事先斟酌一下 还有就是关键类寻找不对等情况也有可能导致网站被打挂

    2.5K10

    详解并发编程的优缺点

    CAS算法:利用Atomic下使用CAS算法来更新数据,使用了乐观锁,可以有效的减少一部分不必要的锁竞争带来的上下文切换 使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多的线程,这样会造成大量的线程都处于等待状态...而在学习多线程编程技术的过程中也会让你收获颇丰。 三. 应该了解的概念 ---- 3.1 同步VS异步 同步和异步通常用来形容一次方法调用。...同步方法调用一开始,调用者必须等待被调用的方法结束后,调用者后面的代码才能执行。而异步调用,指的是,调用者不用管被调用方法是否完成,都会继续执行后面的代码,当被调用的方法完成后会通知调用者。...3.3 阻塞和非阻塞 阻塞和非阻塞通常用来形容多线程间的相互影响,比如一个线程占有了临界区资源,那么其他线程需要这个资源就必须进行等待该资源的释放,会导致等待的线程挂起,这种情况就是阻塞,而非阻塞就恰好相反...,它强调没有一个线程可以阻塞其他线程,所有的线程都会尝试地往前运行。

    87400

    JVM内存与垃圾回收篇第2章类加载子系统

    (关联:构造器是虚拟机视角下的()) 若该类具有父类,JVM会保证子类的()执行前,父类的()已经执行完毕 虚拟机必须保证一个类的()方法在多线程下被同步加锁...如果用户创建的JAR放在此目录下,也会自动由扩展类加载器加载 4.2.3、系统类加载器 应用程序类加载器(系统类加载器,AppClassLoader) Java语言编写,由sun.misc.LaunchersAppClassLoader...自定义类:java.lang.ShkStart(报错:阻止创建 java.lang开头的类) 6、沙箱安全机制 自定义String类时:在加载自定义String类的时候会率先使用引导类加载器加载,而引导类加载器在加载的过程中会先加载...主动使用,又分为七种情况: 创建类的实例 访问某个类或接口的静态变量,或者对该静态变量赋值 调用类的静态方法 反射(比如:Class.forName(“com.atguigu.Test”)) 初始化一个类的子类...REF_invokeStatic句柄对应的类没有初始化,则初始化 除了以上七种情况,其他使用Java类的方式都被看作是对类的被动使用,都不会导致类的初始化,即不会执行初始化阶段(不会调用 clinit(

    24730

    synchronized的实现原理

    MonitorEnter指令会尝试获取Monitor的持有权,即尝试获取锁。     ...下面是摘自《Java虚拟机规范》的话:       Java虚拟机可以支持方法级的同步和方法内部一段指令序列的同步,这两种同步结构都是使用管程(Monitor)来支持的。       ...方法级的同步是隐式,即无需通过字节码指令来控制的,它实现在方法调用和返回操作之中。虚拟机可以从方法常量池中的方法表结构中的ACC_SYNCHRONIZED访问标志区分一个方法是否同步方法。...当方法调用时,调用指令将会检查方法的ACC_SYNCHRONIZED访问标志是否被设置,如果设置了,执行线程将先持有管程,然后再执行方法,最后在方法完成(无论是正常完成还是非正常完成)时释放管程。...4)当前线程尝试使用自旋来获取锁,自旋期间会不断的执行步骤1),直到获取到锁或自旋结束。因为自旋锁会消耗CPU,所以不能无限的自旋。

    38530

    详解并发编程的优缺点

    CAS算法:利用Atomic下使用CAS算法来更新数据,使用了乐观锁,可以有效的减少一部分不必要的锁竞争带来的上下文切换 使用最少线程:避免创建不需要的线程,比如任务很少,但是创建了很多的线程,这样会造成大量的线程都处于等待状态...而在学习多线程编程技术的过程中也会让你收获颇丰。 三. 应该了解的概念 ---- 3.1 同步VS异步 同步和异步通常用来形容一次方法调用。...同步方法调用一开始,调用者必须等待被调用的方法结束后,调用者后面的代码才能执行。而异步调用,指的是,调用者不用管被调用方法是否完成,都会继续执行后面的代码,当被调用的方法完成后会通知调用者。...3.3 阻塞和非阻塞 阻塞和非阻塞通常用来形容多线程间的相互影响,比如一个线程占有了临界区资源,那么其他线程需要这个资源就必须进行等待该资源的释放,会导致等待的线程挂起,这种情况就是阻塞,而非阻塞就恰好相反...,它强调没有一个线程可以阻塞其他线程,所有的线程都会尝试地往前运行。

    52520

    JVM加载class文件的原理

    (2) 虚拟机器激活以后,会先做一些初始化的动作,比如说读取系统参数等。一旦初始化动作完成之后,就会产生第一个类装载器 ―― Bootstrap Loader(启动类装载器 ) 。...除此以外,类装载器也可以通过调用findSystemClass()来请求启动类装载器来装载类,这是类 ClassLoader中的一个静态方法。...当Java虚拟机开始运行时,在应用程序开始启动以前,它至少创建一个用户自定义装载器,也可能创建多个.所有这些装载器被连接在一个Parent-Child的委托链中,在这个链的顶端是启动类装载器。...在上例中,ClassLoaderTest类的testClassLoader方法被首次调用,该方法引用了Java API中的类 java.lang.String。...从这一刻开始,不管何时ClassLoaderTest类引用了名为java.lang.String的类,虚拟机就可以直接使用这个 java.lang.String类了。

    1.2K20
    领券