最近很忙,但是忙里偷闲,把CrackMe 3 搞定了,代码定位是个难题,没了字符串和敏感函数,代码定位成了问题,然后有内存校验,于是无法爆破,没关系,从头来。
OLLYDBG强的没边,Windows是消息驱动的(不懂的同学请恶补Windows编程知识),我们就对WindowsAPI调用进行监视,消息触发中断,没错,就是那个确定按钮,当单击该按钮肯定要进行序列号的计算,于是就拿到那个按钮的句柄,下消息触发202断点,随便输入点什么之后再F9,发现进入了系统函数的领空,之后再给 .text下断点,再F9,注册代码肯定在这附近。
以下是核心算法代码,函数被我重命名并且注释
.text:0040168A call ?UpdateData@CWnd@@QAEHH@Z ; CWnd::UpdateData(int)
.text:0040168F lea ecx, [esi+74h]
.text:00401692 call ds:??B?$CSimpleStringT@D$00@ATL@@QBEPBDXZ ; ATL::CSimpleStringT<char,1>::operator char const *(void)
.text:00401698 lea edx, [esp+20h]
.text:0040169C lea esp, [esp+0]
.text:004016A0
.text:004016A0 NameCopy: ; CODE XREF: .text:004016A8j
.text:004016A0 mov cl, [eax] ; 拷贝Name字符串到ESP+20H
.text:004016A2 inc eax ; 取Name字符串的字符ANSI值
.text:004016A3 mov [edx], cl ; Name字符串值给EDX指向内存,ESP+20H处
.text:004016A5 inc edx ; 指向下一个
.text:004016A6 test cl, cl ; 检测是否是最后
.text:004016A8 jnz short NameCopy ; 拷贝Name字符串到ESP+20H
.text:004016AA xor eax, eax
.text:004016AC mov cl, 30h &n
OLLYDBG强的没边,Windows是消息驱动的(不懂的同学请恶补Windows编程知识),我们就对WindowsAPI调用进行监视,消息触发中断,没错,就是那个确定按钮,当单击该按钮肯定要进行序列号的计算,于是就拿到那个按钮的句柄,下消息触发202断点,随便输入点什么之后再F9,发现进入了系统函数的领空,之后再给 .text下断点,再F9,注册代码肯定在这附近。
以下是核心算法代码,函数被我重命名并且注释
.text:0040168A call ?UpdateData@CWnd@@QAEHH@Z ; CWnd::UpdateData(int)
.text:0040168F lea ecx, [esi+74h]
.text:00401692 call ds:??B?$CSimpleStringT@D$00@ATL@@QBEPBDXZ ; ATL::CSimpleStringT<char,1>::operator char const *(void)
.text:00401698 lea edx, [esp+20h]
.text:0040169C lea esp, [esp+0]
.text:004016A0
.text:004016A0 NameCopy: ; CODE XREF: .text:004016A8j
.text:004016A0 mov cl, [eax] ; 拷贝Name字符串到ESP+20H
.text:004016A2 inc eax ; 取Name字符串的字符ANSI值
.text:004016A3 mov [edx], cl ; Name字符串值给EDX指向内存,ESP+20H处
.text:004016A5 inc edx ; 指向下一个
.text:004016A6 test cl, cl ; 检测是否是最后
.text:004016A8 jnz short NameCopy ; 拷贝Name字符串到ESP+20H
.text:004016AA xor eax, eax
.text:004016AC mov cl, 30h &n