• 标 题:乐透之王 (25千字)
  • 作 者:lq7972
  • 时 间:2003-10-19 13:04:05
  • 链 接:http://bbs.pediy.com

Software:彩票分析家-"乐透之王"V3.0
彩票选号工具;免费试用20次,试用期内无限制
http://luxing.51.net
Tools:TRW2000、OllyDbg1.09、KeyMake V1.73、Win98Se
Cracker:lq7972[bruceyu13@sina.com]
Notes:学习ing。注:我不是彩民
又:文章较长,总有疏漏;诸大佬若不满意虾米的语文水平,请丢番茄~

这是个VC6的软件,没有加壳,注册要填入E-mail,以此生成机器码;我们关心的是注册码的生成算法~
在分析具体的算法之前,还要罗嗦的是,软件无论启动抑或注册验证,都要先生成机器码,然后再生成注册码(二者是同一过程,不过参数不同罢了);这有助于我们下断点。值得注意的是:在生成机器码/注册码后跟着生成的那个16位的数字挺象注册码(随机的),可惜它不是;这会在一定程度上迷惑我们(PJOr)
下面看具体的跟踪:
TRW载入,打开注册窗口
输入Email,并生成机器码
输入假码如1234567890123456
下断点"bpx hmemcpy",F5返回,点确定,拦住,按两次F12,再按F10到:
;注意:这个过程软件先运行一遍,生成机器码,接下来才是注册码……
;注册码的生成过程很繁琐,我将用自己的实例演示它:
0167:004650D1 8B96B4000000     MOV      EDX,[ESI+B4] ;E-mail
0167:004650D7 8DAEB4000000     LEA      EBP,[ESI+B4]
0167:004650DD 8B42F8           MOV      EAX,[EDX-08] ;长度
0167:004650E0 83F808           CMP      EAX,BYTE +08
0167:004650E3 7D18             JNL      004650FD;要大于8
0167:004650E5 6A30             PUSH     BYTE +30
0167:004650E7 68D81C4A00       PUSH     DWORD 004A1CD8
0167:004650EC 68901C4A00       PUSH     DWORD 004A1C90
0167:004650F1 8BCE             MOV      ECX,ESI
0167:004650F3 E8BECD0000       CALL     `MFC42!ord_00001080`
0167:004650F8 E9F5030000       JMP      004654F2
0167:004650FD 8B86BC000000     MOV      EAX,[ESI+BC] ;输入的假码
0167:00465103 8DBEBC000000     LEA      EDI,[ESI+BC]
0167:00465109 8B40F8           MOV      EAX,[EAX-08] ;     长度
0167:0046510C 83F810           CMP      EAX,BYTE +10 ;要大于16
0167:0046510F 7418             JZ       00465129
;下面按F10到:
0167:0046523F E83CB2FFFF       CALL     00460480 ;F8跟进
0167:00465244 8D4C2418         LEA      ECX,[ESP+18]
0167:00465248 51               PUSH     ECX
0167:00465249 8D4C2444         LEA      ECX,[ESP+44]
0167:0046524D E8AEADFFFF       CALL     00460000 ;F8跟进
0167:00465252 8D4C2410         LEA      ECX,[ESP+10]
0167:00465256 E82FCB0000       CALL     `MFC42!ord_00000320`
0167:0046525B 8B542428         MOV      EDX,[ESP+28]
0167:0046525F 8B442418         MOV      EAX,[ESP+18]
0167:00465263 52               PUSH     EDX
0167:00465264 50               PUSH     EAX
0167:00465265 FF15507D4800     CALL     `MSVCRT!_mbscmp`
0167:0046526B 83C408           ADD      ESP,BYTE +08
0167:0046526E 85C0             TEST     EAX,EAX
0167:00465270 7418             JZ       0046528A
;为节省篇幅,后面略N行

;下面一步步地跟踪注册码的生成过程
;Call by 460A94,46523F
;这里生成几个中间量
;……
0167:004604BF E8EC190100       CALL     `MFC42!ord_0000039A`
;这里是把机器码MacCode和软件给定的串"CPFXJLTZW"链接为firstStr,如:
4627004702842417CPFXJLTZW
        |--- MacCode---|
