这一篇是给我自己备忘用的,不具备任何参考价值,误入的大佬可以忽略这篇文章
先搜索字符串“That license key is no longer valid”,找到引用的函数, 在上层函数可以找到注册函数,
注册函数里重点关注pubkey数组,和RSA_VERIFY验签就行,验签结束后后面有检查公钥HASH的四个字节。 pubkey数组异或0xfd(linux上是异或0x73)后得到一个DER格式的公钥,可以直接用python的Crypto.Pubkey.RSA直接importKey,可以看到公钥的e和n。
Sublime的License大概长这样
—– BEGIN LICENSE —–
User
Single User License
EA7E-888888
88888888 88888888 88888888 88888888
88888888 88888888 88888888 88888888
88888888 88888888 88888888 88888888
88888888 88888888 88888888 88888888
88888888 88888888 88888888 88888888
88888888 88888888 88888888 88888888
88888888 88888888 88888888 88888888
88888888 88888888 88888888 88888888
—— END LICENSE ——
前面3行是注册信息,后面的是签名,是拿前面三行”User\nSingle User License\nEA7E-888888” sha1之后,在前面填充,补齐到127字节后用私钥加密就是License后半部分了。
他填充的内容是01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003021300906052b0e03021a05000414
不知道这一串有没有什么用,但至少不同的hash都填这个也没问题。
EA7E应该和版本有关,这个不对就没法注册,后面的数字应该是类似License或用户ID一样的东西,软件里硬编码了很多这个ID,这些ID对应的License是黑名单,即使完成了验签也无法注册。
验签完成之后本地的部分就算是结束了。
搜索license_notification和/check/字符串,交叉引用找到对应的函数就是网验的函数了,这两个函数都是另外起的线程,和返回值没有关系,具体服务器返回之后怎么改变注册状态的还没有分析清楚,但只要这两个函数不work,就不会改变注册状态。
from Crypto.PublicKey import RSA
import hashlib
private_key = RSA.generate(1024,e=17)
public_key = private_key.publickey()
derKey = public_key.exportKey(format='DER')
signed = private_key.sign('01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff003021300906052b0e03021a05000414'.decode('hex')+hashlib.sha1("xxxxxxx").digest(),'')
print hex(signed[0])
print hex(signed[0])[2:-1]
verified = public_key.encrypt((hex(signed[0])[2:-1]).decode('hex'),'')
print (verified[0]).encode('hex')