前语

信任很多人都“免费激活”过 IDEA吧,在IDEA 的vmoptions装备里,加行装备就行:
手把手教你写一个Java Agent,完成“免费激活”
或许是这样“拖到IDEA窗口中”的办法:
手把手教你写一个Java Agent,完成“免费激活”手把手教你写一个Java Agent,完成“免费激活”

再或许用过一些APM东西,在JVM建议脚本上appreciate添加了-javaagent:/path/to/apm-agent.jar,就能够主动进行寻找。再或许用过Arthas之源码编程类的JVM确诊东西,服务器的作用这些东西都是经过Java Agent的技能去完毕的。**

比如上面说的“免费激活”,其实便是在作业时期修改了github敞开私库验证license的相关代码。JAVA 里 Agent 这么强壮的功用,你难道不方案自己亲自写一个试试吗?

基础知识github中文官网网页

Java Agent 算是github打不开JVM的一个插件,以一个applicationJar包的办法存在。能够做到在作业时期,修改你的字节码文件,然后抵达增强、修改等作用,经过 JVM 供给的 Instrumentation AP源码编程I来完毕。

榜首个 Java Agent

一个Java Agent,由以下几个组件构成:

手把手教你写一个Java Agent,完成“免费激活”

  • Agent Clasgithub直播渠道永久回家s – Agent的gitee功用类
  • Packaging – 在MANIFEST.MF文件中界说Agent Class的方位和办法
  • “装载点”,比如-javaagent:&l源码编辑器编程猫下载t;j服务器的作用arfile>[=arguments],指定加载的agent.jar文服务器

废话不多说,下面正式初步编写这个Agent

1. 创建A源码年代gent Class

首先要创建一个Agent Class,这个Class作为我源码编辑器们Agent插件的进口类。装备好-approvejavaagent后,JVM在建议时会实施咱们Agent Class的premain办法

import java.源码编辑器手机版下载lang.instrument.Instgithub永久回家地址rumentati服务器租用多少钱一年on;
public class Agent {
public stati服务器c void premain(String args, Instrumgithub永久回家地址entation instrumentation){
ClassLoggerTransformer transformer = new ClassLoggit命令gerTragithub敞开私库nsformer()源码编辑器;
instrumentation.addTransformer(transformer);
}
}

p源码编辑器remain办法中,除了args参数,还有一个instrumentation政策。这个是Java Agent的中心appstore政策,经过该政策服务器和电脑主机的差异能够注册ClassFile源码Transformer

**ClassFileTransformer **便是担任字节码转化的中心接口了,已注册的ClassFileTranapprovesformer能够阻遏源码之家JVM中一切类的加载,而且能够获取到已加载类的字节码,来看一下这个接口的源码:

public interface ClassFileTransformer {
byte[]
transform(  ClassLoader         loader,
String              className,//className,全类名(包括途径,"/"切开)
Class<?>            classBeingRedefined,//类界说转化时的C源码编辑器lass政策,初始gitlab加载时为空
ProtectionDomain    protectionDomain,//protection...
byte[]              classfileBuffer)//加载的Class字节码数据
throws IllegalClassFormatEapprovexception;
}

2. 界说一个TraAPPnsformer

了解了ClassFileTrgithub怎样下载文件an源码之家sformer接口之后,现在来写一个ClassLoggerTransformer完毕类。为了简略,这个完毕类只需一个功用:将已加载的字节码转储到文件中


public class ClassLoggerTransformer implements ClassFileTransformer {
//回来值是替换的字节码数据
@Override
public byte[] transform(ClassLgithub中文社区oader loader,
String className,
Class<?> classBeingRedefined,
ProtectionDomainGitHub protectionDomain,
byte[] classfileBuffer) throws IllegalClassFormatException {
try {
Path path = Paths.get("classes/" + class服务器和电脑主机的差异Name + ".class");
//将字节码数据classfileBuffer,存储到classes目录下,以.class文件作为后缀
Files.writ源码本钱e(path, classfileBuffer);
} catch (Thrappointmentowable ignored) { // ignored, don’t do this at home kids
} finally { return classfileBuffer; }
}
}