0167:004604C4 8D442414         LEA      EAX,[ESP+14]
0167:004604C8 8BCE             MOV      ECX,ESI
0167:004604CA 50               PUSH     EAX
0167:004604CB E860010000       CALL     00460630 ;【跟进1】
0167:004604D0 50               PUSH     EAX
0167:004604D1 8D4C2430         LEA      ECX,[ESP+30]
0167:004604D5 C644242403       MOV      BYTE [ESP+24],03
0167:004604DA E84D190100       CALL     `MFC42!ord_0000035A`
0167:004604DF 8D4C2410         LEA      ECX,[ESP+10]
0167:004604E3 C644242002       MOV      BYTE [ESP+20],02
0167:004604E8 E89D180100       CALL     `MFC42!ord_00000320`
0167:004604ED 51               PUSH     ECX
0167:004604EE 8D542430         LEA      EDX,[ESP+30]
0167:004604F2 8BCC             MOV      ECX,ESP
0167:004604F4 89642414         MOV      [ESP+14],ESP
0167:004604F8 8D442434         LEA      EAX,[ESP+34]
0167:004604FC 52               PUSH     EDX
0167:004604FD 50               PUSH     EAX
0167:004604FE 51               PUSH     ECX
0167:004604FF E8AC190100       CALL     `MFC42!ord_0000039A`
;它链接了软件给定的串"CPFXJLTZW"和temp01,称temp02
;******************************************
;【实例】~temp02
007E10A4  43 50 46 58 4A 4C 54 5A  CPFXJLTZ
007E10AC  57 69 51 4E 7C 90 3F 8F  WiQN|?
007E10B4  47 8B 4A 5F 86 69 51 4B  G婮_唅QK
007E10BC  49 60 71 4C 4D 61 76 57  I`qLMavW
007E10C4  64
;******************************************
0167:00460504 8D4C2414         LEA      ECX,[ESP+14]
0167:00460508 51               PUSH     ECX
0167:00460509 8BCE             MOV      ECX,ESI
0167:0046050B E820010000       CALL     00460630
;【跟进2】
0167:00460510 50               PUSH     EAX
0167:00460511 8D4C2434         LEA      ECX,[ESP+34] ;pJx
0167:00460515 C644242404       MOV      BYTE [ESP+24],04
0167:0046051A E80D190100       CALL     `MFC42!ord_0000035A` ;temp03
0167:0046051F 8D4C2410         LEA      ECX,[ESP+10]
0167:00460523 C644242002       MOV      BYTE [ESP+20],02
0167:00460528 E85D180100       CALL     `MFC42!ord_00000320`
0167:0046052D 8B542430         MOV      EDX,[ESP+30];temp03
0167:00460531 6830344A00       PUSH     DWORD 004A3430
0167:00460536 8D4C2410         LEA      ECX,[ESP+10]
0167:0046053A 8B72F8           MOV      ESI,[EDX-08] ;length of temp03
0167:0046053D E8D2180100       CALL     `MFC42!ord_00000219`
0167:00460542 8B44242C         MOV      EAX,[ESP+2C];temp01
0167:00460546 C644242005       MOV      BYTE [ESP+20],05
0167:0046054B 8B78F8           MOV      EDI,[EAX-08] ;length of temp01
0167:0046054E 3BF7             CMP      ESI,EDI ;比较
0167:00460550 7D02             JNL      00460554 ;jump(↓)
0167:00460552 8BFE             MOV      EDI,ESI
0167:00460554 33F6             XOR      ESI,ESI ;set of zero(↓)
0167:00460556 85FF             TEST     EDI,EDI
0167:00460558 7E49             JNG      004605A3
;++++++++++++++++++++++++++++++++++++++++++++
0167:0046055A 8A0C06           MOV      CL,[ESI+EAX] ;temp01[i]
0167:0046055D 8B442430         MOV      EAX,[ESP+30] ;temp03
0167:00460561 0FBEC9           MOVSX    ECX,CL
0167:00460564 0FBE0406         MOVSX    EAX,BYTE [ESI+EAX] ;temp03[i]
0167:00460568 03C1             ADD      EAX,ECX
0167:0046056A BB05000000       MOV      EBX,05
0167:0046056F 99               CDQ     
0167:00460570 2BC2             SUB      EAX,EDX
0167:00460572 8BC8             MOV      ECX,EAX
0167:00460574 D1F9             SAR      ECX,1
0167:00460576 884C2410         MOV      [ESP+10],CL
0167:0046057A 8B442410         MOV      EAX,[ESP+10]
0167:0046057E 25FF000000       AND      EAX,FF
0167:00460583 99               CDQ     
0167:00460584 F7FB             IDIV     EBX
0167:00460586 02CA             ADD      CL,DL
0167:00460588 884C2410         MOV      [ESP+10],CL
0167:0046058C 8B542410         MOV      EDX,[ESP+10]
0167:00460590 52               PUSH     EDX
0167:00460591 8D4C2410         LEA      ECX,[ESP+10]
0167:00460595 E86C1A0100       CALL     `MFC42!ord_000003AC`
;store temp04[i]
0167:0046059A 8B44242C         MOV      EAX,[ESP+2C] ;temp01
0167:0046059E 46               INC      ESI;++esi
0167:0046059F 3BF7             CMP      ESI,EDI
0167:004605A1 7CB7             JL       0046055A
;******************************************
;【实例】~temp04
007E10A4  6D 4F FE 76 F5 F2 F4 50  mO躜鬚 FE
007E10AC  AB F7 57 FE 74 00 00 5F  W⺶.._57
007E10B4  68 FF 5C 5F 60 12 63 5A  h\_` cZ
;******************************************
;++++++++++++++++++++++++++++++++++++++++++++
0167:004605A3 8B48F8           MOV      ECX,[EAX-08] ;length of temp01:18h
0167:004605A6 8BF7             MOV      ESI,EDI:18h
0167:004605A8 3BF9             CMP      EDI,ECX
0167:004605AA 7D1F             JNL      004605CB ;jump(↓)~大于/等于,走

