运行分析
- 需要破解Name和Serial
PE分析
- C++程序,32位,无壳
静态分析&动态调试
- ida找到关键字符串,双击进入函数
- 通过静态分析发现:
- 1、Name通过计算得到Name1
- 2、对Name1第3、5、6分别插入byte_401290、byte_401290、word_401292,得到Name2
- 3、双击byte_401290,发现值为0x2D;双击word_401292,发现值为0x647861
- 4、Name2与Serial比较,相等则返回成功
- C++函数补充知识点:
- std::string::operator=(a,b) // 字符串a = 字符串b
- std::string::string(str) // 设置字符串
- std::string::insert(str,5,str1) // 在str的第5位插入str1
算法分析
Name = 'concealbear'
Name1 = [ord(i)for i in Name]
byte_401290 = 0x2D
word_401292 = [0x64,0x78,0x61]
# 对Name进行计算,得到Name1
for i in range(len(Name)):
Name1[i] = Name1[i] + len(Name1) - 4
Name1[i] = Name1[i] - len(Name1) - 2
Name1[i] += 2
# 对Name1进入插入操作
Name1.insert(3,byte_401290)
Name1.insert(5,byte_401290)
Name1.insert(6,word_401292[0])
Name1.insert(6,word_401292[1])
Name1.insert(6,word_401292[2])
Serial = "".join([chr(i)for i in Name1])
print(Name + '的Serial为:\n' + Serial)
- 验证成功