逆向破解:CreakeMe-01
0x 01 环境准备
吾爱破解虚拟机、OD、PEID、汇编金手指
注:Win7系统对于模块和程序开启了随机初始地址的功能,会给分析带来很大的负担,所以不建议使用Win7进行分析。
0x 02 程序运行
1. 程序运行方式
首先打开程序,查看程序各个功能,如下:
该功能窗口是输入name 和 key,进行校验。错误会弹出窗口提示。
另一个主功能窗口是输入key进行校验。错误会弹出错误提示。
0x 03 程序分析
首先运行程序,随意输入name与key,点击运行,弹出错误窗口。
此时使用F12暂停服法分析,点击F12停止程序,Ctrl+K,或者点击K按钮跳转到调用堆栈窗口。
首先看到堆栈窗口调用两次窗口函数。77D5082F这个空间疑似是系统领空,地址空间太大,0042A1AE是程序领空,可以进行分析。右键显示调用(show call)。
定位到调用函数
之后再向上翻看,看到函数入口,在这里下个断点:
重新运行程序,执行到断点出,可以看到已经有了ascii字符串出现包括我们输入的。将这个字符串输入到程序中,发现正确,所以可以确定这个断点是在程序算法结束之后,需要向前分析。
我们在堆栈窗口找到最近的返回,右键反汇编窗口跟随
之后可以看到jump等判断语句,初步判断这就是算法程序入口点,在函数入口点下断点。
逐步分析可以利用反汇编窗口下的那个小窗口,可以看到程序执行时各个寄存是的数值:
接下来分析到有个系统固定值,就可以知道这里是0x29.
逐步分析发现确实是算法真正的入口地点。经过分析之后程序基本算法是:
- 判断name字段长度是否大于4,大于4可以执行,反之返回错误。
- 首先获取程序name输入的第一个字符,转换成ANSI,比如1就是
- 与0x29想乘
- 获得结果再自增一倍
- 转换成十进制,加上CW-****-CRACKED
接下来分析第二个注册码功能
首先运行程序,弹出错误窗口。
Ctrl + K 查看堆栈窗口,发现窗口函数,右键显示调用。在函数入口地址下断点,继续跟进在堆栈窗口发现疑似字符串。点击返回函数,汇编窗口跟随发现真正函数入口。
接下来就是分析函数真正算法!
算法分析:
- 获取输入的长度与固定字符串Hello Dude!进行比对
- 将输入的第一个字符与固定字符串必定,之后逐个比对知道全部正确。
0x4 注册机编写
本次使用Python编写
# -*- coding: cp936 -*-
import binascii
def creake():
name = raw_input(“输入用户名:”)
data = 0x29
FirStr = name[0:1]
FirStrAnst = int(binascii.b2a_hex(FirStr),16)
Result = (FirStrAnst * data)*2 #相乘,自增一倍
ResultStr = “CW-“+ str(Result) + “-CRACKED”
print “破 解 码 为:”+ResultStr
if __name__ == ‘__main__’:
creake()