内存搜索在算法分析中的应用。
本帖最后由 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源码
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
kong=""
y=kong.join(alist)
t=y.upper()
return t
def k2():
t=k1()
s2=KMD5(t)
s2=list(s2)
s2=s2
thing=""
w=thing.join(s2)
v=w.upper()
return v
def k3():
u=k2()
s3=KMD5(u)
s3=list(s3)
s3=s3
tmp=""
z=tmp.join(s3)
q=z.upper()
return q
def k4():
p=k3()
s4=KMD5(p)
s4=list(s4)
s4=s4
xmp=""
x=xmp.join(s4)
r=x.upper()
return r
print(k1()+"-"+k2()+"-"+k3()+"-"+k4())
Sound 发表于 2016-10-15 09:48
在输入用户名和注册码时会压入用户名, 这时候可以在用户处这里 看程序对用户名什么时候写入 什么时候访问 ...
现在明码比较越来越少了。一般是用户名计算得到一串数字再和密码计算后得到的数字比较,相等al=1否则al=0
注册失败。内存搜索只要能找到用户名离算法就很近了。 在输入用户名和注册码时会压入用户名, 这时候可以在用户处这里 看程序对用户名什么时候写入 什么时候访问,做了什么操作。
最关键的是 使用了cmpstring , 属于程序设计的逻辑漏洞,跟Delphi 3没什么关系。 很不错的分析呀,学习了 zhangbaida 发表于 2016-10-13 21:01
很不错的分析呀,学习了
delphi3的程序现在不容易见到。提供一个参考。 学习了!感谢1!!!! 楼主辛苦了,感谢分享精彩分析!!! hahacker 发表于 2016-10-13 21:20
楼主辛苦了,感谢分享精彩分析!!!
delphi 程序调用内部的类或方法,到汇编代码上就是连续几层call ,用常规方法确实繁琐。 whyida 发表于 2016-10-13 21:23
delphi 程序调用内部的类或方法,到汇编代码上就是连续几层call ,用常规方法确实繁琐。
写文章确实比调试累,第一次图片没了,又重改了一次。 测试了N遍,只有一次成功断到内存断点。。这种方法太不稳定了,成功率太低,楼主可有别的高招? hahacker 发表于 2016-10-14 20:52
测试了N遍,只有一次成功断到内存断点。。这种方法太不稳定了,成功率太低,楼主可有别的高招?
xp下万能断点试试看。
页:
[1]
2