如我输入的 CCDebuger 是9个字符。如下图所示:

现在我们来按 F8 键一步步分析一下:
00440F2C |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 把我们输入的内容送到EAX,我这里是“CCDebuger”
00440F2F |. BA 14104400 MOV EDX,CrackMe3.00441014 ; ASCII "Registered User"
00440F34 |. E8 F32BFCFF CALL CrackMe3.00403B2C ; 关键,要用F7跟进去
00440F39 |. 75 51 JNZ SHORT CrackMe3.00440F8C ; 这里跳走就完蛋
当我们按 F8 键走到 00440F34 |. E8 F32BFCFF CALL CrackMe3.00403B2C 这一句时,我们按一下 F7 键,进入这个 CALL,进去后光标停在这一句:

我们所看到的那些 PUSH EBX、 PUSH ESI 等都是调用子程序保存堆栈时用的指令,不用管它,按 F8 键一步步过来,我们只关心关键部分:
00403B2C /$ 53 PUSH EBX
00403B2D |. 56 PUSH ESI
00403B2E |. 57 PUSH EDI
00403B2F |. 89C6 MOV ESI,EAX ; 把EAX内我们输入的用户名送到 ESI
00403B31 |. 89D7 MOV EDI,EDX ; 把EDX内的数据“Registered User”送到EDI
00403B33 |. 39D0 CMP EAX,EDX ; 用“Registered User”和我们输入的用户名作比较
00403B35 |. 0F84 8F000000 JE CrackMe3.00403BCA ; 相同则跳
00403B3B |. 85F6 TEST ESI,ESI ; 看看ESI中是否有数据,主要是看看我们有没有输入用户名
00403B3D |. 74 68 JE SHORT CrackMe3.00403BA7 ; 用户名为空则跳
00403B3F |. 85FF TEST EDI,EDI
00403B41 |. 74 6B JE SHORT CrackMe3.00403BAE
00403B43 |. 8B46 FC MOV EAX,DWORD PTR DS:[ESI-4] ; 用户名长度送EAX
00403B46 |. 8B57 FC MOV EDX,DWORD PTR DS:[EDI-4] ; “Registered User”字串的长度送EDX
00403B49 |. 29D0 SUB EAX,EDX ; 把用户名长度和“Registered User”字串长度相减
00403B4B |. 77 02 JA SHORT CrackMe3.00403B4F ; 用户名长度大于“Registered User”长度则跳
00403B4D |. 01C2 ADD EDX,EAX ; 把减后值与“Registered User”长度相加,即用户名长度
00403B4F |> 52 PUSH EDX
00403B50 |. C1EA 02 SHR EDX,2 ; 用户名长度值右移2位,这里相当于长度除以4
00403B53 |. 74 26 JE SHORT CrackMe3.00403B7B ; 上面的指令及这条指令就是判断用户名长度最少不能低于4
00403B55 |> 8B0E MOV ECX,DWORD PTR DS:[ESI] ; 把我们输入的用户名送到ECX
00403B57 |. 8B1F MOV EBX,DWORD PTR DS:[EDI] ; 把“Registered User”送到EBX
00403B59 |. 39D9 CMP ECX,EBX ; 比较
00403B5B |. 75 58 JNZ SHORT CrackMe3.00403BB5 ; 不等则完蛋
根据上面的分析,我们知道用户名必须是“Registered User”。我们按 F9 键让程序运行,出现错误对话框,点确定,重新在第一个编辑框中输入“Registered User”,再次点击那个“Register now !”按钮,被 OllyDBG 拦下。因为地址 00440F34 处的那个 CALL 我们已经分析清楚了,这次就不用再按 F7 键跟进去了,直接按 F8 键通过。我们一路按 F8 键,来到第二个关键代码处:
00440F49 |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ; 取输入的注册码
00440F4C |. BA 2C104400 MOV EDX,CrackMe3.0044102C ; ASCII "GFX-754-IER-954"
00440F51 |. E8 D62BFCFF CALL CrackMe3.00403B2C ; 关键,要用F7跟进去
00440F56 |. 75 1A JNZ SHORT CrackMe3.00440F72 ; 这里跳走就完蛋
大家注意看一下,地址 00440F51 处的 CALL CrackMe3.00403B2C 和上面我们分析的地址 00440F34 处的 CALL CrackMe3.00403B2C 是不是汇编指令都一样啊?这说明检测用户名和注册码是用的同一个子程序。而这个子程序 CALL 我们在上面已经分析过了。我们执行到现在可以很容易得出结论,这个 CALL 也就是把我们输入的注册码与 00440F4C 地址处指令后的“GFX-754-IER-954”作比较,相等则 OK。好了,我们已经得到足够的信息了。现在我们在菜单 查看->断点 上点击一下,打开断点窗口(也可以通过组合键 ALT+B 或点击工具栏上那个“B”图标打开断点窗口):

为什么要做这一步,而不是把这个断点删除呢?这里主要是为了保险一点,万一分析错误,我们还要接着分析,要是把断点删除了就要做一些重复工作了。还是先禁用一下,如果经过实际验证证明我们的分析是正确的,再删不迟。现在我们把断点禁用,在 OllyDBG 中按 F9 键让程序运行。输入我们经分析得出的内容:
用户名:Registered User
注册码:GFX-754-IER-954
点击“Register now !”按钮,呵呵,终于成功了:

--------------------------------------------------------------------------------
上一页 [1] [2] [3]