0167:004605AC 8A0406           MOV      AL,[ESI+EAX]
0167:004605AF 88442410         MOV      [ESP+10],AL
0167:004605B3 8B4C2410         MOV      ECX,[ESP+10]
0167:004605B7 51               PUSH     ECX
0167:004605B8 8D4C2410         LEA      ECX,[ESP+10]
0167:004605BC E8451A0100       CALL     `MFC42!ord_000003AC`
0167:004605C1 8B44242C         MOV      EAX,[ESP+2C]
0167:004605C5 46               INC      ESI
0167:004605C6 3B70F8           CMP      ESI,[EAX-08]
0167:004605C9 7CE1             JL       004605AC

0167:004605CB 8B742428         MOV      ESI,[ESP+28] ;跳到这里(↓)
;……
0167:00460620 C20C00           RET      0C


;【跟进1】
;……
0167:00460683 E81A170100       CALL     `MFC42!ord_0000021C`
0167:00460688 8B442438         MOV      EAX,[ESP+38] ;这就是firstStr
0167:0046068C B304             MOV      BL,04
0167:0046068E 8D4C2438         LEA      ECX,[ESP+38]
0167:00460692 885C242C         MOV      [ESP+2C],BL
0167:00460696 8B70F8           MOV      ESI,[EAX-08]   ;长度
0167:00460699 E828230100       CALL     `MFC42!ord_0000106B`
;这里是反转firstStr~revFirStr,返回eax和ecx
;******************************************
;【实例】
007E10A4  57 5A 54 4C 4A 58 46 50  WZTLJXFP
007E10AC  43 37 31 34 32 34 38 32  C7142482
007E10B4  30 37 34 30 30 37 32 36  07400726
007E10BC  34                       4
;******************************************
0167:0046069E 8BC6             MOV      EAX,ESI ;firstStr的长度
0167:004606A0 8D4C2418         LEA      ECX,[ESP+18]
0167:004606A4 99               CDQ     
0167:004606A5 2BC2             SUB      EAX,EDX
0167:004606A7 8BF0             MOV      ESI,EAX
0167:004606A9 D1FE             SAR      ESI,1 ;算术右移,结果(esi)将作为下面Call的一个参数
0167:004606AB 56               PUSH     ESI
0167:004606AC 6A00             PUSH     BYTE +00
0167:004606AE 51               PUSH     ECX
0167:004606AF 8D4C2444         LEA      ECX,[ESP+44]
0167:004606B3 E8D4170100       CALL     `MFC42!ord_000010B6`
;从revFirStr中取出长度为esi的串tempStr
;******************************************
;【实例】
007E1144  57 5A 54 4C 4A 58 46 50  WZTLJXFP
007E114C  43 37 31 34              C714
;******************************************
0167:004606B8 50               PUSH     EAX
0167:004606B9 8D4C240C         LEA      ECX,[ESP+0C]
0167:004606BD C644243005       MOV      BYTE [ESP+30],05
0167:004606C2 E865170100       CALL     `MFC42!ord_0000035A`
0167:004606C7 8D4C2418         LEA      ECX,[ESP+18]
0167:004606CB 885C242C         MOV      [ESP+2C],BL
0167:004606CF E8B6160100       CALL     `MFC42!ord_00000320`
0167:004606D4 8D542418         LEA      EDX,[ESP+18]
0167:004606D8 56               PUSH     ESI
0167:004606D9 52               PUSH     EDX
0167:004606DA 8D4C2440         LEA      ECX,[ESP+40]
0167:004606DE E8A3170100       CALL     `MFC42!ord_000010B5`
;revFirStr剩下的串tempNum
;******************************************
;【实例】
007E0EC4  32 34 38 32 30 37 34 30  24820740
007E0ECC  30 37 32 36 34           07264
;******************************************
0167:004606E3 50               PUSH     EAX
0167:004606E4 8D4C2410         LEA      ECX,[ESP+10]
0167:004606E8 C644243006       MOV      BYTE [ESP+30],06
0167:004606ED E83A170100       CALL     `MFC42!ord_0000035A` ;tempNum
0167:004606F2 8D4C2418         LEA      ECX,[ESP+18]
0167:004606F6 885C242C         MOV      [ESP+2C],BL
0167:004606FA E88B160100       CALL     `MFC42!ord_00000320`
0167:004606FF 8B4C2408         MOV      ECX,[ESP+08] ;tempStr
0167:00460703 8B54240C         MOV      EDX,[ESP+0C] ;tempNum
0167:00460707 8B41F8           MOV      EAX,[ECX-08] ;tempStr的长度
0167:0046070A 8B72F8           MOV      ESI,[EDX-08] ;tempNum的长度
0167:0046070D 3BC6             CMP      EAX,ESI;比较
0167:0046070F 7E2C             JNG      0046073D ;小于/等于则转移;大于则不

