Crackme 4

来源:互联网 发布:linux简单管道 编辑:程序博客网 时间:2024/05/16 06:03

刚接触这题有点蒙蔽,做了好长时间才搞懂
以后给自己个提议首先寻找比较函数 就是说先找到那个strcmp因为往往这个地方就是判断你输入的序列号对不对的地方
接着在这里找到生成的序列号之后去找算法,算法往往在此之前。
这里写图片描述
发现没有注册按钮 首先来PEID
这里写图片描述
没有壳
首先用OD调试,没有跳出什么输入错误之类的东西,所以没有CMP不好调试
利用dede反编译工具
这里写图片描述

看到有几个函数
chkcode
这里写图片描述
下断点

找到了一个serial
这里写图片描述
那么生成算法就在上面了 找吧同时发现了一些猫腻
首先找到了黑头,并且已经入栈了
这里写图片描述
5 和字符串也已经入栈了 哈哈哈
这里写图片描述
name 入栈 万事具备只差东风
这里写图片描述
接下来的 strcat 函数下断点 估计是把以上字符串粘贴在一起吧
这里写图片描述
单击界面中间的矩形阴影
每次都会且只会在Panel1Click事件断下:
这里写图片描述
这里写图片描述
Panel1Click事件
这里写图片描述

...00457FCA .. MOV ESI,EAX                    ; ESI = EAX...00458031 .. CMP DWORD PTR DS:[ESI+30C],85  ; Mem[ESI+30C] == 0x850045803B .. JNZ SHORT CKme.004580B3        ; if not equal, end...00458094 .. XOR EDX,EDX00458096 .. MOV EAX,DWORD PTR DS:[ESI+2F0]0045809C .. CALL CKme.00423260             ; 去除矩形阴影004580A1 .. MOV EAX,DWORD PTR DS:[45B820]004580A6 .. ADD EAX,70                     ; EAX = addr where store addr of "如果注册成功,程序中会出现..."004580A9 .. MOV EDX,CKme.00458114          ; EDX = addr where store "恭喜恭喜!注册成功!"004580AE .. CALL CKme.00403950             ; 修改输入框提示为注册成功004580B3 .. XOR EAX,EAX

在chkcode事件中我们知道,如果注册码正确,内存[ESI+30C]被赋值0x3E,否则内存[ESI+30C]等于0,显然都不等于0x85,因此0x0045803B处的指令会发生跳转,程序结束,就像什么也没发生。
显然,要让0x0045803B处的指令不跳转,那么内存[ESI+30C]的值就必须是0x85,所以应该还有其他地方会对[ESI+30C]进行写操作。
双击界面中间的矩形阴影
每次都会依次在Panel1Click、Panel1DblClick和chkcode三个事件断下,我们来看看双击事件:
这里写图片描述
这里写图片描述

...00457E8E .. MOV ESI,EAX                   ; ESI = EAX...00457EF5 .. CMP DWORD PTR DS:[ESI+30C],3E ; Mem[ESI+30C] == 0x3E00457EFC .. JNZ SHORT CKme.00457F08       ; not equal => end00457EFE .. MOV DWORD PTR DS:[ESI+30C],85 ; equal => Mem[ESI+30C] = 0x85

在chkcode事件中我们知道,如果注册码正确,内存[ESI+30C]被赋值0x3E,否则内存[ESI+30C]等于0;
因此,若是注册码正确,内存[ESI+30C]会再次被赋值为0x85,否则内存[ESI+30C]依旧等于0。
答案依旧很明显了

内存[ESI+30C]初始值为0;若是注册码正确,在chkcode事件中,内存[ESI+30C]被赋值0x3E,在Panel1DblClick事件(双击矩形阴影进行触发)中被进一步赋值0x85,从而在Panel1Click事件(单击或双击矩形阴影进行触发)中0x0045803B处的指令就不会发生跳转,从而反馈注册成功的信息,最后界面的矩形阴影会被一幅照片取代。
如果要爆破,只需将0x0045803B处的跳转指令NOP掉即可。

注册机

# coding=utf8s = raw_input("name:")print "黑头Sun Bird"+str(len(s)+5)+"dseloffc-012-OK"+s
0 0