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﹉ZYA9
007AC9E0 C4 A2 4D 71 79 AE B6 75 蘑Mqyu4D
;******************************************
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﹉ZYA9
007AC9E0 C4 A2 4D 71 79 AE B6 75 蘑Mqyu4D
007AC9E8 6D 8C 6B 72 5A A6 6C 50 m宬rZP6B
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重……
哈哈~哈