0167:00460711 8BD6             MOV      EDX,ESI
0167:00460713 8D442418         LEA      EAX,[ESP+18]
0167:00460717 52               PUSH     EDX
0167:00460718 6A00             PUSH     BYTE +00
0167:0046071A 50               PUSH     EAX
0167:0046071B 8D4C2414         LEA      ECX,[ESP+14]
0167:0046071F E868170100       CALL     `MFC42!ord_000010B6`
0167:00460724 50               PUSH     EAX
0167:00460725 8D4C240C         LEA      ECX,[ESP+0C]
0167:00460729 C644243007       MOV      BYTE [ESP+30],07
0167:0046072E E8F9160100       CALL     `MFC42!ord_0000035A`
0167:00460733 885C242C         MOV      [ESP+2C],BL
0167:00460737 8D4C2418         LEA      ECX,[ESP+18]
0167:0046073B EB2B             JMP      SHORT 00460768
;**到这里了
0167:0046073D 8B49F8           MOV      ECX,[ECX-08]
;tempStr的长度,下面按它从tempNum中截取串Num--按短的取
0167:00460740 51               PUSH     ECX
0167:00460741 8D4C241C         LEA      ECX,[ESP+1C]
0167:00460745 6A00             PUSH     BYTE +00
0167:00460747 51               PUSH     ECX
0167:00460748 8D4C2418         LEA      ECX,[ESP+18]
0167:0046074C E83B170100       CALL     `MFC42!ord_000010B6`
;从tempNum中截取串~Num
;******************************************
;【实例】
007AC9D8  32 34 38 32 30 37 34 30  24820740
007AC9E0  30 37 32 36              0726
;******************************************
0167:00460751 50               PUSH     EAX
0167:00460752 8D4C2410         LEA      ECX,[ESP+10]
0167:00460756 C644243008       MOV      BYTE [ESP+30],08
0167:0046075B E8CC160100       CALL     `MFC42!ord_0000035A`
0167:00460760 885C242C         MOV      [ESP+2C],BL
0167:00460764 8D4C2418         LEA      ECX,[ESP+18]
0167:00460768 E81D160100       CALL     `MFC42!ord_00000320`
0167:0046076D 8D4C240C         LEA      ECX,[ESP+0C] ;num
0167:00460771 E850220100       CALL     `MFC42!ord_0000106B`
;把num反转为regNum,返回eax,ecx
;这其实就是在firstStr中从某个位置(此处为第二位)开始取多少位(此处为第十二位)
;******************************************
;【实例】
007AC9D8  36 32 37 30 30 34 37 30  62700470
007AC9E0  32 38 34 32              2842
;******************************************
0167:00460776 8D4C2408         LEA      ECX,[ESP+08] ;tempStr
0167:0046077A E847220100       CALL     `MFC42!ord_0000106B`
;反转tempStr为regStr,返回eax,ecx
;这其实就是跟着在firstStr中取十二位
;******************************************
;【实例】
007E1144  34 31 37 43 50 46 58 4A  417CPFXJ
007E114C  4C 54 5A 57              LTZW
;******************************************
0167:0046077F 8B442408         MOV      EAX,[ESP+08] ;regStr
0167:00460783 33DB             XOR      EBX,EBX ;set of zero
0167:00460785 33F6             XOR      ESI,ESI
0167:00460787 8B48F8           MOV      ECX,[EAX-08] ;regStr的长度
0167:0046078A 85C9             TEST     ECX,ECX
0167:0046078C 7E54             JNG      004607E2
;++++++++++++++++++++++++++++++++++++++++++++
;根据上面的结果regStr、regNum计算temp01的前半部
0167:0046078E 8A1406           MOV      DL,[ESI+EAX] ;regStr[i],i=0 to the len(regStr)
0167:00460791 8B44240C         MOV      EAX,[ESP+0C] ;regNum
0167:00460795 88542418         MOV      [ESP+18],DL
0167:00460799 8A0C06           MOV      CL,[ESI+EAX] ;regNum[i]
0167:0046079C 8B442418         MOV      EAX,[ESP+18]
0167:004607A0 884C241C         MOV      [ESP+1C],CL
0167:004607A4 25FF000000       AND      EAX,FF
0167:004607A9 8B4C241C         MOV      ECX,[ESP+1C]
0167:004607AD 81E1FF000000     AND      ECX,FF
0167:004607B3 03C1             ADD      EAX,ECX
0167:004607B5 03D9             ADD      EBX,ECX
0167:004607B7 8A4C2418         MOV      CL,[ESP+18]
0167:004607BB 99               CDQ     
0167:004607BC 2BC2             SUB      EAX,EDX
0167:004607BE 8AD3             MOV      DL,BL
0167:004607C0 D1F8             SAR      EAX,1
0167:004607C2 22D1             AND      DL,CL
0167:004607C4 8D4C2410         LEA      ECX,[ESP+10]
0167:004607C8 02C2             ADD      AL,DL
0167:004607CA 88442414         MOV      [ESP+14],AL
0167:004607CE 8B442414         MOV      EAX,[ESP+14]
0167:004607D2 50               PUSH     EAX
0167:004607D3 E82E180100       CALL     `MFC42!ord_000003AC` ;store temp01[i](前半部),见下面的【实例】
0167:004607D8 8B442408         MOV      EAX,[ESP+08] ;regStr
0167:004607DC 46               INC      ESI;++esi
0167:004607DD 3B70F8           CMP      ESI,[EAX-08] ;length of regStr
0167:004607E0 7CAC             JL       0046078E
;******************************************
;【实例】~temp01(前半部)
007E0EC4  69 51 4E 7C 90 3F 8F 47  iQN|?廏4E
007E0ECC  8B 4A 5F 86              婮_?.
;******************************************
;++++++++++++++++++++++++++++++++++++++++++++
0167:004607E2 8B48F8           MOV      ECX,[EAX-08] ;length of regStr
0167:004607E5 33DB             XOR      EBX,EBX ;set of zero
0167:004607E7 33F6             XOR      ESI,ESI
0167:004607E9 85C9             TEST     ECX,ECX
0167:004607EB 7E54             JNG      00460841
;++++++++++++++++++++++++++++++++++++++++++++
;根据上面的结果regStr、regNum计算temp01的后半部
0167:004607ED 8B54240C         MOV      EDX,[ESP+0C] ;regNum
0167:004607F1 8A0C06           MOV      CL,[ESI+EAX] ;regStr[i],i=0 to the len(regStr)
0167:004607F4 884C241C         MOV      [ESP+1C],CL
0167:004607F8 8A0416           MOV      AL,[ESI+EDX] ;regNum[i]
0167:004607FB 8B4C241C         MOV      ECX,[ESP+1C]
0167:004607FF 88442418         MOV      [ESP+18],AL
0167:00460803 8B442418         MOV      EAX,[ESP+18]
0167:00460807 81E1FF000000     AND      ECX,FF
0167:0046080D 25FF000000       AND      EAX,FF
0167:00460812 03C1             ADD      EAX,ECX
0167:00460814 03D9             ADD      EBX,ECX
0167:00460816 99               CDQ     
0167:00460817 2BC2             SUB      EAX,EDX
0167:00460819 8A542418         MOV      DL,[ESP+18]
0167:0046081D 8ACB             MOV      CL,BL
0167:0046081F D1F8             SAR      EAX,1
0167:00460821 22CA             AND      CL,DL
0167:00460823 02C1             ADD      AL,CL
0167:00460825 8D4C2410         LEA      ECX,[ESP+10]
0167:00460829 88442414         MOV      [ESP+14],AL
0167:0046082D 8B542414         MOV      EDX,[ESP+14]
0167:00460831 52               PUSH     EDX
0167:00460832 E8CF170100       CALL     `MFC42!ord_000003AC`
0167:00460837 8B442408         MOV      EAX,[ESP+08] ;regStr
0167:0046083B 46               INC      ESI
0167:0046083C 3B70F8           CMP      ESI,[EAX-08]
0167:0046083F 7CAC             JL       004607ED
;******************************************
;【实例】~temp01(完整)
007E0EC4  69 51 4E 7C 90 3F 8F 47  iQN|?廏4E
007E0ECC  8B 4A 5F 86 69 51 4B 49  婮_唅QKI5F
007E0ED4  60 71 4C 4D 61 76 57 64  `qLMavWd
;******************************************
;++++++++++++++++++++++++++++++++++++++++++++
0167:00460841 8B742434         MOV      ESI,[ESP+34]
;……
;ret

;【跟进2】
;由于代码是一样的,下面就只是配合【实例】讲解顶关键算法过程
;……
0167:00460683 E81A170100       CALL     `MFC42!ord_0000021C`
0167:00460688 8B442438         MOV      EAX,[ESP+38] ;temp02
0167:0046068C B304             MOV      BL,04
0167:0046068E 8D4C2438         LEA      ECX,[ESP+38]
0167:00460692 885C242C         MOV      [ESP+2C],BL
0167:00460696 8B70F8           MOV      ESI,[EAX-08] ;length of temp02
0167:00460699 E828230100       CALL     `MFC42!ord_0000106B`
;反转temp02~revTemp02
;******************************************
;【实例】
007E10A4  64 57 76 61 4D 4C 71 60  dWvaMLq`
007E10AC  49 4B 51 86 69 5F 8B 4A  IKQ唅_婮51
007E10B4  8F 47 90 3F 7C 4E 51 69  廏?|NQi90
007E10BC  57 5A 54 4C 4A 58 46 50  WZTLJXFP
007E10C4  43                       C
;******************************************
0167:0046069E 8BC6             MOV      EAX,ESI
;……
0167:004606B3 E8D4170100       CALL     `MFC42!ord_000010B6`
;截取反转后的temp02的前16位~revTemp02_f
;******************************************
;【实例】
007E1144  64 57 76 61 4D 4C 71 60  dWvaMLq`
007E114C  49 4B 51 86 69 5F 8B 4A  IKQ唅_婮51
;******************************************
0167:004606B8 50               PUSH     EAX
;……
0167:004606DE E8A3170100       CALL     `MFC42!ord_000010B5`
;取反转后的temp02的剩余部分~revTemp02_b
;******************************************
;【实例】
007AC9D8  8F 47 90 3F 7C 4E 51 69  廏?|NQi90
007AC9E0  57 5A 54 4C 4A 58 46 50  WZTLJXFP
007AC9E8  43                       C
;******************************************
0167:004606E3 50               PUSH     EAX
0167:004606E4 8D4C2410         LEA      ECX,[ESP+10]
0167:004606E8 C644243006       MOV      BYTE [ESP+30],06
0167:004606ED E83A170100       CALL     `MFC42!ord_0000035A` ;revTemp02_b
0167:004606F2 8D4C2418         LEA      ECX,[ESP+18]
0167:004606F6 885C242C         MOV      [ESP+2C],BL
0167:004606FA E88B160100       CALL     `MFC42!ord_00000320`
0167:004606FF 8B4C2408         MOV      ECX,[ESP+08] ;revTemp02_f
0167:00460703 8B54240C         MOV      EDX,[ESP+0C] ;revTemp02_b
0167:00460707 8B41F8           MOV      EAX,[ECX-08] ;revTemp02_f的长度
0167:0046070A 8B72F8           MOV      ESI,[EDX-08] ;revTemp02_b的长度
0167:0046070D 3BC6             CMP      EAX,ESI
0167:0046070F 7E2C             JNG      0046073D
;……
0167:0046073D 8B49F8           MOV      ECX,[ECX-08]
0167:00460740 51               PUSH     ECX
0167:00460741 8D4C241C         LEA      ECX,[ESP+1C]
0167:00460745 6A00             PUSH     BYTE +00
0167:00460747 51               PUSH     ECX
0167:00460748 8D4C2418         LEA      ECX,[ESP+18] ;revTemp02_b
0167:0046074C E83B170100       CALL     `MFC42!ord_000010B6`
;从revTemp02_b中取出长度为len(revTemp02_f)的串
;******************************************
;【实例】
007E0C94  8F 47 90 3F 7C 4E 51 69  廏?|NQi90
007E0C9C  57 5A 54 4C 4A 58 46 50  WZTLJXFP
;******************************************
;……
0167:00460771 E850220100       CALL     `MFC42!ord_0000106B`
;再把这个串反转~temp02_f(注意这个变量名,f-fore)
;这其实就是在temp02中从某个位置(此处为第二位)开始取16位
;******************************************
;【实例】
007E0C94  50 46 58 4A 4C 54 5A 57  PFXJLTZW
007E0C9C  69 51 4E 7C 90 3F 8F 47  iQN|?廏4E
;******************************************
0167:00460776 8D4C2408         LEA      ECX,[ESP+08]
0167:0046077A E847220100       CALL     `MFC42!ord_0000106B`
;把temp02_f反转~temp02_b(注意这个变量名,b-behind)
;这其实就是跟着前面在temp02中取16位
;******************************************
;【实例】
007E1144  8B 4A 5F 86 69 51 4B 49  婮_唅QKI5F
007E114C  60 71 4C 4D 61 76 57 64  `qLMavWd
;******************************************
0167:0046077F 8B442408         MOV      EAX,[ESP+08] ;temp02_b
0167:00460783 33DB             XOR      EBX,EBX
0167:00460785 33F6             XOR      ESI,ESI
0167:00460787 8B48F8           MOV      ECX,[EAX-08]
0167:0046078A 85C9             TEST     ECX,ECX
0167:0046078C 7E54             JNG      004607E2

