Java逆向基础之Byteman的扩展Helper类

上一篇文章提到我们可以在规则文件中调用自己写的扩展Helper类

看一个例子

新建目标项目和扩展Helper类项目,结构如下

其中目标项目使用上一篇博客的第二个例子的代码

扩展Helper类项目需要用到第三方jar,在C:\byteman-download-4.0.2\lib找到byteman.jar复制过来

TraceHelper.java代码如下

package com.vvvtimes;

import org.jboss.byteman.rule.Rule;
import org.jboss.byteman.rule.helper.Helper;

public class TraceHelper extends Helper {

	protected TraceHelper(Rule rule) {
		super(rule);
	}

	public boolean myprint(String message) {
		return super.traceln("!!! IMPORTANT EVENT !!!" + message);
	}
}

将这个项目导出为BytemanHelperDemo.jar

目标项目里的规则文件tracing.btm内容如下,其中HELPER项指定自定义了Helper类名

RULE trace return value1
CLASS com.vvvtimes.Main
METHOD add(int,int)
HELPER com.vvvtimes.TraceHelper
AT EXIT
IF true
DO myprint("Return value: " +$!)
ENDRULE

编译

javac com/vvvtimes/Main.java

运行

java com.vvvtimes.Main

加helper类的规则文件检查,注意多了个-cp BytemanHelperDemo.jar

bmcheck -cp . -cp BytemanHelperDemo.jar  -v scripts/tracing.btm

byteman运行

java -cp ".;BytemanHelperDemo.jar;%CLASSPATH%" -javaagent:%BYTEMAN_HOME%\lib\byteman.jar=script:scripts/tracing.btm com.vvvtimes.Main

运行结果如下

如果我们将上面的目标项目打包成jar,则命令可以改成如下形式

目标项目打包成的jar名为BytemanDemo2.jar

运行

java -cp "BytemanDemo2.jar;%CLASSPATH%" com.vvvtimes.Main

加helper类的规则文件检查

bmcheck -cp BytemanDemo2.jar -cp BytemanHelperDemo.jar  -v scripts/tracing.btm

byteman运行

java -cp "BytemanDemo2.jar;BytemanHelperDemo.jar;%CLASSPATH%" -javaagent:%BYTEMAN_HOME%\lib\byteman.jar=script:scripts/tracing.btm com.vvvtimes.Main

运行结果如图

原文地址:http://blog.51cto.com/7317859/2112124

时间: 2024-07-31 10:07:03

Java逆向基础之Byteman的扩展Helper类的相关文章

Java逆向基础之导出内存中的类一

为什么需要这个,因为在之前的博文中提到,为了增加逆向的难度,部分软件会对部分关键方法和类进行隐藏,所以我们需要把这个类从内存中拿出来. 本文介绍使用javaagent的方法,下一篇介绍dumpclass,两种方法各有利弊. 本文需要用到第三方jar为:javassist-3.20.0-GA.jar,不过我们需要的是它的源码javassist-3.20.0-GA-sources.jar 新建名为DumpClassAgent的项目,项目结构如下 将下载到的源码复制到src目录下 DumpClassA

Java逆向基础之导出内存中的类二

我们有时候可能会遇到暂时无法使用javaagent的情况,如服务器上的Web应用重启太耗时,这是我们可以考虑用下面的方法. 使用dumpclass,目前dumpclass在Windows上表现不佳,建议在Linux上使用 dumpclass项目地址 https://github.com/hengyunabc/dumpclass 下载地址 http://central.maven.org/maven2/io/github/hengyunabc/dumpclass/0.0.2/dumpclass-0

Java语言学习(5)-Java中基础封装类(日期、时间类)

日期和时间封装类 1. Data类 Java日期和时间采用Data类.Data类在java.util包中. Data类构造函数: 1)       Data()   采用当前时间初始化对象: 2)       Data(long millisec)   采用1970年1月1日起时间毫秒数来初始化对象. Data类的方法: 1)       boolean after(Data d).boolean before(Data d) Data对象和参数指定日期较早晚,返回boolean值. 2)   

Java逆向基础之条件跳转位运算循环

本文参考:http://www.vuln.cn/7117 条件跳转的例子,绝对值 public class abs {     public static int abs(int a)     {         if (a<0)             return -a;         return a;     } } 编译 javac abs.java 反编译 javap -c -verbose abs.class   public static int abs(int);     d

Java逆向基础之动态生成类

为什么有这个东西,一方面时AOP框架的需要,另一方面是增加软件逆向的难度 动态生成类的技术目前大体上分为两类,一类是通过操作字节码框架如cglib/Javassist去实现,另一类就是JNI方式,调用dll/so库,内存中动态还原.这两种方式都能实现隐藏类 看一个Javassist动态生成类的例子 package com.vvvtimes; import java.lang.reflect.Modifier; import javassist.ClassPool; import javassis

Java逆向基础之初识javaagent

首先说一下javaagent是什么 javaagent是一种能够在不影响正常编译的情况下,修改字节码. 在逆向中javaagent可以完成对类的拦截和增强. 看一个例子 在Eclipse新建如下MyAgent结构的项目 MyAgent.java文件内容 package com.vvvtimes.demo.agent; import java.lang.instrument.Instrumentation; public class MyAgent {     public static void

Java逆向基础之JDB动态调试

本文参考:https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jdb.html JDB在有源代码的时候可以实现调试远程机器上的java程序,但是在逆向中源码很难分析出来,不过还是能够调试得到一部分信息的 本文主要获取两个信息 1.动态调用混淆类中的方法,因为实践过程中我们去手动补全相关代码比较难 2.打印调用栈 以下例子以调试ZKM.jar为例 JDB无源代码调试调用方法 启动Xdebug调试 java -Xdebug -X

Java逆向基础之AspectJ的ajc与aj5命令

acj命令是用于编译java文件和aj文件的编译器,相当于eclipse的编译器(ECJ)+aspectj运行时扩展 aj5命令在jdk1.5上使用-javaagent:pathto/aspectjweaver.jar加载aspectj程序,达到修改字节码的目的 这两个命令可以用java命令和javac来替代,我们以上文的命令为例 Load-time weaving (LTW) 加载时编织 编译 ajc -outjar myjar.jar HelloWorld.java ajc -outjar 

Java逆向基础之AspectJ的Around方法修改方法体

在逆向中,我们往往通过修改某个方法达到目的,在javaassist中有insertBefore,insertAfter,setBody,在AspectJ中也可以通过Around实现类似的功能. 看一个简单的例子 java文件Main.java //Main.java package com.vvvtimes; public class Main { public int add(int x, int y) { return x + y; } public int add(int x, int y