好了,榜首个Agent 的功用代码部分现已完毕了,下面需求 Agent 处理进口的装备

3. 构建 agent.jar

现在咱们需求将代码构建成一个Jar,而且Jar内的MANIFEST.MF文件中,需求包括Agent Class的github直播渠道永久回家装备,终源码编辑器手机版下载究咱们的MANIFEST.MF文件应该是这样:

Manifest-Versiongiti轮胎是什么品牌: 1.0
Premain-Clasapp装置下载s: com.github.kongwu.agentsamples.firgithub敞开私库stagent.Age源码年代nt//Agent Class的全类名github永久回家地址
Can-Redefine-Classes: true //源码超市容许从头界说
Can-Retransform-Cla源码编辑器手机版下载sses: true //容许作业时转化

经过Maven的构建插件,很简略完毕MANIFEST.MF文件的装备:

<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
...
<configuration>
<archive>
<manife源码编辑器stFil源码本钱e>src/main/resources/META-INFgithub怎样下载文件/MANIFEST.MF</manifestFile>
</archgitiive>
</configapproveuration>
...
&appstorelt;/plugin>

只需求在项目的src/main/resources/META-INF/途径下,添加一个MANIFEST.MF的模板,模板文件里按git教程照上面介绍的界说即可,毕竟mapp装置下载vn clean package就能够构建出咱们的agent jar了(默许目录在${projectpath}/target/),这个jar包内会包括咱们上面的MANIFEST.MF模板源码编辑器编程猫下载文件

好了,功德圆满,咱们服务器操作体系榜首款Agent现已开发完了,下面来检验一下:

## 随意找个项目,或容appearance许实施的jar包
## 默许的建议办法,直接java -jar
java -jar first-app.jar
## 建议时添加咱们刚才构建的fiappstorerst-agent.jar
java -javaagent:/path/to/first-agent.ja服务器租用r -jar first-app.jar

添加agent作业后,一切作业时期加载的Class的字节码,就会转储到咱们的classes目录下了

假设你是在 IDEA 中作业,也能够在Run/Debug Configurations面板中,add vm optigiteeons
手把手教你写一个Java Agent,完成“免费激活”


上面这个比如好像有点过于简略,只是“阻遏”了字节码数据进行了转储,并没有进行字节码的修改。其github怎样下载文件实Clagithub打不开ssFile服务器怎样建立Transformer.transform的回来值,便是咱们github怎样下载文件要替换的数据;只需求在tran源码超市sform办法中回来新的字节码源码数据,就能够做到增强/替换类了(不过这个增强/替换是有一些捆绑的,比如不能修改办法签名之类的,本文不做过多介绍)

介绍完了根本的Agent完毕,下面来学习一个Agent的实践比如:经过Agent来“免费激活”approach

经过Agent 完毕源码编辑器手机版下载“免费激活”

前语中说到的,IDEA“免费激活”的东西也是经过Agithub官网gent完毕的源码编辑器编程猫下载,其实根本原理很简略,便是写一个Agent,动态修改验证licgiti轮胎是什么品牌ensgitlabe的那些代码罢了。

比如咱们运用一款需求授权容许证的Javgithub官网a 软件,其内部验服务器体系证容许证的代appear码是下面这段(伪代码)

public boolean verifyLicense(String encryptedLicensapprovee){
//央求服务器验证容许……
boolean passed = licenseServer.verifyLic源码编辑器手机版下载ense(encryptedLicense);
if(!passed){
//do sth
}
return passed;
}

那么咱们只需求经过Agent,动态的来修改这个verifyLicenseappearance办法,将验证作用修改为直接经过,就能够绕过这个容许验证机制了,还源码本钱不必修改原始Jar包

public boolean verifyLicense(String encryptedLicense){
//修改后,源码超市直接回来true
return true;
}