0167:0046078E 8A1406           MOV      DL,[ESI+EAX] ;temp02_b[i]
0167:00460791 8B44240C         MOV      EAX,[ESP+0C] ;temp02_f[i]
0167:00460795 88542418         MOV      [ESP+18],DL
0167:00460799 8A0C06           MOV      CL,[ESI+EAX]
0167:0046079C 8B442418         MOV      EAX,[ESP+18]
0167:004607A0 884C241C         MOV      [ESP+1C],CL
0167:004607A4 25FF000000       AND      EAX,FF
0167:004607A9 8B4C241C         MOV      ECX,[ESP+1C]
0167:004607AD 81E1FF000000     AND      ECX,FF
0167:004607B3 03C1             ADD      EAX,ECX
0167:004607B5 03D9             ADD      EBX,ECX
0167:004607B7 8A4C2418         MOV      CL,[ESP+18]
0167:004607BB 99               CDQ     
0167:004607BC 2BC2             SUB      EAX,EDX
0167:004607BE 8AD3             MOV      DL,BL
0167:004607C0 D1F8             SAR      EAX,1
0167:004607C2 22D1             AND      DL,CL
0167:004607C4 8D4C2410         LEA      ECX,[ESP+10]
0167:004607C8 02C2             ADD      AL,DL
0167:004607CA 88442414         MOV      [ESP+14],AL
0167:004607CE 8B442414         MOV      EAX,[ESP+14] ;temp02_b
0167:004607D2 50               PUSH     EAX
0167:004607D3 E82E180100       CALL     `MFC42!ord_000003AC`
;store temp03(前半部分)[i]
0167:004607D8 8B442408         MOV      EAX,[ESP+08]
0167:004607DC 46               INC      ESI
0167:004607DD 3B70F8           CMP      ESI,[EAX-08]
0167:004607E0 7CAC             JL       0046078E
;******************************************
;【实例】~temp03(前半部分)
007AC9D8  6D 4A A9 68 5A A2 54 59  mJ﹉ZYA9
007AC9E0  C4 A2 4D 71 79 AE B6 75  蘑Mqyu4D
;******************************************

