可以看到这个要求输入序列号,验证其用户名和序列号是否正确的一个检验程序。
分析:
字符通常利用Windows文本框输入。为了检查输入的字符,程序太长才有下面这些函数吧文本框中的内容读出来。
16位 | 32位(ANSI) | 32位(unicode) |
GetDlgItemText | GetDlgItemTextA | GetDlgItemTextW |
GetwindowText | GeywindowTextA | GetDlgItemTextW |
因为这个程序是32位ASCII码的
所以直接上OllyDgb,设置为在模块入口处设断。
使用Ctrl+G可以定位我们想要的函数,我们将函数名直接输入,回车,就跳转到这个函数的入口地方,然后按F2,设断点,然后按F9让程序运行起来,接着就在运行着的程序中输入内容,当输入完后,按check按钮时,这时程序就调用了GetDlgItemTextA函数来获取文本框中的内容,然后去检查,因为设断了,我们可以看到OllyDgb上停在我们刚刚设断的地方。然后分析这一段代码
这就是我们停下的地方,上面除了原本程序自动解析的注释外,我还加上了直接的注释。
分析上面的程序流程,可以很明显的看出了,它调用了两次GetDlgItemTextA函数来分别获取两个编辑框的内容。
下面我们看到了一个很重要的函数,就是GenRegCode函数,这就是这个程序的核心代码,如果有兴趣的可以跟进去看一下验证的过程
但是我们的目的是让程序直接显示注册成功,可以看到004011F5中看到一个跳转指令,经发现就是这个跳转指令,决定显示对应得消息(失败或者成功)
我直接把它NOP掉
直接右键那上图所示
之后就保存文件
任意输入什么内容都会显示成功。但是长度一定要超过4.