我在计算机A里有一个软件。
第一次安装时,需要输入一个UserKey才能使用。第一次输入UserKey后,使用时无需再输入任何Key。(就像软件许可证密钥一样。)
现在我想在另一台计算机 B 上使用该软件。我必须安装 .exe 文件。但是我忘记了 UserKey。
因为它是一个离线软件,所以我猜测UserKey保存在计算机A里面:
- 可能被加密,
- 可能在注册表中,
- 可能有一个 BIT 标记为 UserKey 已正确输入。
我可以完全访问计算机 A 和计算机 B。
计算机 A 是 Windows XP。计算机 B 最好是 Windows 7,但如果需要也可以是其他操作系统。
如何将带有 UserKey 的软件从计算机 A 移动到计算机 B?
答案1
如果不知道是什么软件,我们无法帮助你。但关键很可能是不是以任何可用形式存储在计算机上。例如,安装程序可能会不可逆地将密钥与计算机的硬盘序列号加密混合并存储。由于您没有原始密钥,因此无法将其与新计算机的硬盘序列号混合。
答案2
感谢所有试图提供帮助的人。我刚刚做到了(或者说破解了它 :-)
简而言之,注册表中确实有一个 KEY。我找不到它,因为它不在软件名称的路径下。在我复制了那个 KEY(并运用了一些编程知识)之后,它就像魔术一样起作用了。
这是我的步骤。
我做了一些研究,多很多谷歌搜索。我从这个网站开始教学如何使用 OllyDbg 获取程序的序列号。
然而,我发现这是一个Microsoft Visual C# / Basic .NET在聚乙烯亚胺。
我无法通过 OllyDbg 调试我的 .exe。本网站:
Olly 不是答案,因为它是一个 .Net 程序。因此请使用 Google 来查找可以帮助您的程序。
首先,我发现.NET 反编译器。这是一个很好的工具。在我第一次检查源代码后,我找到了关键方法,btnOK_Click()
这是检查 UserKey 的要点。遗憾的是,该方法内容被// trial
.NET 反编译器 (wtf) 屏蔽了,因为它不是免费软件,而且需要付费399 美元(对我来说也不少)。而且,我不确定购买 .NET 反编译器后是否能保证获得 UserKey。(反正这是我第一次购买)
然后我转向了其他免费替代品,例如情报间谍(免费)和.NET 反射器(14 天试用期)。
我终于可以检查该btnOK_Click
方法了:
private void btnOK_Click(object sender, EventArgs e)
{
this.pbcUserKey = Strings.Trim(this.txtUserKey1.Text + this.txtUserKey2.Text + this.txtUserKey3.Text + this.txtUserKey4.Text);
this.pbcUserKey = Strings.LSet(Strings.Trim(this.pbcUserKey), 16);
try
{
this.createUserKey = modCommon.XxGetUserID(ref this.pbcUserKey);
if (this.createUserKey)
{
MyProject.Forms.FrmLauncher.strUserID = this.pbcUserKey;
}
}
catch (Exception expr_86)
{
ProjectData.SetProjectError(expr_86);
Application.Exit();
ProjectData.ClearProjectError();
}
this.Close();
}
简单来说pbcUserKey
就是我们输入的 UserKey,要跟什么比对呢?传入 method 中modCommon.XxGetUserID()
:
[DllImport("XXGetUserkey.dll", CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
public static extern bool XxGetUserID([MarshalAs(UnmanagedType.VBByRefStr)] ref string userID);
又出现了一个障碍。这是一个外部方法,我们无法浏览它的源代码。我们只知道继续前进的方法应该是XXGetUserkey.dll
。相信我,我已经检查过这个 DLL 无数次了,但我没有运气。(我找不到IL 反汇编程序来自 M$ 顺便说一下)如果您有任何查看/反汇编/反编译 DLL 的工具,我们将非常感谢您的贡献!
我又开始思考整个流程。原本我想用 OllyDbg 来杜布格程序,而不是反编译。我希望如果我能找到一个真正调试 .NET 程序的工具,我可以检查寄存器和内存位置,看看我的输入与什么进行了比较(就像第一个网络链接中所说的那样)。这就是为什么我开始寻找“.NET 调试器”,而我没有费心去尝试其他反编译器,比如dotPeek或者这里提到的其他人。但是,除了M$官方的调试工具,我找不到其他的。
就此而言,我推测官方工具缺乏破解能力。这是真的吗?有没有邪恶的 .NET 调试器?(我需要名字 - #gangsters 模式)
走投无路,我开始另辟蹊径,现在调试和反编译都无法直接拿到UserKey,那如果跳过验证环节呢?
在反编译的源代码中,我发现除了 之外,XxGetUserID()
还被 所使用。然后我终于在 中找到了一点运气:prfBeforeLoad()
btnOK_Click()
prfBeforeLoad()
private bool prfBeforeLoad()
{
RegistryKey registryKey = Registry.CurrentUser.OpenSubKey("SOFTWARE\\XX-1234-12345678", false);
bool flag = false;
string left;
if (registryKey == null)
{
left = "";
}
else
{
left = Conversions.ToString(registryKey.GetValue("YY-11112222"));
}
// ...
bool flag2 = modCommon.XxGetUserID(ref left);
// ...
}
我查看了一下HKEY_CURRENT_USER\Software\XX-1234-12345678
,找到了键XX-1234-12345678
和值123456789ABCDEF0
。只需将这对键和值添加到计算机 B 中注册表的相应位置后,它就像魔术一样工作 - 无需再询问有关 UserKey 的任何信息 - 当然,这就是它的编码方式。B-)
附加曲目:
123456789ABCDEF0
实际上是 UserKey。在 GUI 中输入相同的 Key 即可激活软件,与修改注册表具有相同的效果。
总而言之:
这次我很幸运,因为 UserKey 明明存储在注册表中,而且我恰好在源代码中找到了它的路径(因为我猜想这只是一个简单的软件)。然而,有很多障碍我无法跨越:
如果密钥与计算机密钥(例如 MAC 地址)结合/加密,我的简单方法将会失败。
如果密钥没有存储在注册表中,也没有出现在代码中,例如它是在线检索的,目前我仍然无法调试 .NET可执行文件,就不可能获取用户密钥。
虽然我可以反编译并查看.NET程序的源代码,但Microsoft Visual C++ 6.0 DLL仍然是个谜。
这里还有一些(可能有用的)网络链接:
破解简单应用程序(绕过登录)- 其实是直接从源代码(汇编代码)中获取 Key,只是提供了截图,并没有提到工具名称。
基于 VB.NET / C# / Delphi / MC++ / Oxygene / F# 制作的破解程序- 通过检查 .NET Reflector 中的源代码来制作密钥生成器。复制身份验证行以生成密钥。
.NET DLL 破解指南 [1] 和[2]- 相当简短,但是一个很好的简单教程。.NET Reflector 无法打开我的XXGetUserkey.dll
。在 PEiD 中说它是Microsoft Visual C++ 6.0 DLL这可能是原因。