1.运行程序,随便输入Name和Serial,点击Check,没有任何提示,程序界面如下:

2.打开OD,载入程序,查找字串,看到“Success”、“Congratulations - you did it!”这些字眼,双击。


3.继续往上浏览代码,如下图。这段代码中,两次调用GetDlgItemTextA,在调用处下断,第一次调用获取输入的Name,第二次调用获取输入的Serial。

在此处下断点调试,发现401335处判断name的长度,应该不小于5


输入符合条件的name和serial进行调试,下图的代码实现循环取出Name和Serial的每个字节进行比较,满足以下条件即可通过校验:
Name的第一个字节=Serial的第一个字节-0
Name的第二个字节=Serial的第二个字节-1
Name的第三个字节=Serial的第三个字节-1

4.将此处代码je改成jmp,或者jmp short figugegl.0040137F,直接填充nop掉即可,目的都是不让程序跳转到0040137F

6.保存文件,并运行。


1.运行程序,随便输入Name和Serial,点击Check ,弹出对话框"Wrong Serial-try again"

2.使用OD搜索字符串功能,搜不到有用的字符串,字符串应该是被加密了,浏览代码,发现有两个地方调用了GetDlgItemTextA和GetDlgItemInt,在这两个地方下断。跟踪堆栈发现,调用GetDlgItemTextA获取输入的Name,调用GetDlgItemInt获取Serial。


eax中保存了用户输入的Serial,esi中保存了程序根据Name计算出的Serial,两者相等即通过验证。此处是爆破的关键,把jnz short figugegl.00401434这一句nop掉或者改为jz short figugegl.00401434。

6.保存文件,并运行。


1205

被折叠的 条评论
为什么被折叠?