0167:004607E2 8B48F8           MOV      ECX,[EAX-08] ;temp02_b长度=10h
0167:004607E5 33DB             XOR      EBX,EBX
0167:004607E7 33F6             XOR      ESI,ESI
0167:004607E9 85C9             TEST     ECX,ECX
0167:004607EB 7E54             JNG      00460841

0167:004607ED 8B54240C         MOV      EDX,[ESP+0C] ;temp02_f[i]
0167:004607F1 8A0C06           MOV      CL,[ESI+EAX] ;temp02_b[i]
0167:004607F4 884C241C         MOV      [ESP+1C],CL
0167:004607F8 8A0416           MOV      AL,[ESI+EDX]
0167:004607FB 8B4C241C         MOV      ECX,[ESP+1C]
0167:004607FF 88442418         MOV      [ESP+18],AL
0167:00460803 8B442418         MOV      EAX,[ESP+18]
0167:00460807 81E1FF000000     AND      ECX,FF
0167:0046080D 25FF000000       AND      EAX,FF
0167:00460812 03C1             ADD      EAX,ECX
0167:00460814 03D9             ADD      EBX,ECX
0167:00460816 99               CDQ     
0167:00460817 2BC2             SUB      EAX,EDX
0167:00460819 8A542418         MOV      DL,[ESP+18]
0167:0046081D 8ACB             MOV      CL,BL
0167:0046081F D1F8             SAR      EAX,1
0167:00460821 22CA             AND      CL,DL
0167:00460823 02C1             ADD      AL,CL
0167:00460825 8D4C2410         LEA      ECX,[ESP+10]
0167:00460829 88442414         MOV      [ESP+14],AL
0167:0046082D 8B542414         MOV      EDX,[ESP+14]
0167:00460831 52               PUSH     EDX
0167:00460832 E8CF170100       CALL     `MFC42!ord_000003AC`
;temp03(后半部分)[i]
0167:00460837 8B442408         MOV      EAX,[ESP+08]
0167:0046083B 46               INC      ESI
0167:0046083C 3B70F8           CMP      ESI,[EAX-08]
0167:0046083F 7CAC             JL       004607ED
;******************************************
;【实例】~temp03(完整)
007AC9D8  6D 4A A9 68 5A A2 54 59  mJ﹉ZYA9
007AC9E0  C4 A2 4D 71 79 AE B6 75  蘑Mqyu4D
007AC9E8  6D 8C 6B 72 5A A6 6C 50  m宬rZP6B
007AC9F0  CC B2 51 D4 08 63 F3 59  滩Q?c骙 51
;******************************************
;……
;ret


