FinalShell 所有版本(含 4.5、4.6)离线激活码生成详解
🧐 为什么需要离线激活码?
FinalShell 是一款支持多平台的远程终端管理工具。在某些网络受限环境下,在线激活可能失败或超时,此时可以通过离线授权码完成手动激活。
实际上,不同版本的 FinalShell 在生成授权码时使用了不同的加密规则,但它们的本质是:哈希 + 盐值。
⚠️ 本工具仅供学习和研究用途,请支持正版软件,尊重开发者的劳动成果!
算法核心思路
离线授权码本质是对「机器码 + 盐」进行散列处理后,从结果中截取某一段作为激活码:
| 版本范围 | 使用算法 | 盐值构造 |
|---|---|---|
| < 3.9.6(高级版) | MD5 | 61305 + 机器码 + 8552 |
| < 3.9.6(专业版) | MD5 | 2356 + 机器码 + 13593 |
| >= 3.9.6(高级版) | Keccak384 | 机器码 + hSf(78cvVlS5E |
| >= 3.9.6(专业版) | Keccak384 | 机器码 + FF3Go(*Xvbb5s2 |
| 4.5(高级版 / 专业版) | Keccak384 | 机器码 + wcegS3gzA$ / b(xxkHn%z);x |
| 4.6(高级版 / 专业版) | Keccak384 | 机器码 + csSf5*xlkgYSX,y / Scfg*ZkvJZc,s,Y |
获取机器码步骤
要使用激活码生成工具,首先需要获取 FinalShell 的机器码,步骤如下:
- 打开 FinalShell 软件。
- 点击右上角的同步状态选项。
- 点击登录账号。
- 输入任意账号和密码。
- 点击离线激活选项。
- 复制显示的机器码(类似:
cuanmu@123456789)。
建议复制后先粘贴到记事本中,确认前后无空格或换行,再用于计算授权码。
使用步骤
- 按上方步骤获取并复制机器码。
- 使用下方的 HTML 或 Python 工具计算授权码。
- 将生成结果粘贴到 FinalShell 的离线激活输入框。
浏览器版激活码计算工具
FinalShell 离线激活
若未显示,请使用备用入口:https://finalshell.cuanmu.com/
代码示例(Python / HTML)
Python 版
使用 pycryptodome 进行哈希计算:
from Crypto.Hash import MD5, keccak
def calc_md5(data: str) -> str:
return MD5.new(data.encode()).hexdigest()
def calc_keccak384(data: str) -> str:
return keccak.new(data=data.encode(), digest_bits=384).hexdigest()
def show_activation_codes(machine_id: str) -> None:
v396_adv = calc_md5(f"61305{machine_id}8552")[8:24]
v396_pro = calc_md5(f"2356{machine_id}13593")[8:24]
gte396_adv = calc_keccak384(f"{machine_id}hSf(78cvVlS5E")[12:28]
gte396_pro = calc_keccak384(f"{machine_id}FF3Go(*Xvbb5s2")[12:28]
v45_adv = calc_keccak384(f"{machine_id}wcegS3gzA$")[12:28]
v45_pro = calc_keccak384(f"{machine_id}b(xxkHn%z);x")[12:28]
v46_adv = calc_keccak384(f"{machine_id}csSf5*xlkgYSX,y")[12:28]
v46_pro = calc_keccak384(f"{machine_id}Scfg*ZkvJZc,s,Y")[12:28]
print("FinalShell 离线激活码(示例)")
print(f"<3.9.6 高级版: {v396_adv}")
print(f"<3.9.6 专业版: {v396_pro}")
print(f">=3.9.6 高级版: {gte396_adv}")
print(f">=3.9.6 专业版: {gte396_pro}")
print(f"4.5 高级版: {v45_adv}")
print(f"4.5 专业版: {v45_pro}")
print(f"4.6 高级版: {v46_adv}")
print(f"4.6 专业版: {v46_pro}")
if __name__ == "__main__":
machine_id = input("请输入机器码: ").strip()
show_activation_codes(machine_id)HTML 版
将以下代码保存为 finalshell-offline-code.html,用浏览器打开即可使用:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>FinalShell 离线激活码生成</title>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.1.1/crypto-js.min.js"></script>
<style>
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "PingFang SC", "Microsoft YaHei", sans-serif;
padding: 2rem 1rem;
background: #f5f5f5;
margin: 0;
}
.box {
background: #fff;
padding: 1.5rem;
border-radius: 10px;
max-width: 560px;
margin: 0 auto;
box-shadow: 0 6px 20px rgba(0, 0, 0, 0.08);
}
h2 {
margin: 0 0 1rem;
font-size: 1.25rem;
}
input,
button {
box-sizing: border-box;
padding: 0.65rem 0.75rem;
width: 100%;
margin-top: 0.75rem;
border-radius: 8px;
border: 1px solid #ddd;
font-size: 0.95rem;
}
button {
cursor: pointer;
border: none;
background: #1677ff;
color: #fff;
font-weight: 600;
}
.result {
margin-top: 1rem;
white-space: pre-wrap;
background: #fafafa;
border: 1px solid #eee;
border-radius: 8px;
padding: 0.75rem;
line-height: 1.6;
}
</style>
</head>
<body>
<div class="box">
<h2>离线激活码生成器</h2>
<input id="machineCode" type="text" placeholder="请输入机器码..." />
<button onclick="generate()">生成授权码</button>
<div class="result" id="output"></div>
</div>
<script>
function md5(str) {
return CryptoJS.MD5(str).toString();
}
function keccak384(str) {
return CryptoJS.SHA3(str, { outputLength: 384 }).toString();
}
function generate() {
const code = document.getElementById("machineCode").value.trim();
const out = document.getElementById("output");
if (!code) {
out.textContent = "请输入机器码后再生成。";
return;
}
let res = "";
res += "FinalShell < 3.9.6\n";
res += "高级版: " + md5("61305" + code + "8552").slice(8, 24) + "\n";
res += "专业版: " + md5("2356" + code + "13593").slice(8, 24) + "\n\n";
res += "FinalShell >= 3.9.6\n";
res += "高级版: " + keccak384(code + "hSf(78cvVlS5E").slice(12, 28) + "\n";
res += "专业版: " + keccak384(code + "FF3Go(*Xvbb5s2").slice(12, 28) + "\n\n";
res += "FinalShell 4.5\n";
res += "高级版: " + keccak384(code + "wcegS3gzA$").slice(12, 28) + "\n";
res += "专业版: " + keccak384(code + "b(xxkHn%z);x").slice(12, 28) + "\n\n";
res += "FinalShell 4.6\n";
res += "高级版: " + keccak384(code + "csSf5*xlkgYSX,y").slice(12, 28) + "\n";
res += "专业版: " + keccak384(code + "Scfg*ZkvJZc,s,Y").slice(12, 28) + "\n";
out.textContent = res;
}
</script>
</body>
</html>常见问题
1. 为什么生成后仍提示无效?
可能原因如下:
系统已缓存旧授权信息
建议重启软件或清理缓存后重新尝试。网络校验未被拦截
软件可能仍在连接远程服务器进行二次验证。已触发在线校验机制
某些版本(如4.6.5)在检测到异常后会主动失效,需要结合下方屏蔽措施使用。
2. 如何防止被二次校验 / 恶意回连?
为避免软件连接远程服务器导致再次失效或异常,建议进行以下屏蔽操作。
手动修改
修改 Hosts
将相关域名指向本地,阻断解析:
Hosts 文件位置:
Windows:
C:\Windows\System32\drivers\etc\hostsLinux / macOS:
/etc/hosts
添加以下内容:
127.0.0.1 www.youtusoft.com
127.0.0.1 youtusoft.com
127.0.0.1 hostbuf.com
127.0.0.1 www.hostbuf.com
127.0.0.1 dkys.org
127.0.0.1 tcpspeed.com
127.0.0.1 www.wn1998.com
127.0.0.1 wn1998.com
127.0.0.1 pwlt.wn1998.com
127.0.0.1 backup.www.hostbuf.com防火墙屏蔽 IP
在系统防火墙或安全软件(如火绒)中阻止以下 IP 的出站连接:
101.32.72.254
45.56.98.223
193.9.44.7
103.99.178.153
47.76.185.223🧱 Windows 防火墙设置步骤
- 打开「Windows Defender 防火墙」
- 点击「高级设置」
- 选择「出站规则」→「新建规则」
- 类型选择「自定义」或「IP」
- 在远程 IP 中填写上述地址
- 操作选择「阻止连接」
- 保存规则即可
Windows(PowerShell)
# === 配置区域 ===
$hostsPath = "$env:SystemRoot\System32\drivers\etc\hosts"
$domains = @(
"www.youtusoft.com",
"youtusoft.com",
"hostbuf.com",
"www.hostbuf.com",
"dkys.org",
"tcpspeed.com",
"www.wn1998.com",
"wn1998.com",
"pwlt.wn1998.com",
"backup.www.hostbuf.com"
)
$ips = @(
"101.32.72.254",
"45.56.98.223",
"193.9.44.7",
"103.99.178.153",
"47.76.185.223"
)
# === 写入 Hosts ===
Write-Host "正在写入 Hosts..."
foreach ($domain in $domains) {
$entry = "127.0.0.1 $domain"
if (-not (Select-String -Path $hostsPath -Pattern $domain -Quiet)) {
Add-Content -Path $hostsPath -Value $entry
}
}
# === 刷新 DNS ===
ipconfig /flushdns
# === 添加防火墙规则 ===
Write-Host "正在添加防火墙规则..."
foreach ($ip in $ips) {
if (-not (Get-NetFirewallRule -DisplayName "Block_$ip" -ErrorAction SilentlyContinue)) {
New-NetFirewallRule -DisplayName "Block_$ip" `
-Direction Outbound `
-RemoteAddress $ip `
-Action Block
}
}
Write-Host "✅ 完成!建议重启软件"回滚(恢复)
# 删除 hosts 规则
$hostsPath = "$env:SystemRoot\System32\drivers\etc\hosts"
(Get-Content $hostsPath) | Where-Object {
$_ -notmatch "youtusoft|hostbuf|dkys|tcpspeed|wn1998"
} | Set-Content $hostsPath
# 删除防火墙规则
Get-NetFirewallRule | Where-Object {
$_.DisplayName -like "Block_*"
} | Remove-NetFirewallRule
ipconfig /flushdns
Write-Host "已恢复"Linux / macOS
#!/bin/bash
HOSTS_FILE="/etc/hosts"
DOMAINS=(
"www.youtusoft.com"
"youtusoft.com"
"hostbuf.com"
"www.hostbuf.com"
"dkys.org"
"tcpspeed.com"
"www.wn1998.com"
"wn1998.com"
"pwlt.wn1998.com"
"backup.www.hostbuf.com"
)
echo "写入 hosts..."
for domain in "${DOMAINS[@]}"; do
if ! grep -q "$domain" $HOSTS_FILE; then
echo "127.0.0.1 $domain" | sudo tee -a $HOSTS_FILE
fi
done
echo "刷新 DNS..."
# macOS
sudo dscacheutil -flushcache 2>/dev/null
sudo killall -HUP mDNSResponder 2>/dev/null
# Linux(通用尝试)
sudo systemctl restart NetworkManager 2>/dev/null
echo "完成"