本帖最后由 whyIDA 于 2016-10-13 21:02 编辑
最近看了一个帖子 “Context Note v1.2 keygen “(http://www.52pojie.cn/thread-540829-1-1.html)有好几个回帖反应有点困难,所以我也下载下来看看到底难在哪里。
查壳是 upx,esp定律搞定没什么好说的。delphi3 编译的程序。然后就开始分析,按钮事件,堆栈回溯都不怎么好用,无法到达算法核心。经过无数次的f7,f8 以及下各
种的断点。发现了一点规律,在xp 可以下lstrcmpA断点 可以得到真码,在win7 下无效。只能想其它方法-内存搜索。具体过程如下:
od 打开Context Note,输入用户名,假码点确定弹出信息框后不要点确定。
点击od 菜单栏内存(“m")按钮
右键查找二进值字符串
搜索用户名
下内存访问断点
搜索假码,真码就在旁边若隐若现
重新加载程序,输注册码,用户名点确定被断下。
可以清晰的看到edx的假码
用户名
用户名+字符串“Context Note v1.x“ md5 加密。
md5 值倒序
具体算法是 :
1 用户名+字符串“Context Note v1.x“ md5 加密。
2 字符串倒序
3 取字符串3~7位做第一组密码,所有字母大写。
4 第一组密码 md5 加密,取字符串3~7位做第二组密码,所有字母大写。
5 第二组密码 md5 加密,取字符串3~7位做第三组密码,所有字母大写。
6 第三组密码 md5 加密,取字符串3~7位做第四组密码,所有字母大写。
python源码
[Python] 纯文本查看 复制代码 import md5
s=""
s1=''
def KMD5(arg):
m1=md5.new()
m1.update(arg)
s=m1.hexdigest()
return s
def k1():
arg1='whyida Context Note v1.x'#用户名可以改。
s1=KMD5(arg1)
alist=list(s1)
alist.reverse()
alist=alist[3:7]
kong=""
y=kong.join(alist)
t=y.upper()
return t
def k2():
t=k1()
s2=KMD5(t)
s2=list(s2)
s2=s2[3:7]
thing=""
w=thing.join(s2)
v=w.upper()
return v
def k3():
u=k2()
s3=KMD5(u)
s3=list(s3)
s3=s3[3:7]
tmp=""
z=tmp.join(s3)
q=z.upper()
return q
def k4():
p=k3()
s4=KMD5(p)
s4=list(s4)
s4=s4[3:7]
xmp=""
x=xmp.join(s4)
r=x.upper()
return r
print(k1()+"-"+k2()+"-"+k3()+"-"+k4())
|