这是原文:http://bbs.pediy.com/showthread.php?t=21330
其中的一段:
光标停在 00401328 地址处的那条指令上。现在我们按 F7 键跟进:
004013D2 /$ 56 PUSH ESI ; ESI 入栈
004013D3 |. 33C0 XOR EAX,EAX ; EAX 清零
004013D5 |. 8D35 C4334000 LEA ESI,DWORD PTR DS: [4033C4] ; 把注册码框中的数值送到ESI
004013DB |. 33C9 XOR ECX,ECX ; ECX 清零
004013DD |. 33D2 XOR EDX,EDX ; EDX 清零
004013DF |. 8A06 MOV AL,BYTE PTR DS: [ESI] ; 把注册码中的每个字符送到AL
004013E1 |. 46 INC ESI ; 指针加1,指向下一个字符
004013E2 |. 3C 2D CMP AL,2D ; 把取得的字符与16进制值为2D的字符(即“-”)比较,这里主要用于判断输入的是不是负数
004013E4 |. 75 08 JNZ SHORT CrackHea.004013EE ; 不等则跳
004013E6 |. BA FFFFFFFF MOV EDX,-1 ; 如果输入的是负数,则把-1送到EDX,即16进制FFFFFFFF
004013EB |. 8A06 MOV AL,BYTE PTR DS: [ESI] ; 取“-”号后的第一个字符
004013ED |. 46 INC ESI ; 指针加1,指向再下一个字符
004013EE |> EB 0B JMP SHORT CrackHea.004013FB
004013F0 |> 2C 30 SUB AL,30 ; 每位字符减16进制的30,因为这里都是数字,如1的ASCII码是“31H”,减30H后为1,即我们平时看到的数值
004013F2 |. 8D0C89 LEA ECX,DWORD PTR DS: [ECX+ECX*4] ; 把前面运算后保存在ECX中的结果乘5再送到ECX
004013F5 |. 8D0C48 LEA ECX,DWORD PTR DS: [EAX+ECX*2] ; 每位字符运算后的值与2倍上一位字符运算后值相加后送ECX
004013F8 |. 8A06 MOV AL,BYTE PTR DS: [ESI] ; 取下一个字符
004013FA |. 46 INC ESI ; 指针加1,指向再下一个字符
004013FB |> 0AC0 OR AL,AL
004013FD |.^ 75 F1 JNZ SHORT CrackHea.004013F0 ; 上面一条和这一条指令主要是用来判断是否已把用户输入的注册码计算完
004013FF |. 8D040A LEA EAX,DWORD PTR DS: [EDX+ECX] ; 把EDX中的值与经过上面运算后的ECX中值相加送到EAX
00401402 |. 33C2 XOR EAX,EDX ; 把 EAX与EDX异或。如果我们输入的是负数,则此处功能就是把EAX中的值取反
00401404 |. 5E POP ESI ; ESI 出栈。看到这条和下一条指令,我们要考虑一下这个ESI的值是哪里运算得出的呢?
00401405 |. 81F6 53757A79 XOR ESI,797A7553 ; 把 ESI中的值与797A7553H异或
0040140B \. C3 RETN
问题 1:
004013F2 |. 8D0C89 LEA ECX,DWORD PTR DS: [ECX+ECX*4]
004013F5 |. 8D0C48 LEA ECX,DWORD PTR DS: [EAX+ECX*2]
这两句为什么不写成LEA ECX,DWORD PTR DS: [EAX+ECX*10]?有什么区别~~?
问题 2:
004013FF |. 8D040A LEA EAX,DWORD PTR DS: [EDX+ECX]
00401402 |. 33C2 XOR EAX,EDX
这两句当没有“-”号的时候ECX保持不变,但是当有“-”号时,XOR EAX,EDX这句是取反,
LEA EAX,DWORD PTR DS: [EDX+ECX]这句是在做什么,两句和一起的功能是什么??
希望大侠指点……
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)