运行程序
info
exit
查壳
没壳
载入OD分析
刚载入OD发现要使用 ACG.key
搜一下字符串看看
发现这有貌似成功相关的字符串
进去看看
可以找到关键跳
爆破的话直接在这就可以完成
上面就该是算法了
算法分析
开始先判断文件存在和文件内容大小
读取文件内容,发现程序在原有的字符里加了个 ‘y’,
之后逐个字符判断,每个字符都要满足要求,但是程序只判断了前12个,最后的 ‘y’ 也没有判断
key满足了
下面就要验证输入的
往下找,就有获取输入的内容
在第一个获取位置下个断,调试
Name要等于5
通过用户名循环判断
最后通过Name 和 Serial 计算
算法分析(注册机)
def genKeyFile():
xor_list = [0x168, 0x160, 0x170, 0xec, 0x13c, 0x1cc, 0x1f8, 0xec, 0x164, 0x1f8, 0x1a0, 0x1bc]
key = ''
for i in xor_list:
key += chr(((0 ^ i) // 4) ^ 0x1b)
with open("ACG.key", "w") as f:
f.write(key)
print(key)
def NameToSerial(name):
sum_name = 0
if(len(name) == 0x5):
for i in name:
sum_name += ord(i)
sum_name *= 8
sum_name ^= 0x515A5
print(hex(sum_name))
# 计算Name对应的Serial
serial = (0 ^ 0x797E7) - sum_name
serial ^= 0x87ca
print("Name:", name)
print("Serial:", serial)
else:
print("用户名长度为5")
genKeyFile()
NameToSerial('sword')
暴力破解
修改0x4012DF
即可
总结
有KeyFile,还有Name和Serial 的校验
一直都是在计算等式(=0),Serial计算的步骤虽然多,但是可以通过等式,免去很多步骤。
当然,破解算法中,可以通过Serial来反推要输入的Name。