首页
论坛
课程
招聘
[讨论] ja-netfilter 代理框架
2022-2-22 11:08 16518

[讨论] ja-netfilter 代理框架

2022-2-22 11:08
16518

zhile大佬新的java代理框架,之前也在论坛回帖提过,这里对几款插件简要介绍一下。

大佬博客地址 介绍一个"牛逼闪闪"开源库:ja-netfilter | 知了 (zhile.io)

dns、url插件一个是用于屏蔽dns查询,一个是用于屏蔽url请求的,也就是他说的网络防火墙功能,可以用来屏蔽网络验证。

hideme插件是用于隐藏自身的,一是擦除-javaagent启动参数,一是通过屏蔽通过类名查找它的关键类。



power插件是主力插件,主要功能是修改BigInteger的模幂函数modPow,非对称加密RSA、DSA都是通过模幂运算取实现的。

这个插件支持两种参数类型,一个是[Args],一个是[Result],通过名称也能判断出来,一个是替换参数的,一个是替换结果的。

; for replace arguments
[Args]
EQUAL,y,z->fakeY,fakeZ

; for replace result
[Result]
EQUAL,x,y,z->fakeResult

对于Args,y和z就是modPow(x,y)的两个参数,这两个参数就是指数和模,侠义理解就是公钥的指数和模,广义上应该也包括私钥的指数和模的情况,虽然这种情况基本不存在。最后的结果就是替换公钥的指数和模,也就是替换公钥。公钥的指数默认基本都是65537,有兴趣的可以搜索一下原因。

对于Result,x、y和z就是x.modPow(y,z),这里按公钥解密情况来说,x就是密文,y、z就是公钥的指数和模,最后结果就是,匹配到这三个参数,替换我们定义的结果。因为这个模幂运算是最底层的函数,这个密文可能是数据加密的密文,也可能是数据签名后的结果,这个要根据具体情况分析了。比如签名的情况,签名是将数据进行摘要,然后摘要结果和签名算法封装为ASN.1格式的数据,这个ASN.1格式数据再进行填充,然后加密得到的密文,所以自己去替换结果也是需要这么进行计算的。对于这种繁琐形式,我写了一个ja插件,可以适应不同的签名算法,前提是RSA算法签名 power-rule-plugin/RSASignatureTransformer.java at main · googleweb/power-rule-plugin (github.com)

这种模式怎么选择需要去自己判断,灵活运用。比如jetbrains系列,主要需要应对key中的证书,这个证书是内置根证书进行签名的,我们如果patch根证书的公钥,虽然可以让我们子证书的签名通过,但是根证书自签名就是失败,这就需要再加一个patch结果的规则,这就是两条规则,有点复杂了,而且patch根证书的公钥,可能影响软件对其他正常功能的验签,影响较大。现在的主流规则都是patch的结果,也就是替换的子证书的签名,也就是自己计算的签名明文,达到签名结果匹配。比如纯RSA加密,RSA加密是有长度限制的,不能超过模长,过长需要进行拆分为分组进行加密的,这时候最好patch公钥,不然就要写许多patch结果的规则。



native这个也算一个神器。因为Java native 方法是不可以调试的,也不可以修改方法拦截参数和返回的,这个插件就完美结果这个问题,可以对native方法进行修改可以调试。大体实现思路就是,修改系统的native方法的前缀,然后native方法名修改为带前缀的名字,原来的修改为代理方法,代理修改后带前缀的native方法。

主要实现可以去看native插件的代码,这里我只说一下代代理框架实现的地方,com/janetfilter/core/Initializer.java文件内设置系统的native方法前缀

inst.setNativeMethodPrefix(dispatcher, environment.getNativePrefix());

打包后的MANIFEST.MF文件需要添加属性

Can-Set-Native-Method-Prefix: true

系统早就支持了这个设置native方法前缀的功能,但是都不知道怎么应用,这个插件差不多是实现的独一份。这个插件暂时是闭环使用,也就是其他插件必须声明后,native才会去代理,也就是基于一种流的模式,native插件修改,后续声明的插件再进行下一步加工。我们可以临时修改一下,就可以对自己任意配置的类进行代理了。

下载代码,修改pom.xml,依赖的ja-netfilter版本修改成2.3.0

<dependency>
    <groupId>com.ja-netfilter</groupId>
    <artifactId>ja-netfilter</artifactId>
    <version>2.3.0</version>
    <scope>provided</scope>
</dependency>

然后WrapperTransformer文件添加一个方法

@Override
public boolean isManager() {
    return true;
}

编译打包,放入插件目录,native.conf配置文件添加自己想代理的类就可以了。


启动参数加上-javaagent:已经 ja-netfilter路径,就可以对native方法另类调试了。


