Posted on 2009-09-26 18:35
S.l.e!ep.¢% 阅读(347)
评论(0) 编辑 收藏 引用 所属分类:
Crack
接着 八 继续
00401110 |. E8 7B000000 call 00401190
00401115 |. 83F9 01 cmp ecx, 1
00401118 |. 74 06 je short 00401120 <------ (先不看这里) ecx == 1 时才跳转, 条件之一
0040111A |> E8 47000000 call 00401166
0040111F |> C3 retn
00401120 |> A1 68214000 mov eax, dword ptr [402168]
00401125 |. 8B1D 6C214000 mov ebx, dword ptr [40216C]
0040112B |. 33C3 xor eax, ebx
0040112D |. 3305 82214000 xor eax, dword ptr [402182] <---- 这里通过设置内存断点,就可以知道,是这条指令早已赋值
<----- 0040109C /$ C705 82214000>mov dword ptr [402182], FEDCBA98
00401133 |. 0D 40404040 or eax, 40404040
00401138 |. 25 77777777 and eax, 77777777
0040113D |. 3305 79214000 xor eax, dword ptr [402179]
00401143 |. 3305 7D214000 xor eax, dword ptr [40217D]
00401149 |.^ 75 CF jnz short 0040111A <------ ZF 标志位非 0
0040114B |. E8 2B000000 call 0040117B <------ 这里是显示 Congratulations! 的地方, 前面的条件有两个
00401150 \. C3 retn
先分析下这里
00401120 |> \A1 68214000 mov eax, dword ptr [402168]
00401125 |. 8B1D 6C214000 mov ebx, dword ptr [40216C]
0040112B |. 33C3 xor eax, ebx
0040112D |. 3305 82214000 xor eax, dword ptr [402182]
00401133 |. 0D 40404040 or eax, 40404040
00401138 |. 25 77777777 and eax, 77777777
0040113D |. 3305 79214000 xor eax, dword ptr [402179]
00401143 |. 3305 7D214000 xor eax, dword ptr [40217D]
00401149 |.^ 75 CF jnz short 0040111A
1. [402168] 指向输入的用户名的 [9 - 12] 位的值, eax = 输入的用户名的 [9 - 12] 位的值
2. [40216C]指向指入的用户名的 [13-16] 位的值, ebx = 输入的用户名的 [13- 16] 位的值
3. eax = eax XOR ebx
4. [402182] 是之前已经赋值的, eax = eax XOR 0xFEDCBA98
5. eax = eax OR 0x40404040
6. eax = eax AND 0x77777777
7. [402179] 指向输入的序列号的 [9 -12]位的值 , eax XOR 输入的序列号的 [9 -12]位的值
8. [40217D]指向输入的序列号的 [13-16]位的值, eax XOR 输入的序列号的 [13 -16]位的值
9. 如果 eax 在经过 1-7 的运算后,等于 输入的序列号的 [13-16]位的值,那就不会跳转到 0x0040111A
也就是说, 序列号至少要有 16位, 最后四位必须根据用户名和序列号的 9 - 12 来决定的
分析下另一个条件:
00401100 |> \83F9 11 cmp ecx, 11
00401103 |. 75 1A jnz short 0040111F
00401105 |. E8 E7000000 call 004011F1
0040110A |. B9 01FF0000 mov ecx, 0FF01
0040110F |. 51 push ecx
00401110 |. E8 7B000000 call 00401190
00401115 |. 83F9 01 cmp ecx, 1 <---- ecx 必须等于 1, 往上一步步分析,检查所有改变 ecx 的地方
00401118 |. 74 06 je short 00401120
0040111A |> E8 47000000 call 00401166
0040111F |> C3 retn
经过调试,这里虽然改变了 cex 的值
call 004011F1
0040110A |. B9 01FF0000 mov ecx, 0FF01
0040110F |. 51 push ecx
00401110 |. E8 7B000000 call 00401190
但这里的 ecx 作为参数传给 call 00401190 , 然后在 call 00401190 改变 ecx 的值,
所以,需要跟进 call 00401190 去看看