那么怎样修改这个类办法呢?

有两种办法:

  1. 提早解压jar包,反编译那个Class文件,得到Java文件后修改verifyLicense办法后从头编译
  2. 在ClassFileTragithubnsformer完毕中,经过传入的该类字节码数据,运用一些字节码操作东西进行修改

本文比如为了简apple略,运用榜首种办法,提github敞开私库前反编译、修改,giti再保存从头编译的Class文件到Agent 项目里:

只需求创建一个ClassFileTransapp装置下载former,进行这个验证容许证Class的替换:


import java.appointmentio.IOException;
impor源码分享网t java.io.InputStream;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.IllegalClassFormatException;
import java.sgithub中文官网网页ecurity.ProtectionDomain;
public clasgitlabs HackVerifierClassFileTransformer implementsapprove ClassFileTranappointmentsformegithub敞开私库r {
@Override
public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, Protectiogithub永久回家地址nDomain protectionDomain, byte[] capp装置下载lassfileB源码本钱uffer) throws IllegalCl服务器体系asAPPsFormatException {
//只替换这个验证的类 - Licegithub打不开nseVerifier
if(clas源码怎样做成app软件sName.equals("com/github/kongwAPPu/agentsamples/firstagent/verifierapp/LicenseVerifier")){
return loadHackClassBuffer(loader);
}
return null;
}
private byte[] lgithub打不开oa服务器操作体系dHackClassBuffer(ClassLoader loadegithub中文社区r) {
//反编译 -> 修改 -> 从头编译的LicenseVerifier.class 文件,换个后缀防止被JVM主动加载
try (InputStream input = loader.getResourceAsStream("LicenseVerifieappearr.classdata")){
int n;
ByteArrayOutputStream outputBufferappstore = new ByteArraygithub打不开OutputStream();
byte[] bugithub永久回家地址ffer = new byte[4096];//源码本钱4k
//-1 : end of file
whi源码怎样做成app软件le (-1 != (n = input.read(buffer))) {
outputBuffer.write(buffer,0,n);
}
rapplicationeturn outputBuffer.toByteAr服务器操作体系ray();github打不开
}catch (IOException e){
System.err.prgit教程intln("load t源码编辑器he hackfile failed!");
return null;
}
}
}

然后在Agent Class中,注册这个Hagithub永久回家地址ckVerifierClas服务器的作用sFileTransformer

import java.lang.instrumappearanceent.Instrumentation;
pappearanceublic class Agent {
public static void premain(String args, Instrumentation instrumentation){
HackVerifierClassFileTransformer transformer = new HackVerifierClassFileTransformer();
instrumentation.addTransformer(transformer);
}
}

毕竟只需求像上面那样,装备下MANIFEST.MF的生成,然后构建Ag源码编辑器ent Jaapplicationr包,就完毕了咱们这个“免费激活”的Agent 插件

往后作业该 Java 软件时,只需求添加-javaagent:/path/to/hack-agent.jar,就完毕了“免费激活”

## 默许的建议办法,直接java -jar
java -jar verifier-app.jar
## 建议时添加咱们刚才构建的agent源码编辑器.jar
java -javaagent:/path/to/hack-agent.jar -jar verifier-app.jar

文中比如无缺的代码在github.com/kongwu-/age…,有需求的同学能够github敞开私库自行下载

常用的字节码操作类源码之家

  • ASM
  • cglib
  • javaassist
  • ByteBuddy

以上的几个字节码操作类库,最举荐的是ByteBugiteeddy,运用办法上最简略

总结

本文介绍的这个“免费激活”的办法,仅github下载用于学习交流,不要用于一些不合法的场景,做一个遵纪守法的好公民,否则服务器体系会被请去喝茶就不太好了服务器地址在哪里看……

原创不易,转载请在最初闻名文章来历和作者appointment。假设我的文章对您有协助,请点赞/保藏/注重鼓励支撑。