Revival 的算法跟踪(3)

时间:2005-12-20 来源: 作者: 点击:
00403347 MOV CX, WORD PTR DS:[ESI+5] ; CX = 3433 ("34") 0040334B ADD ESP, 4 0040334E MOV WORD PTR SS:[ESP+10], CX ; CX ==SS:[0012F514] 00403353 SUB AL, 13 ; AL =01 SUB 13=EE |这里把第一组值-13 00403355 LEA ECX, DWORD PTR SS:[ESP+10] ; ECX ==0012F514,
  00403347   MOV     CX, WORD PTR DS:[ESI+5]        ;  CX = 3433 ("34")
0040334B   ADD     ESP, 4
0040334E   MOV     WORD PTR SS:[ESP+10], CX       ;  CX ==>SS:[0012F514]
00403353   SUB     AL, 13                         ;  AL =01 SUB 13=EE  |这里把第一组值-13
00403355   LEA     ECX, DWORD PTR SS:[ESP+10]     ;  ECX <==0012F514, (ASCII "34")
00403359   MOV     BYTE PTR SS:[ESP+C], AL        ;  AL =EE  ==>SS:[0012F510]  |第一组的值保存在这里
0040335D   MOV     BYTE PTR SS:[ESP+12], 0
00403362   PUSH    ECX
00403363   CALL    Revival.0041F800               *********第二次调用
00403368   LEA     EDX, DWORD PTR SS:[ESP+14]     ;  EDX <== 0012F514,(ASCII "34")
0040336C   ADD     ESP, 4
0040336F   LEA     EBX, DWORD PTR DS:[EAX-25]     ;  EBX <== EAX(上面CALL计算的值)-25=FFFFFFFD  |第二组计算的值-25
00403372   LEA     ECX, DWORD PTR DS:[ESI+A]      ;  ECX <== DS:[ESI+A]=00932676,(ASCII "78901"). 试验码的后五位
00403375   PUSH    EDX                            ;  EDX =34
00403376   MOV     EAX, DWORD PTR DS:[ECX]        ;  EAX <== DS:[00932676]=30393837
00403378   MOV     DWORD PTR DS:[EDX], EAX        ;  DS:[0012F514] <== 03393837
0040337A   MOV     CL, BYTE PTR DS:[ECX+4]        ;  CL <== DS:[ECX+4]=31 ('1') 试验码的最后一位
0040337D   MOV     BYTE PTR DS:[EDX+4], CL        ;  第五位也转移过来
00403380   MOV     BYTE PTR SS:[ESP+19], 0
00403385   CALL    Revival.0041F800               *********第三次调用
0040338A   ADD     ESP, 4
0040338D   MOV     EDI, EAX                       ;  EDI <==13435 (后五位经过上面计算的值)
0040338F   XOR     DI, 5468                       ;  DI=3435 XOR 5468=605D  (只取这个值的后四位计算)
00403394   MOV     AX, WORD PTR DS:[ESI+8]        ;  AX <== DS:[00932674]=3635 ("56") ,试验码的第九第十位
00403398   MOV     WORD PTR SS:[ESP+10], AX
0040339D   LEA     EAX, DWORD PTR SS:[ESP+10]     ;  EAX <== SS:[ESP+10]=0012F514,(ASCII "56901")
004033A1   MOV     BYTE PTR SS:[ESP+12], 0
004033A6   MOVZX   EDI, DI                        ;  EDI<==605D
004033A9   PUSH    EAX
004033AA   CALL    Revival.0041F800               *********第四次调用
004033AF   MOV     BYTE PTR SS:[ESP+14], AL       ;  SS:[0012F514]=38  ,第四次的值
004033B3   ADD     ESP, 4
004033B6   XOR     EAX, EAX
004033B8   MOV     ECX, 64                        ;  ECX =64    <--参数
004033BD   MOV     AL, BL                         ;  AL =FD     ,第二次的值
004033BF   MOV     EBX, 0A                        ;  EBX <=0A   <--参数
004033C4   LEA     EAX, DWORD PTR DS:[EAX+EDI+3]  ;  EAX <==FD+6150D+3 ,第三次的值
004033C8   CDQ
004033C9   IDIV    ECX                            ;  ECX = 64  IDIV  EAX = 615D ==>EAX =F9 EDX=19
004033CB   MOV     CL, DL                         ;  CL <== 19
004033CD   XOR     EAX, EAX
004033CF   MOV     AL, BYTE PTR SS:[ESP+C]        ;  AL <== SS:[0012F510]=EE ,第一次的值
004033D3   LEA     EAX, DWORD PTR DS:[EAX+EDI+3]  ;  EAX =EE+605D+3= 614E
004033D7   CDQ
004033D8   IDIV    EBX                            ;  EAX =614E IDIV EBX=A ==>EAX=9BB EDX=000
004033DA   SUB     DL, BYTE PTR DS:[ESI+4]        ;  DL =DL-32 ('2') ,试验码的第五位
004033DD   CMP     DL, 0D0                        ;  DL =CE
004033E0   JNZ     SHORT Revival.00403406         ;  注册码的正确条件7
004033E2   CMP     CL, BYTE PTR SS:[ESP+10]       ;  CL = 19    SS:[ESP+10] =SS:[0012F514]=38
004033E6   JNZ     SHORT Revival.00403406         ;  注册码的正确条件8
004033E8   MOV     EAX, 1
004033ED   POP     EDI
004033EE   POP     ESI
004033EF   POP     EBX
004033F0   ADD     ESP, 24
004033F3   RETN

##############################################################
以上算法分析已经完成,下面来总结注册码的计算方法: 注册码的长度=15位

  1.首先看注册码的前二位比较容易固定值rv
  2.注册码的第八位是 2D('-')
  3.注册码的其他几位必须是数字
  4.其他几位正确的条件:设第一次计算的值为M ,第二次的值为N ,第三次值的后四位为J ,第四次计算的值为K

          1).(M+(J XOR 5468)+3) MOD A + D0 = 注册码的第五位
          2).(N+(J XOR 5468)+3) MOD 64 = k

  5.假如我们知道M N J K

    这样注册码的这几位可以知道假设了: rv01?34-??78901

  6.为了使上式成立,我们做如下分析:

  从 K 分析: 设K=19 ,第九位为T1 ,第十位为T2
               则:T2=19-T1*A >=0 ; T1 的取值范围只能是 2  那么 T2 =19-2*A=5
  这样把注册码设成:rv01???-2578901
  现在来分析一下它对第一个条件能不能成立:
          1).(M+(J XOR 5468)+3) MOD A = 注册码的第五位  
             上式改为注册码的第五位=6145 MOD A =0

  把注册码改为:rv01034-2578901
 
几点说明:  
  1.这个软件的注册码如果不进行假设的话,可能很难知道结果.
  2.SUB     DL, BYTE PTR DS:[ESI+4]        ;  DL =DL-32 ('2') ,试验码的第五位
    (M+(J XOR 5468)+3) MOD A = 注册码的第五位,这个我是怎么知道的
    原来 MOD A 得到的值是<A -30以上的值是负数,我无法用计算器计算,只好用sice的计算功能才
   知道0-30=D0 ,因此上面式子就是:
    SUB     DL, BYTE PTR DS:[ESI+4]  
    CMP     DL, 0D0  
    JNZ     SHORT Revival.00403406   <== 不能跳
   成立的描述.
 3.以上算法得到的注册码,能注册成功,但是重新启动时不能通过,请老师们斧正 

------分隔线----------------------------
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
最新评论 查看所有评论
发表评论 查看所有评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 密码: 验证码:
推荐内容