看雪2022 KCTF 秋季赛 防守篇规则,征题截止日期11月12日!(iPhone 14等你拿!)

最后于 2022-2-22 11:12 被guduzhe编辑 ,原因:
收藏
点赞2
打赏
分享
最新回复 (31)
雪    币: 279
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junzixinglu 活跃值 2022-5-10 16:40
2
0
大佬,我看过您之前在"IDEA 2019.1版本的破解文件JetbrainsCrack.jar分析"这篇文章中的回帖,已经成功的搞定了低版本,然后高版本的话,我看你们说更换了证书的比对方式,我就转到您这篇文章中说的方式,我在测试的时候一直提示key is invalid,也不知道是power的内容生成错了,还是那个metadata和hash搞错了
雪    币: 4246
活跃值: 活跃值 (2207)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guduzhe 活跃值 2022-5-11 08:34
3
0
junzixinglu 大佬,我看过您之前在"IDEA 2019.1版本的破解文件JetbrainsCrack.jar分析"这篇文章中的回帖,已经成功的搞定了低版本,然后高版本的话,我看你们说更换了证书的 ...
https://bbs.pediy.com/thread-271052.htm
那就再看看这个帖子吧,涉及内容太多,还是需要自己调试排查问题出在哪里,不可能随便一下就猜想出来。
雪    币: 279
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junzixinglu 活跃值 2022-5-11 09:12
4
0
guduzhe https://bbs.pediy.com/thread-271052.htm 那就再看看这个帖子吧,涉及内容太多,还是需要自己调试排查问题出在哪里,不可能随便一下就猜想出来。
谢谢大佬,我去学习一下,如果您提供的power规则计算没毛病的话,我确认自己的生成证书的公钥的指数和模数都没弄错,那估计很大可能就是出在了这个metatdata计算上面,后面有不懂的,还望大佬不吝赐教
雪    币: 279
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junzixinglu 活跃值 2022-5-11 11:26
5
0

大佬,我仔细阅读了您刚才发我的那篇文章,我用文章中您给出的key提取签名,直接使用

System.out.println(new BigInteger(certificate.getSignature()));

输出来的长度为1233,而我自己生成的key签名输出的长度仅为616,这个会有影响吗?


我利用内置根证书颁发了自己的证书,在低版本利用此证书进行签名是可以成功激活的,结合您之前文章中所说,官方并没有针对替换证书做反制,所以这个自签的证书应该没毛病。

