仅供学习研究,请勿用于非法用途
对应版本:7.1.5
核心逻辑位置 LINQPad.GUI.dll
UIProgram.Go 函数原型 private static void Go(string[] stringArgs)
License存储Path linqpad_isolated_storage_file_write_error,每个机器转换后具体路径可能变化,使用 IsolatedStorageFile ,isAllUser=false 即可
\IsolatedStorage\vasholup.yqx\t0ujezos.ksr\StrongName.vpk5fbjezs2y52c0vybdnwee1y5l4co3\StrongName.vpk5fbjezs2y52c0vybdnwee1y5l4co3\Files
对于7.7.15以上版本,License存储路径发生了变化,路径计算函数
// Token: 0x060008D8 RID: 2264 RVA: 0x00037F7C File Offset: 0x0003617C
internal static string smethod_0()
{
return Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "LINQPad\\license.xml");
}
示例结果:
C:\Users\Administrator\AppData\Local\LINQPad\license.xml
程序会从资源中读取(LINQPad.UI.assemblies.Resources.bin)并解压Resources.dll后动态加载
License读取逻辑位于资源文件Resources.bin中,此文件经过 Deflate 算法压缩,需要解压才能还原。还原后是一个被严重混淆的.net程序集
其中Deflate处理逻辑位于(InternalAssemblyExtractor,对应版本7.7.15),对应函数原型(public static bool DecompressResource(string resourceName, Stream outputStream, Assembly assembly))
保护信息
尝试使用 de4dot-reactor-6.7 去混淆后,可以找到关键代码LicenseManager.Register LicenseManager.GetLicensee等
License格式(以下均为16进制)
固定头部 0601+2字节License数据长度+2字节RSA签名数据长度+License数据+签名数据
License数据格式
AES算法加密 KEY=IV=md5(当前机器名(Environment.MachineName))
被加密数据格式
当前用户名(Environment.UserName)
未知 "."
未知 -1
未知 -1
未知 "Document"
未知 "HeaderText"
未知 "FooterText"
许可证编号 GUID bytes
过期时间(Ticks)
未知 2
未知 -1
版本列表 "V5V6"
产品版本 "PERM"
搜索字符串 Licensed to
可以找到关键验证位置
使用xml存储License信息
License格式
<Root>
<Code></Code>
<Licensee></Licensee>
</Root>
关键字段
LicenseManager.LicenseKind
如果=1,并且注册名称不为空的话,检查授权数量,如果也同时=1,则为单用户授权,否则为多用户授权
关键算法
搜索以下字符串(7.7.15版本,以前的版本应该也适用)
BgIAAACkAABSU0ExAAQAAAEAAQDXOFZtugmJgpEuap2hC7zyDVEKZh/TFGsiR0loDYYQyzA52CRrqSdmTcTw2AgiAAJazu/lRYmFpn4wIvuDCgz/fJyYGF81v+NqUhySpYgT+RBw84vF5H3yQBq0OXmTXy2w4PqQKapWvt7FAw6eDXpC538/RxJU5tReqGCStwVy4Q==
然后替换为(来自7.6.6版本)
BwIAAACkAABSU0EyAAQAAAEAAQBFtstFzq2GgWryQbNhAZqCv7RQAvmQx6TEri2WPjEn5iTMOd8o1gM4a+ba7ZJ9+Hk3FIM82l4St5JfdMRKTfg//pd1f+DowAIZq290+p07YMcVfEJoIbKixYJyGn3ouuk0zhflBA64NfIF5hR3lNTJUP67DNfV6SB9V6TJdzdUtxWg8u2yzJLy0PSOxV8LLeTRKB+S2e8K5217fpcCoJSxl9nSA1CmSqdFEfUpROuWR62zJde9VfmPCG3QnXivY99xGQ1/8ofBZj/0+/jXhoEzMSe34VBfrnxM/n9G0acg62cDTP3bls4GT/E8lNVQqEnXNxULNceZ3xbbbamFbRfSXVR9eZLyGFGKBXgUpxkVgmhjLNQM8nMmviykUmjQGOD+Na0OGSj6ytwZnelszJeWMXQUUK7kOHrFjVL3j3H0wuFZnCwsd1w/LzEHC3wSqEhzQR62FGRAX/FarhgK7PMDekCfBal32Q42zzHkr32CyS84dbc7LqjiwAMgukUN76lzoUOdKlQqLBxINfDf/CgylzYDd7VoMpEj+JGpaK71/QKuI8uwcO9RXzr4bhJI5BKAKztHK+6zwdtK4oe/tWdYkeGKnhodr3JXAqLPDB14lqLI/pNeQAHeb86RdjvqF6Hl2+mJj2KGh9N2NKBrDLG9GotbP+f3grrjWnm+dYjS9s3yRfdaPqS8/sIINsrdWjcqGuarxM84R8bmKNSnSVyRK/DUFIGyeLuSxpOR1a4I6pMR1zK//joATgKQ3y7Uqyk=
修改前,搜索结果有4处,其中需要注意,只需要替换前三处的值,最后一处,即函数原型为internal static void smethod_6(Guid guid_0)
的这个,应将整个函数nop掉,因为这个函数的作用是校验被加载程序集publicKey,以确定文件是否被修改,所以必须被patch掉.否则会报错(TypeLoadException).
此外修改后在7.7.15版本输入时会有一个类型加载异常,暂不清楚原因.解决办法为patch掉UIProgram中的ProcessException函数(直接return,函数原型 internal static void ProcessException(Exception ex, bool reportThread = false))
搞定
原程序程序集PublicKey(LINQPad.UI.assemblies.Resources.dll)
ACQAAASAAACUAAAABgIAAAAkAABSU0ExAAQAAAEAAQC1/JDnAn9nhx53Oo/eiTjIHdQCumW5IB1gWT6WxJJlHoicwT8UFeu1P6wRMa4L0zPF7mAhZy2XGOoxqK69DaAHLyXYfbpvyQ/9WY7U2jXkTDmMRUMH6OM7hCYUPa7J9ZaDb5fI90dQ5ZdcZOIYn0Xe9GsqKxJHrcNlK/XDCAVdqQ==
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。