175 lines
5.4 KiB
Python
175 lines
5.4 KiB
Python
import hashlib
|
||
import base64
|
||
import uuid
|
||
import subprocess
|
||
import platform
|
||
import logging
|
||
|
||
def get_windows_serial_number():
|
||
"""
|
||
获取Windows系统的唯一序列号
|
||
"""
|
||
try:
|
||
if platform.system() != "Windows":
|
||
raise Exception("此功能仅支持Windows系统")
|
||
|
||
# 使用WMIC获取BIOS序列号
|
||
result = subprocess.check_output(
|
||
'wmic bios get serialnumber',
|
||
shell=True,
|
||
stderr=subprocess.STDOUT,
|
||
text=True
|
||
)
|
||
|
||
# 解析输出结果
|
||
lines = result.strip().split('\n')
|
||
for line in lines:
|
||
if line.strip() and "SerialNumber" not in line:
|
||
serial = line.strip()
|
||
if serial and serial != "System Serial Number" and serial != "To be filled by O.E.M.":
|
||
return serial
|
||
|
||
# 如果无法获取BIOS序列号,尝试获取磁盘序列号
|
||
result = subprocess.check_output(
|
||
'wmic diskdrive get serialnumber',
|
||
shell=True,
|
||
stderr=subprocess.STDOUT,
|
||
text=True
|
||
)
|
||
|
||
lines = result.strip().split('\n')
|
||
for line in lines:
|
||
if line.strip() and "SerialNumber" not in line:
|
||
serial = line.strip()
|
||
if serial:
|
||
return serial
|
||
|
||
raise Exception("无法获取系统序列号")
|
||
|
||
except Exception as e:
|
||
logging.warning(f"获取Windows序列号失败: {e}")
|
||
# 返回一个备用标识符
|
||
return str(uuid.getnode())
|
||
|
||
def get_mac_address():
|
||
"""
|
||
获取MAC地址
|
||
"""
|
||
try:
|
||
# 获取本机的MAC地址
|
||
mac = uuid.getnode()
|
||
mac_str = ':'.join(("%012X" % mac)[i:i+2] for i in range(0, 12, 2))
|
||
return mac_str
|
||
except Exception as e:
|
||
logging.error(f"获取MAC地址失败: {e}")
|
||
return "00:00:00:00:00:00"
|
||
|
||
def triple_hash_sha384(data):
|
||
"""
|
||
对数据进行三次连续的SHA384哈希计算
|
||
"""
|
||
print(f"原始数据: {data}")
|
||
|
||
# 第一次SHA384
|
||
hash1 = hashlib.sha384(data.encode('utf-8')).hexdigest()
|
||
print(f"第一次SHA384: {hash1}")
|
||
|
||
# 第二次SHA384
|
||
hash2 = hashlib.sha384(hash1.encode('utf-8')).hexdigest()
|
||
print(f"第二次SHA384: {hash2}")
|
||
|
||
# 第三次SHA384
|
||
hash3 = hashlib.sha384(hash2.encode('utf-8')).hexdigest()
|
||
print(f"第三次SHA384: {hash3}")
|
||
|
||
return hash3
|
||
|
||
def triple_hash_sha256(data):
|
||
"""
|
||
对数据进行三次连续的SHA256哈希计算
|
||
"""
|
||
print(f"原始数据: {data}")
|
||
|
||
# 第一次SHA256
|
||
hash1 = hashlib.sha256(data.encode('utf-8')).hexdigest()
|
||
print(f"第一次SHA256: {hash1}")
|
||
|
||
# 第二次SHA256
|
||
hash2 = hashlib.sha256(hash1.encode('utf-8')).hexdigest()
|
||
print(f"第二次SHA256: {hash2}")
|
||
|
||
# 第三次SHA256
|
||
hash3 = hashlib.sha256(hash2.encode('utf-8')).hexdigest()
|
||
print(f"第三次SHA256: {hash3}")
|
||
|
||
return hash3
|
||
|
||
def main():
|
||
"""
|
||
主函数
|
||
"""
|
||
print("=" * 50)
|
||
print("开始生成许可证文件")
|
||
print("=" * 50)
|
||
|
||
try:
|
||
# 1. 获取Windows序列号和MAC地址
|
||
print("\n步骤1: 获取系统信息")
|
||
serial_number = get_windows_serial_number()
|
||
mac_address = get_mac_address()
|
||
|
||
print(f"系统序列号: {serial_number}")
|
||
print(f"MAC地址: {mac_address}")
|
||
|
||
# 2. 对序列号进行三次SHA384计算
|
||
print("\n步骤2: 对序列号进行三次SHA384计算")
|
||
serial_hash = triple_hash_sha384(serial_number)
|
||
|
||
# 3. 对MAC地址进行三次SHA256计算
|
||
print("\n步骤3: 对MAC地址进行三次SHA256计算")
|
||
mac_hash = triple_hash_sha256(mac_address)
|
||
|
||
# 4. 拼接两个哈希值并进行Base64编码
|
||
print("\n步骤4: 拼接哈希值并进行Base64编码")
|
||
combined_hash = serial_hash + mac_hash
|
||
print(f"拼接后的哈希值: {combined_hash}")
|
||
|
||
base64_encoded = base64.b64encode(combined_hash.encode('utf-8')).decode('utf-8')
|
||
print(f"Base64编码结果: {base64_encoded}")
|
||
|
||
# 5. 对Base64结果进行三次SHA384计算
|
||
print("\n步骤5: 对Base64结果进行三次SHA384计算")
|
||
final_hash = triple_hash_sha384(base64_encoded)
|
||
|
||
# 6. 对最终哈希值进行Base64编码
|
||
print("\n步骤6: 对最终哈希值进行Base64编码")
|
||
final_base64 = base64.b64encode(final_hash.encode('utf-8')).decode('utf-8')
|
||
print(f"最终Base64序列: {final_base64}")
|
||
|
||
# 7. 保存到lic文件
|
||
print("\n步骤7: 保存到文件")
|
||
with open('license', 'w', encoding='utf-8') as f:
|
||
f.write(final_base64)
|
||
|
||
print(f"许可证文件已保存到: {os.path.abspath('lic')}")
|
||
|
||
# 8. 成功日志
|
||
print("\n" + "=" * 50)
|
||
print("许可证生成成功!")
|
||
print("=" * 50)
|
||
|
||
# 显示文件内容预览
|
||
print(f"生成的许可证内容 (前50字符): {final_base64[:50]}...")
|
||
|
||
except Exception as e:
|
||
print(f"\n错误: {e}")
|
||
logging.error(f"许可证生成失败: {e}")
|
||
|
||
if __name__ == "__main__":
|
||
# 配置日志
|
||
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
|
||
|
||
# 导入os模块(在需要时导入)
|
||
import os
|
||
|
||
main() |