运行分析
- 提示去除NAG
- 不去除NAG也能进入主窗口,需要破解Name和Serial
PE分析
- ASM程序,32位,壳未知
去除NAG
- ida搜索字符串,发现NAG弹窗标题字符串,双击进入函数
- 找到了messagebox,即NAG位置00401079
- 打开x64dbg,定位到该位置
- ctrl + 9 使用NOP填充
- 点击菜单栏下方的修补按钮
- 在弹出来的窗口中点击修补文件,另存为1.exe
- 打开1.exe,发现NAG去除成功
静态分析&动态调试
- 回到ida最底部,对关键函数进行分析,注释如上,还需要对几个未知函数进行分析
- sub_4011F3作用是给String赋值
- String = ‘tsrh-’ + (Name_length+2003) + ‘-’
- sub_40122E作用是,将Name每个字符进行计算,结果拼接在String后面
- sub_401287的作用是,将Name每个字符串进行和String11位以后得字符进行计算,结果赋值给String第9位之后
- sub_4012D8作用是判断Seirl和String前(10+length(Name))位是否相等
算法分析
Name = 'concealbear'
String = 'tsrh-' + str(len(Name) + 2003) + '-'
# sub_40122E
for i in range(len(Name)):
v4 = ord(Name[i]) + 12
String += hex((v4 + v4 - 17 - len(String)) ^ v4)[2:].upper()
# sub_401287
Strings = [ord(i) for i in String]
i = 1
while i != 16:
if i == 1:
j = Strings[i + 11] ^ (ord(Name[i - 1]) + 1)
else:
j = ord(Name[i - 1]) + 1
while j < 65:
j += 8
while j > 90:
j -= 3
v2 = i + 9
Strings[v2] = j
i = v2 - 8
if i == len(Name) + 1:
break
Serial = "".join([chr(Strings[i]) for i in range(len(Name) + 10)]) # 取String的前(len(Name) + 10)位
print(Name + '的Serial为:\n' + Serial)
- 需要注意的是,验证时要重启程序,否则会因之前内存导致验证失败
- 重启程序,输入Name和Serial,验证成功