前语
信任很多人都“免费激活”过 IDEA吧,在IDEA 的vmoptions装备里,加行装备就行:
或许是这样“拖到IDEA窗口中”的办法:
再或许用过一些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,由以下几个组件构成:
- 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
上面这个比如好像有点过于简略,只是“阻遏”了字节码数据进行了转储,并没有进行字节码的修改。其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;
}
那么怎样修改这个类办法呢?
有两种办法:
- 提早解压jar包,反编译那个Class文件,得到Java文件后修改verifyLicense办法后从头编译
- 在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。假设我的文章对您有协助,请点赞/保藏/注重鼓励支撑。