whyida 发表于 2016-10-13 20:49

内存搜索在算法分析中的应用。

本帖最后由 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())

whyida 发表于 2016-10-15 10:07

Sound 发表于 2016-10-15 09:48
在输入用户名和注册码时会压入用户名, 这时候可以在用户处这里 看程序对用户名什么时候写入 什么时候访问 ...

现在明码比较越来越少了。一般是用户名计算得到一串数字再和密码计算后得到的数字比较,相等al=1否则al=0
注册失败。内存搜索只要能找到用户名离算法就很近了。

Sound 发表于 2016-10-15 09:48

在输入用户名和注册码时会压入用户名, 这时候可以在用户处这里 看程序对用户名什么时候写入 什么时候访问,做了什么操作。
最关键的是 使用了cmpstring , 属于程序设计的逻辑漏洞,跟Delphi 3没什么关系。

zhangbaida 发表于 2016-10-13 21:01

很不错的分析呀,学习了

whyida 发表于 2016-10-13 21:05

zhangbaida 发表于 2016-10-13 21:01
很不错的分析呀,学习了

delphi3的程序现在不容易见到。提供一个参考。

niutou20 发表于 2016-10-13 21:13

学习了!感谢1!!!!

朱朱你堕落了 发表于 2016-10-13 21:20

楼主辛苦了,感谢分享精彩分析!!!

whyida 发表于 2016-10-13 21:23

hahacker 发表于 2016-10-13 21:20
楼主辛苦了,感谢分享精彩分析!!!

delphi 程序调用内部的类或方法,到汇编代码上就是连续几层call ,用常规方法确实繁琐。

whyida 发表于 2016-10-13 21:30

whyida 发表于 2016-10-13 21:23
delphi 程序调用内部的类或方法,到汇编代码上就是连续几层call ,用常规方法确实繁琐。

写文章确实比调试累,第一次图片没了,又重改了一次。

朱朱你堕落了 发表于 2016-10-14 20:52

测试了N遍,只有一次成功断到内存断点。。这种方法太不稳定了,成功率太低,楼主可有别的高招?

whyida 发表于 2016-10-15 07:27

hahacker 发表于 2016-10-14 20:52
测试了N遍,只有一次成功断到内存断点。。这种方法太不稳定了,成功率太低,楼主可有别的高招?

xp下万能断点试试看。
页: [1] 2
查看完整版本: 内存搜索在算法分析中的应用。