运行分析
- 需破解Name和Serial,点击OK没反应
PE分析
- ASM程序,32位,无壳
静态分析&动态调试
- ida找到关键字符串
- 进行静态分析,逻辑如下:
- 1、Name长度大于4,小于21
- 2、fun_1返回值为1
- 对func_1进行动态调试分析,逻辑如下:
- 1、循环一:通过提取Name每一位计算int_1,再对int_1进行反转和ror运算
- 2、循环二:Serial必须存在’-‘,int_2 = Serial第一个’-'之前的字符数
- 3、循环三:判断Serial遇到’-'的字符必须为大写字母
- 4、循环四:提取Serial每一位,进行累加计算得到v11,v11要等于int_1
- 5、Serial遇到第一个’-'后的字符数为3
- 6、对Serial后3位进行计算,得到int_6、int_7、int_8,需满足:
- int_6 = 516
- int_7 = 25
- int_8 = 13
算法分析
from ctypes import *Name = 'concealbear'# 循环一:通过提取Name每一位计算int_1
int_1 = c_uint32(0)
v3 = 1
for i in range(len(Name)-1,-1,-1):v4 = v3 * (v3 ^ ord(Name[i]));v3 += 5;int_1.value = int_1.value ^ v4;int_1.value = (int_1.value << 5) | (int_1.value >> (32 - 5));
int_1.value = ~int_1.value
int_1.value = ((int_1.value >> len(Name)) | (int_1.value << (32 - len(Name)))) & ((1 << 32) - 1)# 循环四:提取Serial在'-'前每一位字符,进行累加计算得到v11,下面是逆向算法,假设有19位
Serial = ''
for i in range(1,20):k = int_1.value % pow(26,i)if i-1 != 0:k = k // pow(26,i-1)Serial += chr(65 + k)
Serial += '-'# 对Serial后3位进行计算,查看是否满足要求,采用3位爆破字符
for s_1 in range(32,128):for s_2 in range(32, 128):for s_3 in range(32, 128):int_3 = s_1;int_4 = s_2;int_5 = s_3;int_6 = 3 * int_3;v13 = int_3;int_6 -= int_4;int_7 = 2 * int_4 - 7 * v13;int_8 = int_4 + int_3;int_6 += 5 * int_5;int_7 += 7 * int_5;int_8 -= 2 * int_5;if int_6 == 516 and int_7 == 25 and int_8 == 13:s = chr(s_1) + chr(s_2) + chr(s_3)Serial += sprint(Serial)
- 循环四采用逆向算法,假设Serial在’-'前的字符为19位,逐位求余%pow(26,i),再÷pow(,26i-1),得到Serial相对于65的差值k
- 求Serial最后3位采用爆破算法
- 验证成功