[
[
  Version: V3
  Subject: CN=prod2y-from-20201019
  Signature Algorithm: SHA256withRSA, OID = 1.2.840.113549.1.1.11

  Key:  Sun RSA public key, 2048 bits
  params: null
  modulus: 24580709077926620092044597552644293578345857265291819713044583762019889091207964073568161458804739458715380004434957967437606343043933001048031460204315561010346653890686793411514424415196735544767317833834873354780844688987895426437451628923551202414995434390331352210541261081218991147728656851435588281542821927947680997620259245155445014207429697565849156564251315760201267965288759078692695634602396216907138195404684647682172795883669338343228721466443314480641316732771827742321474271319939651686393329091959712489682268404241477393924334507448947669694217826663019016070298971335144331825007157671038461489053
  public exponent: 65537
  Validity: [From: Fri Oct 02 19:00:56 CST 2015,
               To: Tue Oct 24 19:00:56 CST 2045]
  Issuer: CN=JetProfile CA
  SerialNumber: [    0d]

Certificate Extensions: 5
[1]: ObjectId: 2.5.29.35 Criticality=false
AuthorityKeyIdentifier [
KeyIdentifier [
0000: A3 9E B6 48 67 42 12 36   41 BD 6D E0 B9 B4 A0 52  ...HgB.6A.m....R
0010: 8B 97 F1 B3                                        ....
]
[CN=JetProfile CA]
SerialNumber: [    d26cb183 b28379e1]
]

[2]: ObjectId: 2.5.29.19 Criticality=false
BasicConstraints:[
  CA:false
  PathLen: undefined
]

[3]: ObjectId: 2.5.29.37 Criticality=false
ExtendedKeyUsages [
  serverAuth
]

[4]: ObjectId: 2.5.29.15 Criticality=false
KeyUsage [
  DigitalSignature
  Key_Encipherment
]

[5]: ObjectId: 2.5.29.14 Criticality=false
SubjectKeyIdentifier [
KeyIdentifier [
0000: 24 DA 11 22 96 F5 85 41   C0 93 47 E8 31 23 4C F4  $.."...A..G.1#L.
0010: C0 84 02 FF                                        ....
]
]

]
  Algorithm: [SHA256withRSA]
  Signature:
0000: 16 0A D4 6D 75 6F A9 BB   CA 94 09 3A 00 D0 3A CC  ...muo.....:..:.
0010: CD 92 87 CB 96 0F 24 9A   6C 7C DE 4B 83 BB E0 A3  ......$.l..K....
0020: 19 7F 38 1C C2 E5 23 D3   1B 1F DA 27 9C 49 A8 10  ..8...#....'.I..
0030: F6 3E 8A BE E5 D8 A6 AE   44 7A 94 70 DF 54 11 A5  .>......Dz.p.T..
0040: 7C D8 19 C1 A7 C8 3C 23   CD 25 69 5C B3 03 96 79  ......<#.%i\...y
0050: 29 28 B6 4E 09 DC 34 B6   A9 B6 03 67 EF 68 96 95  )(.N..4....g.h..
0060: AD 9B CF 8F 9A 9F EC 6F   2D D1 BB D8 F3 4A BE EB  .......o-....J..
0070: 63 9D 41 CF 94 56 F4 16   61 9C 9E 43 67 56 04 7E  c.A..V..a..CgV..
0080: 09 8B 34 16 2A 9B 67 56   BC 84 F0 74 BE 80 48 40  ..4.*.gV...t..H@
0090: BF D8 37 FC 05 FF 36 82   F0 C2 A4 70 85 8F 8A 02  ..7...6....p....
00A0: 3E 8B 89 E2 D6 89 F8 F7   4B F1 48 15 67 39 F2 BA  >.......K.H.g9..
00B0: A1 9A 47 FB B2 A6 2E 68   87 17 BB 7B 49 8A 63 35  ..G....h....I.c5
00C0: 3E 76 5D 70 70 9E D7 1A   21 55 B6 E0 BF 53 8A 3F  >v]pp...!U...S.?
00D0: AB 2D 36 67 E1 50 F5 B5   3B 0A 78 67 44 F9 7C 5E  .-6g.P..;.xgD..^
00E0: 2E 07 DD 96 31 10 1A BF   60 A2 2E 17 BD 5A E9 70  ....1...`....Z.p
00F0: 47 E9 E8 B0 D9 E3 6B 0A   7C 73 F2 B1 E8 AB 9B AC  G.....k..s......

]


我利用此证书生成了自己的测试key

OWA0IUA22C-eyJsaWNlbnNlSWQiOiJPV0EwSVVBMjJDIiwibGljZW5zZWVOYW1lIjoiR09PRCIsImFzc2lnbmVlTmFtZSI6IiIsImFzc2lnbmVlRW1haWwiOiIiLCJsaWNlbnNlUmVzdHJpY3Rpb24iOiIiLCJjaGVja0NvbmN1cnJlbnRVc2UiOmZhbHNlLCJwcm9kdWN0cyI6W3siY29kZSI6IkFDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiQ0wiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA4LTExIiwicGFpZFVwVG8iOiIyMDIzLTA4LTExIiwiZXh0ZW5kZWQiOnRydWV9LCB7ImNvZGUiOiJEQiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IkRDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiRE0iLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA4LTExIiwicGFpZFVwVG8iOiIyMDIzLTA4LTExIiwiZXh0ZW5kZWQiOnRydWV9LCB7ImNvZGUiOiJEUCIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IkRQTiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IkdPIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiSUkiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA4LTExIiwicGFpZFVwVG8iOiIyMDIzLTA4LTExIiwiZXh0ZW5kZWQiOnRydWV9LCB7ImNvZGUiOiJQQyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IlBDV01QIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiUERCIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiUEdPIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiUFBDIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiUFBTIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiUFJCIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiUFMiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA4LTExIiwicGFpZFVwVG8iOiIyMDIzLTA4LTExIiwiZXh0ZW5kZWQiOnRydWV9LCB7ImNvZGUiOiJQU0kiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA4LTExIiwicGFpZFVwVG8iOiIyMDIzLTA4LTExIiwiZXh0ZW5kZWQiOnRydWV9LCB7ImNvZGUiOiJQU1ciLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA4LTExIiwicGFpZFVwVG8iOiIyMDIzLTA4LTExIiwiZXh0ZW5kZWQiOnRydWV9LCB7ImNvZGUiOiJQV1MiLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA4LTExIiwicGFpZFVwVG8iOiIyMDIzLTA4LTExIiwiZXh0ZW5kZWQiOnRydWV9LCB7ImNvZGUiOiJSQyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IlJEIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfSwgeyJjb2RlIjoiUk0iLCJmYWxsYmFja0RhdGUiOiIyMDIzLTA4LTExIiwicGFpZFVwVG8iOiIyMDIzLTA4LTExIiwiZXh0ZW5kZWQiOnRydWV9LCB7ImNvZGUiOiJSUyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IlJTMCIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IlJTQyIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IlJTRiIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IlJTViIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IlJTVSIsImZhbGxiYWNrRGF0ZSI6IjIwMjMtMDgtMTEiLCJwYWlkVXBUbyI6IjIwMjMtMDgtMTEiLCJleHRlbmRlZCI6dHJ1ZX0sIHsiY29kZSI6IldTIiwiZmFsbGJhY2tEYXRlIjoiMjAyMy0wOC0xMSIsInBhaWRVcFRvIjoiMjAyMy0wOC0xMSIsImV4dGVuZGVkIjp0cnVlfV0sIm1ldGFkYXRhIjoiMDEyMDIwMDcyOEVQQUpBMDA4MDA2IiwiaGFzaCI6IjE1MDIxMzU0LzA6LTEyNTExMTQ3MTciLCJncmFjZVBlcmlvZERheXMiOjAsImF1dG9Qcm9sb25nYXRlZCI6ZmFsc2UsImlzQXV0b1Byb2xvbmdhdGVkIjpmYWxzZX0=-MncyoQrYsSubi7CGlBaTrOvzMRwOlkcCEhfYtCvNU5EPyODGWtrY7Mk4PkXoc0P/v0oiDY7FoWr7lxJERtBtfzaDn9C9X57Y4TW6fxDklvAqIlBFWlLNJ/VY9IR1Fz4FtJgcw54i0wJlArXc3+Exc8+detN8Crq6sSa+dA+jRKZojPKfueznRZtWQIRh9u/2tci2fTjDZw7BG5rC1KrKYbUEcekAWr0uUqxZ8HCNMmiVldWQqAcpwjTZMU3BBpDDHn2t7jhfahiv36hg7WaZDfZOulnWjcoekzmdJA5Gg36XkCH5bBKkge8rTqRcRXWwYoSQyn04quTBDQFzm7SkdQ==-MIIDTDCCAjSgAwIBAgIBDTANBgkqhkiG9w0BAQsFADAYMRYwFAYDVQQDDA1KZXRQcm9maWxlIENBMB4XDTE1MTAwMjExMDA1NloXDTQ1MTAyNDExMDA1NlowHzEdMBsGA1UEAwwUcHJvZDJ5LWZyb20tMjAyMDEwMTkwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDCt3sq9PjsrP08HEDvqmGl1hgZl3BD+H0dGxx82Xf+FjRpbV4XnDPNDlrYQN/AUEWACQQis/3UpDtio9R9svuygeXCGjoiRMkxEn00oM0HaLepWkQVPKMcvZpmoCOOjPMxBJqZT8m2OGCY+BzsGYgbDEBDMaE4DAy6bh1+rgEqFYUo+pKAeeZTo+MBILEAXgDFkwF5k5fPIsRNe/SfGgVJARqS/MP7Wc5fQSV2TRdeYD35EufK8PHHT81y0tGMpt+wNvyihYXx8yXOSoW2samM5pAH0zKj7CKgkNZUFAKn4j59oDdiNWd/3ELhFtuzOeX11a9g3bkHuQ1s2CbPOS+dAgMBAAGjgZkwgZYwCQYDVR0TBAIwADAdBgNVHQ4EFgQUJNoRIpb1hUHAk0foMSNM9MCEAv8wSAYDVR0jBEEwP4AUo562SGdCEjZBvW3gubSgUouX8bOhHKQaMBgxFjAUBgNVBAMMDUpldFByb2ZpbGUgQ0GCCQDSbLGDsoN54TATBgNVHSUEDDAKBggrBgEFBQcDATALBgNVHQ8EBAMCBaAwDQYJKoZIhvcNAQELBQADggEBABYK1G11b6m7ypQJOgDQOszNkofLlg8kmmx83kuDu+CjGX84HMLlI9MbH9onnEmoEPY+ir7l2KauRHqUcN9UEaV82BnBp8g8I80laVyzA5Z5KSi2TgncNLaptgNn72iWla2bz4+an+xvLdG72PNKvutjnUHPlFb0FmGcnkNnVgR+CYs0FiqbZ1a8hPB0voBIQL/YN/wF/zaC8MKkcIWPigI+i4ni1on490vxSBVnOfK6oZpH+7KmLmiHF7t7SYpjNT52XXBwntcaIVW24L9Tij+rLTZn4VD1tTsKeGdE+XxeLgfdljEQGr9goi4XvVrpcEfp6LDZ42sKfHPyseirm6w=


然后,我又结合文章中对power的分析,仿造你们给出的代码生成了针对那个测试key的power规则

EQUAL,175381179676073661997041247740741863655054590486958155258480908982349897968586671478767351332287803988635834007147579877662820912697611189662950857770850218013219795584368857109622084572431539419257599591064252346228729029675300433636718151152388163744717039505722868327929702386224716846561179214517207438601798758277809520464565656561737761825124715586223568883458312175659141101898834454266253837756932413738138025333970583998068766659114919902615239889915243171458397160319039941849144113516212932451323702045818995750495662764915914136570037362881868147687402464293299118534624748474336062322215453747746524957368600071294503485314228805352377141670842310565840259278437941449815203956699834694752025455620959793283832817912425847933609583891849900634650566878321681142349703176513249440433867274738570442152438966254042461944838944122543726366125228330274503313579991885945376611505941032583896776423007485663609227527425323128947532710579990965589472121963252130151510875610492005204759816060268014406101172481101114289818100701793674108566304799936486491937702737833531835941879679179618347126583101478182745179571330510670682471438456583088291352819002580199350570437057692387607611449978471951831248979625911175842944306941,65537,860106576952879101192782278876319243486072481962999610484027161162448933268423045647258145695082284265933019120714643752088997312766689988016808929265129401027490891810902278465065056686129972085119605237470899952751915070244375173428976413406363879128531449407795115913715863867259163957682164040613505040314747660800424242248055421184038777878268502955477482203711835548014501087778959157112423823275878824729132393281517778742463067583320091009916141454657614089600126948087954465055321987012989937065785013284988096504657892738536613208311013047138019418152103262155848541574327484510025594166239784429845180875774012229784878903603491426732347994359380330103328705981064044872334790365894924494923595382470094461546336020961505275530597716457288511366082299255537762891238136381924520749228412559219346777184174219999640906007205260040707839706131662149325151230558316068068139406816080119906833578907759960298749494098180107991752250725928647349597506532778539709852254478061194098069801549845163358315116260915270480057699929968468068015735162890213859113563672040630687357054902747438421559817252127187138838514773245413540030800888215961904267348727206110582505606182944023582459006406137831940959195566364811905585377246353->31872219281407242025505148642475109331663948030010491344733687844358944945421064967310388547820970408352359213697487269225694990179009814674781374751323403257628081559561462351695605167675284372388551941279783515209238245831229026662363729380633136520288327292047232179909791526492877475417113579821717193807584807644097527647305469671333646868883650312280989663788656507661713409911267085806708237966730821529702498972114194166091819277582149433578383639532136271637219758962252614390071122773223025154710411681628917523557526099053858210363406122853294409830276270946292893988830514538950951686480580886602618927728470029090747400687617046511462665469446846624685614084264191213318074804549715573780408305977947238915527798680393538207482620648181504876534152430149355791756374642327623133843473947861771150672096834149014464956451480803326284417202116346454345929350148770746553056995922154382822307758515805142704373984019252210715650875853634697920708113806880196144197384637328982263167395073688501517286678083973976140696077590122053014085412828620051470085033364773099146103525313018873319293728800442101520384088109603555959893639842091339193901962660038693422868203379172012488607629998602600590969401724096223291140202


结果上来就直接key is invalid,我该不会向您在文章中分析的,根本都还没走到验签那一步去吧。


求大佬指点一下,谢谢。

雪    币: 4246
活跃值: 活跃值 (2207)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guduzhe 活跃值 2022-5-11 12:00
6
0
规则我不是给了一个python脚本了么,生成了一下和你的规则不一致,应该是生成的签名是不对的。

这里还有一个生成规则的插件,你可以看一下,签名不是简单哈希算法,签名会填充数据到一定长度,还有生成asn.1格式数据的

这个pyhon脚本和插件可以看一下,签名是怎么生成的。
https://github.com/googleweb/power-rule-plugin
雪    币: 279
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junzixinglu 活跃值 2022-5-11 12:54
7
0
guduzhe 规则我不是给了一个python脚本了么,生成了一下和你的规则不一致,应该是生成的签名是不对的。 这里还有一个生成规则的插件,你可以看一下,签名不是简单哈希算法,签名会填充数据到一定长度,还有生成 ...
之前没用您的py脚本,在那个脚本中,有一点儿我没太看明白,关于那个公钥模数的地方,目前代码中是860开头的,是内置根证书的公钥模数,我不用换成自己的吗?

我两个都尝试一下吧,我先试试,不行了再回帖请教,多谢!
雪    币: 279
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junzixinglu 活跃值 2022-5-11 13:22
8
0

使用py脚本运行的结果,公钥模数为内置根证书 86010 开头的时候,生成的规则如下

EQUAL,2782583080308586106043507595261938150529878943191163610233319373069757147724368017890898304945205312634884618274945894833338700840693934611269835316245123534411547785358201407652579461645831154347581668695935304613577901372763413841837753530902229938252241479176655182477437570402091367369274427424081524241107094554333616466496591406407684326777560397312178166877899478554972904560580780195603271612483749619035730072128460007220116961758402428796049783333223681488620221984636550950382415569788425033683385921743897634200931190579481716657856992875197315649355869771410867222908143510541319590081990750134269090732,65537,860106576952879101192782278876319243486072481962999610484027161162448933268423045647258145695082284265933019120714643752088997312766689988016808929265129401027490891810902278465065056686129972085119605237470899952751915070244375173428976413406363879128531449407795115913715863867259163957682164040613505040314747660800424242248055421184038777878268502955477482203711835548014501087778959157112423823275878824729132393281517778742463067583320091009916141454657614089600126948087954465055321987012989937065785013284988096504657892738536613208311013047138019418152103262155848541574327484510025594166239784429845180875774012229784878903603491426732347994359380330103328705981064044872334790365894924494923595382470094461546336020961505275530597716457288511366082299255537762891238136381924520749228412559219346777184174219999640906007205260040707839706131662149325151230558316068068139406816080119906833578907759960298749494098180107991752250725928647349597506532778539709852254478061194098069801549845163358315116260915270480057699929968468068015735162890213859113563672040630687357054902747438421559817252127187138838514773245413540030800888215961904267348727206110582505606182944023582459006406137831940959195566364811905585377246353->31872219281407242025505148642475109331663948030010491344733687844358944945421064967310388547820970408352359213697487269225694990179009814674781374751323403257628081559561462351695605167675284372388551941279783515209238245831229026662363729380633136520288327292047232179909791526492877475417113579821717193807584807644097527647305469671333646868883650312280989663788656507661713409911267085806708237966730821529702498972114194166091819277582149433578383639532136271637219758962252614390071122773223025154710411681628917523557526099053858210363406122853294409830276270946292893988830514538950951686480580886602618927728470029090747400687617046511462665469446846624685614084264191213318074804549715573780408305977947238915527798680393538207482620648181504876534152430149355791756374642327623133843473947861771150672096834149014464956451480803326284417202116346454345929350148770746553056995922154382822307758515805142704373984019252210715650875853634697920708113806880196144197384637328982263167395073688501517286678083973976140696077590122053014085412828620051470085033364773099146103525313018873319293728800442101520384088109603555959893639842091339193933562195160113971681536251451271864444439514751477869229146103963298251667122

使用py脚本运行的结果,公钥模数为我自签证书 24580 开头的时候,生成的规则如下

EQUAL,2782583080308586106043507595261938150529878943191163610233319373069757147724368017890898304945205312634884618274945894833338700840693934611269835316245123534411547785358201407652579461645831154347581668695935304613577901372763413841837753530902229938252241479176655182477437570402091367369274427424081524241107094554333616466496591406407684326777560397312178166877899478554972904560580780195603271612483749619035730072128460007220116961758402428796049783333223681488620221984636550950382415569788425033683385921743897634200931190579481716657856992875197315649355869771410867222908143510541319590081990750134269090732,65537,24580709077926620092044597552644293578345857265291819713044583762019889091207964073568161458804739458715380004434957967437606343043933001048031460204315561010346653890686793411514424415196735544767317833834873354780844688987895426437451628923551202414995434390331352210541261081218991147728656851435588281542821927947680997620259245155445014207429697565849156564251315760201267965288759078692695634602396216907138195404684647682172795883669338343228721466443314480641316732771827742321474271319939651686393329091959712489682268404241477393924334507448947669694217826663019016070298971335144331825007157671038461489053->31872219281407242025505148642475109331663948030010491344733687844358944945421064967310388547820970408352359213697487269225694990179009814674781374751323403257628081559561462351695605167675284372388551941279783515209238245831229026662363729380633136520288327292047232179909791526492877475417113579821717193807584807644097527647305469671333646868883650312280989663788656507661713409911267085806708237966730821529702498972114194166091819277582149433578383639532136271637219758962252614390071122773223025154710411681628917523557526099053858210363406122853294409830276270946292893988830514538950951686480580886602618927728470029090747400687617046511462665469446846624685614084264191213318074804549715573780408305977947238915527798680393538207482620648181504876534152430149355791756374642327623133843473947861771150672096834149014464956451480803326284417202116346454345929350148770746553056995922154382822307758515805142704373984019252210715650875853634697920708113806880196144197384637328982263167395073688501517286678083973976140696077590122053014085412828620051470085033364773099146103525313018873319293728800442101520384088109603555959893639842091339193933562195160113971681536251451271864444439514751477869229146103963298251667122

除了两个公钥的模数不一样,其他参数s和r结果也是一样的,难道这两个都不对吗?

雪    币: 279
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junzixinglu 活跃值 2022-5-11 13:30
9
0

那个签名我并没有简单的hash,我也是通过rsa的私钥来计算的

Signature sign = Signature.getInstance("SHA1withRSA");
sign.initSign(privateKey);
sign.update(bytes);
return sign.sign();

这个算法难道不对吗?

雪    币: 279
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junzixinglu 活跃值 2022-5-11 13:39
10
0
Signature sign = Signature.getInstance("SHA256withRSA");
sign.initSign(privateKey);
sign.update(bytes);
return sign.sign();

我换成sha256好像也还是不行,
雪    币: 279
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junzixinglu 活跃值 2022-5-11 13:49
11
0
guduzhe 规则我不是给了一个python脚本了么,生成了一下和你的规则不一致,应该是生成的签名是不对的。 这里还有一个生成规则的插件,你可以看一下,签名不是简单哈希算法,签名会填充数据到一定长度,还有生成 ...
我将您这个power-rule-plugin也打包进去做了测试,我发现并没有触发你这个里面的日志输出,那是不是就说明压根就没有走到你这个filter里面,意味着我都没进入到rsa验签的环节
雪    币: 4246
活跃值: 活跃值 (2207)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guduzhe 活跃值 2022-5-11 16:21
12
0

Key:  Sun RSA public key, 4096 bits 


power规则是替换签名的,这里参与运算的密钥的模是

860106576952879101192782278876319243486072481962999610484027161162448933268423045647258145695082284265933019120714643752088997312766689988016808929265129401027490891810902278465065056686129972085119605237470899952751915070244375173428976413406363879128531449407795115913715863867259163957682164040613505040314747660800424242248055421184038777878268502955477482203711835548014501087778959157112423823275878824729132393281517778742463067583320091009916141454657614089600126948087954465055321987012989937065785013284988096504657892738536613208311013047138019418152103262155848541574327484510025594166239784429845180875774012229784878903603491426732347994359380330103328705981064044872334790365894924494923595382470094461546336020961505275530597716457288511366082299255537762891238136381924520749228412559219346777184174219999640906007205260040707839706131662149325151230558316068068139406816080119906833578907759960298749494098180107991752250725928647349597506532778539709852254478061194098069801549845163358315116260915270480057699929968468068015735162890213859113563672040630687357054902747438421559817252127187138838514773245413540030800888215961904267348727206110582505606182944023582459006406137831940959195566364811905585377246353

这个长度需要是4096。所以你伪造的根证书的私钥需要按4096长度去生成,这样的签名长度才是符合的。不然你用其他长度私钥签名的去和4096的模去运算,直接就被长度给否定了。


密钥对的长度,实际就是指模的长度,模在RSA计算中就是起到截取的作用,模就是尺。

雪    币: 279
活跃值: 活跃值 (41)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
junzixinglu 活跃值 2022-5-11 17:22
13
0

终于搞定了,感谢大佬耐心指点,多谢多谢!


我自己不细心,在之前您让我看的那篇文章中已经出现过好几次4096这个字眼了,怪我怪我!


雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
wx_雨女无瓜 活跃值 2022-7-29 11:32
14
0
你好,我想咨询下 jetbrains的root certificate如何获取
雪    币: 4246
活跃值: 活跃值 (2207)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
guduzhe 活跃值 2022-7-29 19:02
15
0
https://github.com/JetBrains/marketplace-makemecoffee-plugin/blob/master/src/main/java/com/company/license/CheckLicense.java
雪    币: 1625
活跃值: 活跃值 (1310)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huangjw 活跃值 2022-7-29 23:43
16
0
i do not know,thank you for sharing
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
angelkyo028 活跃值 2022-9-28 13:16
17
3


写了一个注册机,欢迎品尝。



最后于 2022-9-28 14:56 被angelkyo028编辑 ,原因:
上传的附件:
雪    币: 284
活跃值: 活跃值 (217)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wangzhehyd 活跃值 2022-10-1 16:29
18
0
guduzhe Key: &nbsp;Sun RSA public key, 4096 bits&nbsp;power规则是替换签名的,这里参与运算的密钥的模是86010657695287910119 ...

这里的签名到底是怎么一回事,求指点

#自建证书和密钥
crt = sys.argv[1]
pem = sys.argv[2]

with open('key', 'r') as f:
    key = f.read()
licenseId, licensePartBase64, signatureBase64, certBase64 = key.split('-')

with open(crt, 'rb') as f:
    lines = f.read()
    crt = x509.load_pem_x509_certificate(lines, default_backend())
newCertBase64 = ''.join(lines.decode("utf-8").split('\n')[1:-2])
#print(newCertBase64)

# 自建证书的签名信息
sign = int.from_bytes(crt.signature, byteorder="big")
#print(sign)

# 自建证书sha256摘要结果
m = hashlib.sha256()
m.update(crt.tbs_certificate_bytes)
m.block_size
k = m.hexdigest()
print(k)

with open(pem, 'rb') as f:
   private_key = serialization.load_pem_private_key(f.read(), password=None, backend=default_backend())
#print(private_key)

with open('jetbrains_CA.pem', 'rb') as f:
   ca_public_key = serialization.load_pem_public_key(f.read(), backend=default_backend())

#print(licenseId, licensePartBase64, signatureBase64, certBase64)
#print('licensePart: ', base64.b64decode(licensePartBase64))

newLicensePart = base64.b64decode(licensePartBase64).decode('utf-8').replace('2025-08-01','2050-12-31').encode('utf-8')
newLicensePartBase64 = base64.b64encode(newLicensePart)
#print(newLicensePartBase64)

mgf = padding.MGF1(hashes.SHA256()) 
salt_length = padding.PSS.MAX_LENGTH 
sign = private_key.sign(newLicensePart, padding.PSS(mgf=mgf, salt_length=salt_length), hashes.SHA256())
#print(len(sign))
newSignatureBase64 = base64.b64encode(sign)
#print(sign)
#print(newSignatureBase64)

#private_key.public_key().verify(
crt.public_key().verify(
    sign,
    newLicensePart,
    padding.PSS(mgf=mgf, salt_length=salt_length),
    algorithm=hashes.SHA256(),
)

newKey = f"{licenseId}-{newLicensePartBase64.decode('utf-8')}-{newSignatureBase64.decode('utf-8')}-{newCertBase64}"
print(newKey)


雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mqk233 活跃值 2022-10-5 17:21
19
0
junzixinglu 大佬,我仔细阅读了您刚才发我的那篇文章,我用文章中您给出的key提取签名,直接使用System.out.println(new&nbsp;BigInteger(certificate.getS ...
兄弟,能指点一下怎么利用内置根证书生成自己的证书嘛
雪    币: 406
活跃值: 活跃值 (759)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
值得怀疑 活跃值 2022-10-6 09:57
20
0
angelkyo028 写了一个注册机,欢迎品尝。
其它的 比如 clion怎么生成key?
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
angelkyo028 活跃值 2022-10-8 09:48
21
0
值得怀疑 其它的 比如 clion怎么生成key?
{
       "licenseId": "6666688888",
       "licenseeName": "angelkyo",
       "assigneeName": "",
       "assigneeEmail": "",
       "licenseRestriction": "",
       "checkConcurrentUse": false,
       "products": [{
                       "code": "PSI",
                       "fallbackDate": "2299-12-31",
                       "paidUpTo": "2299-12-31",
                       "extended": true
               }, {
                       "code": "PSW",
                       "fallbackDate": "2299-12-31",
                       "paidUpTo": "2299-12-31",
                       "extended": true
               }, {
                       "code": "PWS",
                       "fallbackDate": "2299-12-31",
                       "paidUpTo": "2299-12-31",
                       "extended": true
               }, {
                       "code": "CL",
                       "fallbackDate": "2299-12-31",
                       "paidUpTo": "2299-12-31",
                       "extended": false
               }, {
                       "code": "PCWMP",
                       "fallbackDate": "2299-12-31",
                       "paidUpTo": "2299-12-31",
                       "extended": true
               }
       ],
       "metadata": "0120220902PSAN000005",
       "hash": "TRIAL:539819022",
       "gracePeriodDays": 7,
       "autoProlongated": false,
       "isAutoProlongated": false
}
雪    币: 406
活跃值: 活跃值 (759)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
值得怀疑 活跃值 2022-10-10 11:38
22
0
angelkyo028 { "licenseId": "6666688888", "licenseeName": "angelkyo", ...
嗯可以,但是这个power只能对应一个激活,要激活其它的要多个power.conf啊要每个ide都设置一个不同的插件··
雪    币: 8
活跃值: 活跃值 (2018)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wandering 活跃值 2022-10-10 13:04
23
0
值得怀疑 嗯可以,但是这个power只能对应一个激活,要激活其它的要多个power.conf啊要每个ide都设置一个不同的插件··
这个说法不是正确的
雪    币: 20
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mqk233 活跃值 2022-10-16 14:28
24
0
值得怀疑 嗯可以,但是这个power只能对应一个激活,要激活其它的要多个power.conf啊要每个ide都设置一个不同的插件··
楼上products里面code对应的软件都能激活
雪    币: 406
活跃值: 活跃值 (759)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
值得怀疑 活跃值 2022-10-16 15:18
25
0
mqk233 楼上products里面code对应的软件都能激活
不懂啥意思···我用他这个生成一个Clion的 key 和power.conf ,可以注册,生成idea的又有一个power.conf ,不替换power.conf就注册不了了啊
游客
登录 | 注册 方可回帖
返回