标 题:乐透之王【算法总结】~各位大佬,我…我……… (2千字)
发信人:lq7972
时 间:2003-10-19 13:20:11
详细信息:

Software:彩票分析家-"乐透之王"V3.0
Tools:TRW2000、OllyDbg1.09、KeyMake V1.73、Win98Se
Cracker:lq7972[bruceyu13@sina.com]

【总结】
算法好烦;大家可以用它来练习耐心
还是把算法过程简单(??)讲讲:
⑴软件先根据用户输入的E-mail生成机器码,通过检测E-mail的长度是否不小于8来验证其是否合法(仅仅如此);这个过程与注册码的计算是同一的,并且不论是软件启动还是注册验证都要把这两个过程运行一遍(真是浪费时间)
⑵然后把给定的字串givedStr02同机器码链接起来,再反转(_mbsrev)它们
⑶通过除2运算(sar操作)对拆它们,再分别把这两个串又反转过来
⑷然后通过一系列的运算得到第一个中间字串变量tempStr01
⑸将givedStr02与tempStr01链接成第二个中间字串变量tempStr02
⑹把tempStr02对拆,分别反转,计算得到第三个中间字串变量tempStr03;这个过程与前面是同一的
⑺从tempStr01和tempStr03各一个个地取字符,通过一系列计算得到第四个中间字串变量tempStr04
⑻第五个中间字串变量tempStr05的计算与tempStr01、tempStr03一样,不过传入的是tempStr04而不是tempStr02
⑼接着,(同样)传入tempStr05计算第六个中间字串变量tempStr06
⑽接下来,利用tempStr06计算(与上面不同,是独自的计算过程)第七个中间字串变量tempStr07,这里有一些比较,当为确定是否落在字符区
⑾到这里,还没完(~玩死你~)
⑿利用tempStr07计算出最后的字符串,这是纯字母(大/小写)的串;如果计算的结果没有落在字母区(当然有一连串的比较跳转),就从给定的字串givedStr01中依次取
⒀最后,注意,最后(不是然后!),但不要乐观:先获得依次取出的字符的ASCII码,再得到它的个位(可用mod),再转成字符形式;再依次链接,再……
⒁没有了
………………
⒂嘘,终于得到了

