00404423 |. 83C4 04 ADD ESP,4
00404426 |. 83F8 01 CMP EAX,1
00404429 |. 75 3C JNZ SHORT LIAOCACH.00404467
0040442B |. 8D5424 18 LEA EDX,DWORD PTR SS:[ESP+18]
0040442F |. 52 PUSH EDX
00404430 |. FFD6 CALL ESI
00404432 |. 83C4 04 ADD ESP,4
00404435 |. 83F8 01 CMP EAX,1
00404438 |. 75 2D JNZ SHORT LIAOCACH.00404467
0040443A |. 8D4424 20 LEA EAX,DWORD PTR SS:[ESP+20]
0040443E |. 50 PUSH EAX
0040443F |. FFD6 CALL ESI
00404441 |. 83C4 04 ADD ESP,4
00404444 |. 83F8 01 CMP EAX,1
00404447 |. 75 1E JNZ SHORT LIAOCACH.00404467
00404449 |. 8D4C24 28 LEA ECX,DWORD PTR SS:[ESP+28]
0040444D |. 51 PUSH ECX
0040444E |. FFD6 CALL ESI
00404450 |. 83C4 04 ADD ESP,4
00404453 |. 83F8 01 CMP EAX,1
00404456 |. 75 0F JNZ SHORT LIAOCACH.00404467
00404458 |. 5F POP EDI
00404459 |. 5E POP ESI
0040445A |. 5D POP EBP
0040445B |. B8 FEFFFFFF MOV EAX,-2
00404460 |. 5B POP EBX
00404461 |. 83C4 54 ADD ESP,54
00404464 |. C2 0400 RETN 4
00404467 |> 8D7424 30 LEA ESI,DWORD PTR SS:[ESP+30] <--正确的注册码的前4位的地址装入ESI中,嘿嘿,执行到这里时我们就可以看到正确的注册的前4位了,在TRW2000 or SoftICE中可以用d ESP+30来查看而在Ollydbg中什么都不用做就可以在左上方反汇编代码区与左下内存区中间的那个小窗体中看见 在TRW2000中下过D指令后按Alt+上下键翻几下,就可以看到所有的注册码了(它们并没有分太开嘛0063F5E0-0063F5E3是前4位,0063F5E8-0063F5EB是5-8位,0063F5F0-0063F5F3是9-12位,0063F5F8-0063F5FB是最后4位,而你输入的注册码的内存地址:0063F5C0-0063F5C3是前4位,0063F5C8-0063F5CB是5-8位,0063F5D0-0063F5D3是9-12位,0063F5D8-0063F5DB是最后4位,机器码存放的地址是0063F6000-0063F60F)
0040446B |. 8D4424 10 LEA EAX,DWORD PTR SS:[ESP+10] <--你输入的注册码的前4位的地址装入EAX中
0040446F |> 8A10 /MOV DL,BYTE PTR DS:[EAX] <--得到你输入的注册码的第1位或第3位(EAX中的值到了后边儿会加上2,这样再执行到这里时得到的就是第3位了)
00404471 |. 8ACA |MOV CL,DL <--传入cl中
00404473 |. 3A16 |CMP DL,BYTE PTR DS:[ESI] <--与正确的注册码的第1位或第3位比较(ESI中的值会与EAX中的值一起改变)
00404475 |. 75 1C |JNZ SHORT LIAOCACH.00404493 <--不相等就跳走
00404477 |. 3ACB |CMP CL,BL <--CL与BL比较,BL中的值为00000000(也就是空啦),这条指令有什么用呢?其实很简单了,每4位注册码的后面都会再跟一个空值,也就是如你在内存中可以看到1234.那个.就是空值,明白过来了吧,等到前4位都被测试过了,cl中就会装入.也就是00000000,到时就可以在后面跳走了
00404479 |. 74 14 |JE SHORT LIAOCACH.0040448F <--如果CL中的值为零(即4位已经全部比较过了),就跳走
0040447B |. 8A50 01 |MOV DL,BYTE PTR DS:[EAX+1] <--EAX+1后得到的会是你输入的注册码的第2位或者第4位(视EAX的值而定)
0040447E |. 8ACA |MOV CL,DL <--传入CL
00404480 |. 3A56 01 |CMP DL,BYTE PTR DS:[ESI+1] <--与正确的注册码的第2位或第4位比较(ESI的值会与EAX一起改变)
00404483 |. 75 0E |JNZ SHORT LIAOCACH.00404493 <--不相等就跳走
00404485 |. 83C0 02 |ADD EAX,2 <--EAX加上2,这样的话待会儿再跳到0040446F处时,再得到的就是你输入的注册码的第3位了
00404488 |. 83C6 02 |ADD ESI,2 <--同上,ESI加上2后再跳到0040446F处重新再来一遍时就会得到正确的注册码的第3位
0040448B |. 3ACB |CMP CL,BL <--再次比较CL是否为空
0040448D |.^75 E0 \\JNZ SHORT LIAOCACH.0040446F <--不为空就再跳到0040446F处,来继续比较前4位中的1、3两位
0040448F |> 33C0 XOR EAX,EAX <--1-4位全部比较完后会跳到这里
00404491 |. EB 05 JMP SHORT LIAOCACH.00404498
00404493 |> 1BC0 SBB EAX,EAX
00404495 |. 83D8 FF SBB EAX,-1
00404498 |> 3BC3 CMP EAX,EBX
0040449A |. 0F85 AB000000 JNZ LIAOCACH.0040454B
004044A0 |. 8D7424 38 LEA ESI,DWORD PTR SS:[ESP+38] <--与上面的大体相同嘛,将正确注册码的5-8位的内存地址装入ESI中
004044A4 |. 8D4424 18 LEA EAX,DWORD PTR SS:[ESP+18] <--你输入的注册码的5-8位的内存地址装入EAX中 |