S.l.e!ep.¢%

像打了激速一样,以四倍的速度运转,开心的工作
简单、开放、平等的公司文化;尊重个性、自由与个人价值;
posts - 1098, comments - 335, trackbacks - 0, articles - 1
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

OllyDBG 之旅 (九)

Posted on 2009-09-26 18:35 S.l.e!ep.¢% 阅读(297) 评论(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 去看看



 


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理