软件给定的两个串:
givedStr01:LuxingJypAndOneZsAndTwoSaimanAndThreeFiymanAndFourDangDangAndFiveHelpyHappySix
givedStr02:CPFXJLTZW

软件信息在注册表到处丢--当垃圾站了:
(1)\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\WLtinfo\Harpy\
Sum=0x00005050,这是使用0次;使用一次加1
(2)\HKEY_LOCAL_MACHINE\Software\绿星软件……是保存注册Email、注册码等,软件启动时从这里读取注册码校验
(3)\HKEY_CURRENT_USER\Software\LUXING SoftWare……

【注册机】
注册机就用KeyMake弄吧
彩票分析家-"乐透之王"V3内存注册机
注意:一定要保证注册表中的"RegID"<前述(2)项中>值为空,否则可能逮不到正确的值;另外得到的值末尾捎带了个无用的"1"
中断地址:460ACA
中断次数:1
第一字节:52
指令长度:1
保存信息:内存方式
内存地址:7E0C94
另:有空的时候写个注册机……

【AfterWord】
我也没想到这篇文字写了这么长--的确,写出PJ过程远比实际的PJ花费更多的时间
弄这个软件时,我是很烦躁的,如此反复算来算去(不是难而是繁&烦)使任何想破解它的人精神崩溃,幸亏我蛤蟆功练到了12重……
哈哈~哈