用C#编写一个ReSharper的Keygen

发布在 技术

免责声明

  • 仅技术学习研究未对外传播过任何相关工具

前言

经常搞 .NET 的都知道 ReSharper ,非常好用,就是要收费。所以研究了下他是如何生成注册码的。

核心

主要代码如下,需要依赖 BigIntegerPrivateKeyPublicKey 已经打码,咋们仅仅是技术学习研究。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ReSharperKeygen
{
public class KeyGen
{
private const string PrivateKey = "348*********080286*********0936*********194468";
private const string PublicKey = "348*********802*********215865425*********16793";

public string CompanyName { get; set; }

public string UserName { get; set; }

public KeyGen()
{
CompanyName = string.Empty;
}

public string GetLicense()
{
var bigInteger = (new BigInteger(ushort.MaxValue) << 72) + new BigInteger(UserHash()) + (new BigInteger(ushort.MaxValue) << 56);
var n = new BigInteger(PublicKey, 10);
var exp = (new BigInteger(StringToBytesConverter.Old(UserName)) | 1).modInverse(new BigInteger(PrivateKey, 10));
return Convert.ToBase64String(bigInteger.modPow(exp, n).getBytes());
}

private int UserHash()
{
var num = 0;
for (var index = 0; index < UserName.Length; ++index)
num = ((num << 7) + UserName[index]) % 65521;
for (var index = 0; index < CompanyName.Length; ++index)
num = ((num << 7) + CompanyName[index]) % 65521;
return num;
}
}
}

截图

查询QQ群成员与好友的交集

发布在 技术

前言

最近在公司和同事一起处理问题的时候,发现他的 QQ 群消息提醒,QQ 群的名字很熟悉,于是我回到自己工位看了下自己的 QQ,发现我们在一个技术群里面。这就很尴尬了,之前没少在这群里吹牛,都被我同事静静的看着。

我看了下,我有近 100 个 QQ 群,为了避免以后有类似的尴尬,我想到能不能写一个工具来查询这些群里面有哪些是我的好友。

QQ 登录授权

要获取相关数据,肯定是要先登录授权的。找到了 QQ 群的官方网站 https://qun.qq.com/,打开开发者工具-网络,然后再进行登录进行网络请求查看。

发现不少参数是通过计算后得到的,而且登录时大概率是会遇到验证码的。

考虑到这类工具的特点,所以首选直接通过 WebBrowserhttps://qun.qq.com/打开,手动登录后,再去获取相关 cookies 等数据信息即可。

但今天稍微改变下,还是通过WebBrowserhttps://qun.qq.com/打开,不过WebBrowser是完全隐藏不可见的。

我们自己搞一个界面,把输入的账号密码传递给 WebBrowser,再进行登录操作,如果遇到验证码,再把验证码传递回来,在自己的界面输入后再给到 WebBrowser 完成登录。

最终的登录界面如下:

获取相关数据

通过一段时间的探索,在 QQ 官方网站里面,找到了相关接口:

获取好友列表和群列表

1
var url = $"http://user.qzone.qq.com/p/r/cgi-bin/tfriend/friend_show_qqfriends.cgi?uin={Account}&follow_flag=0&groupface_flag=1&fupdate=1&g_tk={Gtk}&callbackFun=GetGroupAndFriends";

获取一个群的群成员

1
var url = $"http://qun.qzone.qq.com/cgi-bin/get_group_member?uin={Account}&groupid={groupId}&g_tk={Gtk}&callbackFun=GetGroupMember";

上面的 Gtk 的生成方式参考代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public int GetGtk(List<Cookie> cookies)
{
int gtk = 0;
foreach (var item in cookies)
{
if (item.Name == "skey")
{
int hash = 5381;
string str = item.Value;
for (int i = 0, len = str.Length; i < len; ++i)
{
hash += (hash << 5) + str.ElementAt(i);
}
gtk = hash & 0x7fffffff;
}
}
return gtk;
}

因为一次只能获取到一个群里的成员,需要调用很多次接口,所以再加了一个加载界面:

数据展示

使用的 echarts 简单的展示出来,鼠标放在圆点上会显示出好友名称或 QQ 群名。

仔细看了上面的数据,得到以下一些数据:

  • 有几个朋友从小学、初中到高中都在一个班级上学。
  • 还有一位朋友甚至还是同一所大学,虽然交流的很少。
  • 还有一位网友,从多个.NET 技术群到多个前端技术群都有他。
  • 最关键的来了,查出 3 名现在公司的同事在不同的技术群里。于是我给这几个技术群的群名备注了下,完美解决了问题。

前言

Windows7 操作系统已经发布了 2 个月左右了,今天发现室友新买的联想笔记本电脑登录界面和我安装的 Windows7 登录界面并不一样,他的是包含了联想 Logo 的背景图片,而我的是官方默认的。

如何修改

然后我搜索研究了下,果然找到了修改方法。

主要是通过修改注册表中的 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\LogonUI\Background 下的 OEMBackground 键值。然后把图片放置到 C:\Windows\System32\oobe\info\backgrounds\backgroundDefault.jpg 即可。

于是有了这个工具,并增加了每次开机随机更换一个图片的功能。

我已经发布到电脑报天极网天空软件等知名站点,欢迎大家下载使用。

截图

  • 第 1 页 共 1 页
作者的图片

YaoWorld

热爱编程,热爱生活。

前端工程师

中国-成都