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拖入IDA进行分析。尝试搜索其关键字符串。

1.2 验证

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

虽提示注册成功,但重启后还是待注册状态,对于Goldwave的分析得知对于注册码存在二次校验,程序注册后会将序列号写入注册表,每次启动是会调用写入的许可证,进行二次校验。
PS:分析时可以在IDA中导入sig文件、导出map文件有助于动态调式下的分析.
0x2.分析函数
一般程序在编写的时候至少会遵循功能和逻辑相分离的规范,或者说是函数封装的利用.对于函数应当按照功能和逻辑来拆分,拆分完毕后在对代码逐一分析。
2.1 函数逻辑:
动态分析时,控制用户名和注册码的输入,跟踪用户名和注册码的变化,可以此来大概了解函数运行的逻辑:
2.2 函数实现:
这边是利用输入的用户名+注册码完成序列号的后九位的计算。
之后程序会对用户名+许可证后九位进行一个拼接,写入注册表(HKEY_CURRENT_USER\Software\GoldWave\GoldWave\Options\License)。

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

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

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

通过用户名+新ID换算出序列号的后九位。
前后两次序列号做比较,如果验证相同那么就是成功。

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.编写注册函数:
通过对于注册函数的分析编写逆向注册函数,根据用户名得到对应的注册码.
Goldwave-5.7[逆向流程+算法分析]的更多相关文章
- TI(德州仪器) TMS320C674x逆向分析之一
一.声明 作者并不懂嵌入式开发,整个逆向流程都是根据自身逆向经验,一步一步摸索出来,有什么错误请批评指正,或者有更好的方法请不吝赐教.个人写作水平有限,文中会尽量把过程写清楚,有问题或是写的不清楚的地 ...
- iOS逆向实战与工具使用(微信添加好友自动确认)
iOS逆向实战与工具使用(微信添加好友自动确认) 原文链接 源码地址 WeChatPlugin-iOS Mac OS 版微信小助手(远程控制.消息防撤回.自动回复.微信多开) 一.前言 本篇主要实现在 ...
- ERP出入库进阶操作与子流程--开源软件诞生28
赤龙ERP出入库进阶讲解--第28篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redr ...
- Oracle EBS 寄售业务总结
总述: 须通过一揽子采购协议(BPA)明确采购方与供应商之间的寄售关系,及各种协议条款: 通过来源补充规则(Sourcing Rules)明确物料的供应商以及分配规则: 通过合格供应商列表(ASL)明 ...
- 转:Oracle EBS 寄售业务总结
转自:http://blog.vsharing.com/nicr/A1359214.html 总述: 须通过一揽子采购协议(BPA)明确采购方与供应商之间的寄售关系,及各种协议条款: 通过来源补充规则 ...
- 用 Smali 手写一个可运行的 HelloWorld!!!
一.前言 Android 的 App 实际上并不是运行在 Java 虚拟机中,而是运行在 Dalvik 虚拟机中.Dalvik 虚拟机对 Java 虚拟机做了一些额外的优化,让它更适用于移动设备.而 ...
- TFS线上生成环境发布历程
继前文 TFS在项目中Devops落地进程(上) TFS在项目中DevOps落地进程(下) 自从之前将开发环境使用TFS进行了自动化之后,就享受在此成果中,其他后续进度就停顿了好一段时间. 毕竟在我们 ...
- IDA Pro 权威指南学习笔记(五) - IDA 主要的数据显示窗口
在默认配置下,IDA(从 6.1 版开始)会在对新二进制文件的初始加载和分析阶段创建 7 个显示窗口 3 个立即可见的窗口分别为 IDA-View 窗口.函数窗口和消息输出窗口 可以通过 View - ...
- Java生鲜电商平台-生鲜售后系统的退款架构设计与代码分享
Java生鲜电商平台-生鲜售后系统的退款架构设计与代码分享 说明:任何一个电商行业都涉及到退货与退款的问题,但是生鲜电商行业还设有一个显著的特点,那就是换货.在人性面前,各种各样的退货,退款,换货的售 ...
随机推荐
- springboot之Filter指定过滤URL的常见问题
在使用Filter对一些自己指定的URL进行过滤拦截时,经常会出现如下错误: 1. 明明在@WebFilter(urlPatterns={"/app/online"})中过滤的是/ ...
- vue项目tips
在main.js引入了封装好的各组件,包括echarts.自定义组件等
- shift() 方法从数组中删除第一个元素,并返回该元素的值。此方法更改数组的长度。
let a = [1, 2, 3]; let b = a.shift(); console.log(a); // [2, 3] console.log(b); // 1 返回值 从数组中删除的元素; ...
- Loadrunner 50个Vusers并发创建3000个账号脚本调试以及场景运行
目标:用50个并发用户创建3000个账号到HP Web Server 分析: 1. Vugen录制脚本时,打开首页http://127.0.0.1:1080/WebTours/,进入注册账号界面不用重 ...
- java调用webservice方法
由于项目的历史原因,webservice服务端是乙方公司开发的,我们自己开发的系统需要去调用乙方公司的webservice接口.前面用了网上提供的一种方法(非生成代理类),怎么也调用不成功(也许是因为 ...
- Binder吐槽学习
通过 ProcessState::self()->startThreadPool()新加了一个Binder线程,然后通过IPCThreadState::self()->joinThread ...
- Eclipse设置所有新创建文件默认格式为UTF-8
一.为什么需要设置所有新创建文件默认格式为UTF-8 Eclipse编码默认是ISO-8859-1,不支持中文.而很多时候,我们的文件中含有中文,或者需要在创建文件时就需要是UTF-8编码格式的.在创 ...
- vim简单命令
保存文件:普通模式(在 :)后面 1.wq 2.q 3.!q 4.shirft+zz 直接退出vim 5.set nu 设置行号 行号移动: 1.shift+1;移动到该行末尾 2.shirft ...
- css3+html5特效-向上滑动
css+html5特效-向上滑动 效果描述:切换的下拉和上拉状态 鼠标悬浮:下拉鼠标离开:上拉 /*外容器设置*/ .box1{position:relative;top:100px;left:100 ...
- delete 和 delete [] 的真正区别
c++中对new申请的内存的释放方式有delete和delete[两种方式,到底这两者有什么区别呢? 1.我们通常从教科书上看到这样的说明: delete 释放new分配的单个对象指针指向的内存 de ...