目标程序:editplus 5.0
分析工具:
1.ollyDbg
2.IDAPro
知识储备:
1.应用程序的编写流程.
2.ASM汇编语言的无障碍阅读.
3.开发语言,如:C++、C、python等.
目的:用C语言写editplus-5.0的注册机。
思路:
1.注册机是什么,有哪些功能,如何编写注册机?
答:
功能:输入用户名后经过计算输出注册码.
函数:需要一个关键的计算函数.
2.如何实现注册机的计算函数?
答:
计算函数可视为editplus的验证注册码函数的反向实现.
那么实现该计算函数的步骤如下:
1.定位关键验证函数.
2.分析关键验证函数.
3.复现关键验证函数.
4.反向复现计算函数.
步骤:
整理思路可得如下图:
步骤如下:
1.对api下断,经过堆栈回溯定位关键函数.
2.分析关键函数的内部功能实现和逻辑.
3.根据分析内容编写验证函数和计算函数.
1.定位函数
1.1 定位
一般注册验证的流程如下,从程序的报错信息可以猜测为程序调用了MessageBox类函数,对该函数下断后堆栈回溯到CheckInfo()函数位置处.
1.2 验证
上述的if...else分支流程在汇编层会像如下的伪代码所述,那么如果将jnz指令修改为jz或je而导致注册成功,那么CheckInfo函数就是我们所需分析的验证函数.
对于editplus的分析得知对于注册码存在二次校验,校验失败如下图所示:
PS:分析时可以在IDA中导入sig文件、导出map文件有助于动态调式下的分析.
2.分析函数
一般程序在编写的时候至少会遵循功能和逻辑相分离的规范,或者说是函数封装的利用.对于函数应当按照功能和逻辑来拆分,拆分完毕后在对代码逐一分析.总而言之就是先分析整体汇编逻辑后写好C语言函数的逻辑,然后把汇编代码块还原到C语言函数的具体实现中.
个人感觉汇编代码的阅读分三种情况:
1.甲骨文翻译.
2.英语阅读理解.
3.看金庸小说.
CheckInfo函数拆解如下:
2.1 函数逻辑:
控制用户名和注册码的输入,在动态分析时有助于代码的分析(Name:Weaving Code:00000-00000-00000-00000-00000),保证用户名不变的情况下根据分析结果去修改Code.可以手动得出一条注册码:(注册码格式分析代码可得)
3.编写函数
3.1验证函数:验证的算法可以由上分析整合可以得出。
3.2计算函数:KeyGen源码: https://github.com/muxurousec/KeyGen-editplus
有效注册码示例:
总结:
注册机的分析+编写流程,首先是在对于能够造成当前的窗口界面(MessageBox)或是将要进行的操作(leftClick)的背后所对应的API函数的下断,然后再复现情景的时候在通过断点加上堆栈回溯基本可以确定验证函数的所在位置.在确定位置后注册机的编写分大致就可以划分为三个步骤:
1.确认验证函数:
修改函数返回值或是修改JCC指令导致流程的改变,判断是否为关键Call.
2.分析验证函数:
通过自定义的输入数据加上函数分析,得出固定用户名对应的注册码.
3.编写注册函数:
通过对于验证函数的分析编写注册函数,得出随机用户名对应的注册码.
PS:此类工具一般不会对程序进行加壳或是混淆的操作,用来打发时间最适合不过~~
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/3788.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
休息一下~~