运行分析
- 需要破解Name和Serial,写出注册机
PE分析
- Delphi程序,32位,无壳
静态分析&动态调试
- ida搜索关键字符串,跳转到关键代码
- 静态分析,修改变量如上,关键在于sub_427A20函数返回值需要大于等于12345678
- 开始动态调试
- 进入sub_427A20函数,对Name和Serial做好注释分析,向下分析到76行,发现关键判断
- v19和serials相等,则返回值为12345678,满足主函数的条件
- 跳转到第一个分析点:38行,目标是得到v2
- 这个循环逻辑是取出Name每个字符进行累加、移位计算
- 第47行v2 < 0,因v2为int,范围是-2147483648~2147483647,当v2<=0x7ffffffff时为整数,当v2>0x7fffffff时为负数
- 计算公式中有个常量off_428880,双击查看值为LANNYDIBANDINGINANAKEKHYANGNGENTOT
- 进入到第一个分析点:59行,目标是得到v19
- 首先对刚刚得到的 v2 与 0x12345678 进行亦或,赋值给v10
- 再将v10转数字字符串,获取数字个数v11
- 循环v11次,每次循环都得到byte_428884[v10 % 10]字符,并将v10 = v10/10
- 最终拼接byte_428884[v10 % 10]字符得到v19字符串
- 双击byte_428884,找到值为LANNY5646521
算法分析
from ctypes import *
Name = 'concealbear'
Serial = ''
# 第一个分析点
v2 = c_uint32(0)
v8 = c_uint32(0)
v10 = c_uint32(0)
off_428880 = 'LANNYDIBANDINGINANAKEKHYANGNGENTOT'
for i in range(len(Name)):
v8.value = ord(Name[i]) + v2.value
v2.value = ord(off_428880[i]) | (v8.value << 8)
if v2.value > 0x7fffffff: # 因v2为int,范围是-2147483648~2147483647,当v2<=0x7ffffffff时为整数,当v2>0x7fffffff时为负数
v2.value = -v2.value
# 第二个分析点
v10 = v2.value ^ 0x12345678
byte_428884 = 'LANNY5646521'
for i in range(len(str(v10))):
Serial += byte_428884[v10 % 10]
v10 //= 10
print(Name + '的Serial为:\n' + Serial)
- 验证成功