原帖链接: http://bbs.pediy.com/showthread.php?t=21308
最近在学习OD的使用,看了上面一篇帖子,学习了很多知识。在学习的过程中有一些疑问和思考如下。
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”和我们输入的用户名作比较
在实际调试的时候发现eax里放置的应该是我输入的用户名的地址。而edx里放置的数据应该是“Registered User”的地址。这个只要在寄存器窗口选中寄存器值在数据窗口里跟随就看到了。
所以说,不管你输入的是不是Registered User,这里都是不相等的,因为两个字符串的首地址是不会相等的,即便是内容一样。所以说这里是一个欺骗的东西,真正的比较都在后边。
另外一个地方,
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 ; 不等则完蛋
这是相比较字串的前四个字符。后面
00403B6A |. 83C6 08 |add esi, 8
00403B6D |. 83C7 08 |add edi, 8
00403B70 |. 4A |dec edx
00403B71 |.^ 75 E2 \jnz short 00403B55
是指到后面的字符来比较后面的字串是否一致。