赞
踩
ja-netfilter
是一款可以破解jetbrains
IDE系列的javaagent jar
包。javaagent
创造修改字节码的时机。asm
修改相关类,达到hook特定方法的作用。首先先简单了解下整理流程,后面详细讲解每个步骤。
点击idea快捷方式,或者idea.bat / idea.sh启动。
根据环境变量加载对应vm参数。也就是vmoptions
文件,vm中的内容会作为jvm启动参数添加到启动命令中。
本地校验激活码
rpc接口校验激活码
vmoptions
目录。vm
参数(在ja-netfilter的vm参数中添加了asm支持以及javaagent参数,并指定当前jar包)。ja-netfilter.jar
的permain方法。
manifest
指定了Premain-Class。使用javaagent嵌入到目标虚拟机。
进入javaagner(ja-netfiler)定义的permain方法,开始执行ja-netfiler逻辑。
确定插件目录以及配置目录
加载插件,加载配置并初始化
DNSFilterPlugin
),用来注册对应的类转换器。InetAddressTransformer
),用来定义需要hook的类名,以及hook方法的逻辑。DNSFilter
),类转换之后被hook会真正调用到的类,一般用于拦截或者替换。DNSFilterPlugin
初始化转换类并注册
InetAddressTransformer
hook了java/net/InetAddress
类的getAllByName
方法以及isReachable
方法。
修改之后的InetAddress代码大致如下:
public class InetAddress { public static InetAddress[] getAllByName(String hostName) throws UnknownHostException { return DNSFilter.testQuery(hostName) == null ? new InetAddress[0] : super.getAllByName(hostName); } public boolean isReachable(NetworkInterface netif, int timeout, int ttl) throws SocketException { InetAddress reachableAddress = DNSFilter.testReachable(this); if (reachableAddress != null) { return true; } else { return false; } // ... } }
DNSFilter
dns插件hook了InetAddress类的getAllByName方法,如何匹配配置的域名,则抛出UnknownHostException异常。以及isReachable方法,如何匹配规则则返回false。
dns对应配置
[DNS]
EQUAL,jetbrains.com
EQUAL,plugin.obroom.com
也就是访问jetbrains.com以及plugin.obroom.com都是失败的。
power插件hook了BigInteger
的oddModPow
方法,这个方法是用来对一个数模取幂运算的,及x.oddModPow(y,z) = x^y % z
。RSA非对称加密底层会使用到当前方法。
可以简单理解为在oddModPow函数前加了一段逻辑,就是如果入参x,y,z匹配配置的规则,那么就返回规则配置的结果。
public class BigInteger {
public static BigInteger oddModPow(BigInteger x, BigInteger y, BigInteger mod) {
BigInteger result = ResultFilter.testFilter(x, y, mod);
if (result != null) {
return result;
}
// ...
}
}
url插件hook了HttpClient
的openServer
方法。在执行逻辑之前调用testUrl方法。
public class HttpClient {
public void openServer() {
URLFilter.testURL(url);
// ...
}
}
testUrl方法中的逻辑为如果匹配了规则中设置的url,那么就抛出SocketTimeoutException异常,也即不能访问指定url。
public static URL testURL(URL url) throws IOException { if (null == url || null == ruleList) { return null; } for (FilterRule rule : ruleList) { if (!rule.test(url.toString())) { continue; } DebugInfo.output("Reject url: " + url + ", rule: " + rule); throw new SocketTimeoutException("connect timed out"); } return url; }
对应规则为
[URL]
PREFIX,https://account.jetbrains.com/lservice/rpc/validateKey.action
那么这里就是只要前缀匹配了当前地址,也即是rpc校验激活码的地址,那么就会抛出异常,自然也就无法网络校验了。
可以看到,在输入验证码之后,会调用RAS
相关方法来校验激活码,这里就会调用到ja-netfiler
插件power
的方法。如果匹配了对应的配置,就会给出一个结果来替换oddModPow的结果。
校验验证码成功,激活成功
点击继续,关闭弹窗,idea会调用rpc接口校验验证码,url
插件匹配规则,抛出异常。
https://zhuanlan.zhihu.com/p/494706735
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。