Goldwave-5.7[逆向流程+算法分析]

目标程序:Goldwave 5.7

分析工具:

1.OllyDbg

2.IDAPro

目的:用C语言写Goldwave-5.7的注册机。

0x0思路:

1.注册机准备:

功能:输入用户名后经过计算输出注册码.

函数:需要一个关键的计算函数.

2.实现注册机的计算函数:

计算函数可视为Goldwave的验证注册码函数的反向实现.

那么实现该计算函数的步骤如下:

1.定位关键注册函数.

2.分析关键注册函数.

3.复现关键注册函数.

4.反向复现计算函数.

步骤:

1.通过软件交互关系,定位关键函数.

2.分析关键函数的内部功能实现和逻辑.

3.根据分析内容编写计算函数.

0x1.定位函数

1.1 定位

  输入任意用户名和注册码尝试注册,从程序的报错信息可以获得一些有用的信息。

Goldwave-5.7[逆向流程+算法分析]

  提示错误信息有了,那就可以把Goldwave拖入IDA进行分析。尝试搜索其关键字符串。

Goldwave-5.7[逆向流程+算法分析]

1.2 验证

Goldwave-5.7[逆向流程+算法分析]

  上图中圈出的分支流程,如果将Jnz指令修改为Jz或Je而导致注册成功,那么就近函数就有可能是我们所需分析的注册函数。

Goldwave-5.7[逆向流程+算法分析]

  虽提示注册成功,但重启后还是待注册状态,对于Goldwave的分析得知对于注册码存在二次校验,程序注册后会将序列号写入注册表,每次启动是会调用写入的许可证,进行二次校验。

PS:分析时可以在IDA中导入sig文件、导出map文件有助于动态调式下的分析.

0x2.分析函数

  一般程序在编写的时候至少会遵循功能和逻辑相分离的规范,或者说是函数封装的利用.对于函数应当按照功能和逻辑来拆分,拆分完毕后在对代码逐一分析。

2.1 函数逻辑:

  动态分析时,控制用户名和注册码的输入,跟踪用户名和注册码的变化,可以此来大概了解函数运行的逻辑:

2.2 函数实现:

  这边是利用输入的用户名+注册码完成序列号的后九位的计算。

  之后程序会对用户名+许可证后九位进行一个拼接,写入注册表(HKEY_CURRENT_USER\Software\GoldWave\GoldWave\Options\License)。

Goldwave-5.7[逆向流程+算法分析]

  每次开启软件的时候,就会调用注册表的值进行序列号验证,使用的就是下面的函数:

Goldwave-5.7[逆向流程+算法分析]

  通过用户名+用户名第9位和第1位计算出新的用户ID

Goldwave-5.7[逆向流程+算法分析]

  接下来会进入验证函数。

  先对用户名做一个验证,会对用户名自身做一个计算,也需要用到计算机本地时间计算的值。

Goldwave-5.7[逆向流程+算法分析]

  通过用户名+新ID换算出序列号的后九位。

  前后两次序列号做比较,如果验证相同那么就是成功。

Goldwave-5.7[逆向流程+算法分析]

PS:写入注册表的位置这边就不贴了,获得标记数组的函数调用了不少字典,转来转去的,文字描述太过麻烦,有兴趣的可以自己去看看。

0x3.编写函数

DES算法一枚,那就偷个懒在IDA中将伪代码抠出稍作修改填了注册机的坑。

3.1计算函数:

KeyGen源码https://github.com/Schicksal0823/GoldWave_Keygen

有效注册码示例:

User ID: FFFFFFFFF

License: E5S8HVFS8

PS:先是通过用户名+注册码换算出序列号的后九位,然后通过用户名+用户名第9为和第1位换算出一个标记数组,再通过标记数组计算出新ID,最后通过用户名+新ID换算出序列号的后九位,两次序列号相同就完成。

0x4.总结:

编写注册机大致可以划分为三个步骤:

1.确认注册函数:

通过注册成功与失败的关键位置,修改关键变量或是修改JCC指令导致流程的改变,判断是否为关键Call.

2.分析注册函数:

通过自定义的输入数据加上函数分析,得出固定用户名对应的注册码.

3.编写注册函数:

通过对于注册函数的分析编写逆向注册函数,根据用户名得到对应的注册码.

上一篇:log4j:ERROR setFile(null,true) call failed


下一篇:Cglib学习报错 java.lang.reflect.InvocationTargetException-->null