Posted on 2009-09-26 18:35
S.l.e!ep.¢% 閱讀(363)
評論(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 去看看
?