运行分析
- 运行发现需要输入Name和Serial
PE分析
- VB程序,32位,无壳
静态分析
- ida无法反编译,使用x32dbg发现关键字符串,进入主函数
- 找到关键跳转
- 初步分析,找到vbaLenBstr:取Name长度
动态调试
- 上面有一个vbaStrCat拼接函数,其中一个参数为AKA-,猜测应该是与其他字符拼接后得到Serial
- 在找到关键比较,F2下断点,输入Name=abcde,Serial=12345运行,发现已显示出了真正Serial为AKA-487752
- 运行发现破解成功,但是也发现了一个问题,当Name改变时,对应的Serial也会发生变化,接下来分析Name和Serial之间的算法(难度较大)
- 从vbaLenBstr处向下动态调式,监视Serial相关地址变化,发现执行00402458地址处函数后,上述地址发生变化。而此函数的eax来自于上一个函数vbaStrI4函数,通过调式发现vbaStrI4函数为关键算法函数
- 对vbaStrI4函数两个参数进行分析,发现与Name首字母和长度有关
- edi = length * 0x17CFB
- edi = edi + ord(Name[0])
- F7 进入vbaStrI4函数,再向下进入Ordinal#110函数,继续向下进入oleaut32.sub_75C8A9B5函数
- 找到两处关键算法,第一个是常规计算,第二个是字符串反转
算法分析
import binascii
Name = 'concealbear'
Serial1 = 'AKA-'
Serial2 = ''
length = len(Name) # 获取Name长度
edi = length * 0x17CFB
edi = edi + ord(Name[0])
ebx = edi
# 关键算法中的常规计算
while 1:
if ebx != 0:
esi = 0xA
edx = 0
eax = ebx
edx = eax % esi
eax = ebx
ecx = edx
edx = 0
eax = eax // esi
ebx = eax
eax = ecx + 30
Serial2 += binascii.a2b_hex(str(eax)).decode()
else:
break
# 关键算法中的字符串逆转
Serial2 = Serial2[::-1]
serial = Serial1 + Serial2 # 拼接Serial
print(Name + "的Serial为:" + serial)
- 输入任意Name,得到Serial,验证成功