上操作系统课的老师给我们发了一个大工程编辑软件 Source Insight 3,还是没有注册过的,我就拿来分析了一下,发现注册函数很简单 (o°ω°o)。8 说了,开整

PS. 资源在文末,非商用目的,仅供学习交流使用


找到注册函数

打开软件,就让输入序列号:

1

随便输一个 123

1

将 exe 拖入 ida,在文字窗口搜索 “You typed”,找到一个匹配项

1

检查交叉引用,来到函数 sub_4495B1

1

可以看到左下角有成功注册的提示,往上找找,可以看到是 sub_445B07 函数的返回值(test eax, eax)将验证结果区分开来,若想成功注册,就得使 sub_445B07 返回非零

再往上看看,调用 sub_445B07 之前压入了一个字节数组的地址(0x5E5BFC),再之前,还调用了 strupr 函数将这个字节数组每个字符转化为大写,所以猜测该字节数组为我们的输入序列号字符串,sub_445B07 则为注册函数


分析

sub_445B07 的伪代码:

1

结构很清晰,序列号应该分三段,连接符号是 ‘-‘,形如 XXXX-XXXX-XXXX,一段一段地检查

第一段:

1

其中的 sub_414738 函数如下:

1

也就是说第一段应与全局变量 aSi3us 相同,故第一段为 “SI3US”


第二段:

1

这里将我们输入序列号的中间部分取出来,长度得是 6,并且调用 atoi 函数将其转换为数值,这个数不能在元素个数为 23 的 int 数组 dword_53CA80 中


第三段:

1

长度应该为 5,且调用了 sub_4F62D4 函数,并向其传递第二段的地址,推测第三段的产生与第二段相关

sub_4F62D4:

1

很简单的逻辑,初始化 v4 为第二段 atoi 的值,拿第二段的 6 个字符逐位与 dword_5A8A54 数组中的值异或,每次异或完加上 4 * v4,最后再模 0x186A0

所以注册码应该形似 SI3US-XXXXXX-xxxxx


python 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import random

# ~ first
f = "SI3US"

# ~ middle
# ~ d1 = dword_53CA80
d1 = [12345, 123456, 234567, 345678, 456789, 567890, 678901, 622800, \
765392, 622800, 197704, 197497, 569235, 197497, 1977, 995216, \
655206, 567890, 62368, 197497, 567890, 25263, 685]
d1 = set(d1)
# ~ abort the forbidden 23 digits in d1
d1 = list(set(range(100000, 999999)) - d1)
d1 = ["%06d" % i for i in d1]
m = random.choice(d1)

# ~ last
# ~ d2 = dword_5A8A54
d2 = [0x96, 0x95, 0x10, 0x23, 7, 0x15, 8, 3, 0x10, 0x11]
l = int(m)
for i in range(6):
l = (d2[i] ^ ord(m[i])) + 4 * l
l %= 0x186A0

print("%s-%s-%05d" % (f, m, l))

资源

链接:网盘
提取码:8ww4