-
您的位置:首页 → 精文荟萃 → 破解文章 → 英语八哥 V3.6
英语八哥 V3.6
时间:2004/10/15 1:01:00来源:本站整理作者:蓝点我要评论(0)
-
【软件限制】:功能限制
【作者声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!
【破解工具】:TRW2000娃娃修改版、Ollydbg1.09、PEiD、W32Dasm 9.0白金版
—————————————————————————————————
【过 程】:
英语八哥.exe 无壳。 P-Code 的东东。
据说完整注册还需要一个DLL文件,我这里只是简单探讨一下其注册码的保护方式,我也没有那个DLL文件。
哎,非要碰上这个难缠的P-Code,用了我2天的宝贵时间来分析,许多的指令不知道其涵义,只能是猜测+调试了。
不明白P-Code的许多命令都要来两次,呵呵,我现在已然是晕头转向了。错误之处烦请方家指正!
点“注册”没有一点提示,于是用TRW的万能断点,简单就找到了比较的地方,但是找算法却花了20倍的时间!
我的水平很低,许多地方无法写清楚了。抱歉!
突然想起作者推崇的“黄金分割定律”,或许这个程序的算法也运用了“黄金分割比率”的某些方面呀。
向作者道歉了!佩服作者的编程功夫!真的奢望某某年之后我也能达到这个水平呀!
机器码:6004111345232619
试炼码:13572468
—————————————————————————————————
一、调用MSVBVM60.rtcMidCharBstr取5KA089DJ的字符:
5KA089DJ应该是我硬盘的某个信息,依稀记得曾调试过的某个软件也是取这个参数。
66024808 E8 1E000000 CALL MSVBVM60.rtcMidBstr
6602480D C9 LEAVE
6602480E C2 0C00 RETN 0C
66024811 33C9 XOR ECX,ECX
66024813 ^ EB E2 JMP SHORT MSVBVM60.660247F7
66024815 50 PUSH EAX
66024816 66:C745 F0 0300 MOV WORD PTR SS:[EBP-10],3
6602481C E8 7A010000 CALL MSVBVM60.6602499B
66024821 D1E0 SHL EAX,1
66024823 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
66024826 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
66024829 ^ EB D1 JMP SHORT MSVBVM60.660247FC
6602482B > 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8]
6602482F 53 PUSH EBX
66024830 56 PUSH ESI
66024831 57 PUSH EDI
66024832 8D78 FF LEA EDI,DWORD PTR DS:[EAX-1]
66024835 85FF TEST EDI,EDI
66024837 0F8C 91260200 JL MSVBVM60.66046ECE
6602483D 81FF FFFFFF7F CMP EDI,7FFFFFFF
66024843 0F8F 85260200 JG MSVBVM60.66046ECE
66024849 8B4424 10 MOV EAX,DWORD PTR SS:[ESP+10]
6602484D 8BDF MOV EBX,EDI
6602484F 85C0 TEST EAX,EAX
66024851 0F84 7E260200 JE MSVBVM60.66046ED5
66024857 8B70 FC MOV ESI,DWORD PTR DS:[EAX-4]
6602485A 3BFE CMP EDI,ESI
6602485C 0F87 7A260200 JA MSVBVM60.66046EDC
66024862 8B4C24 18 MOV ECX,DWORD PTR SS:[ESP+18]
66024866 66:8339 0A CMP WORD PTR DS:[ECX],0A
6602486A 75 35 JNZ SHORT MSVBVM60.660248A1
6602486C 8179 08 0400028>CMP DWORD PTR DS:[ECX+8],80020004
66024873 75 2C JNZ SHORT MSVBVM60.660248A1
66024875 83C8 FF OR EAX,FFFFFFFF
66024878 66:85C0 TEST AX,AX
6602487B 74 28 JE SHORT MSVBVM60.660248A5
6602487D 2BF3 SUB ESI,EBX
6602487F 8BC6 MOV EAX,ESI
66024881 50 PUSH EAX
66024882 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]
====>EAX=5KA089DJ
66024886 03D8 ADD EBX,EAX
====>EBX=依次取5KA089DJ字符的HEX值
66024888 53 PUSH EBX
66024889 FF15 EC190066 CALL DWORD PTR DS:[<&OLEAUT32.#150>]; OLEAUT32.SysAllocStringByteLen
6602488F 8BF0 MOV ESI,EAX
66024891 85F6 TEST ESI,ESI
66024893 0F84 51260200 JE MSVBVM60.66046EEA
66024899 8BC6 MOV EAX,ESI
6602489B 5F POP EDI
6602489C 5E POP ESI
6602489D 5B POP EBX
6602489E C2 0C00 RETN 0C
—————————————————————————————————
比较取的字符是否是数字:
77A32A0E F3:66:A7 REPE CMPS WORD PTR ES:[EDI],WORD PTR DS:>
====>比较所取的字符是否是数字。每个字符都比较2次,呵呵。
6610344F E8 03CDFFFF CALL MSVBVM60.__vbaBoolVarNull
====>晕,再比较一次
取硬盘参数5KA089DJ。如果是数字则直接保留;是字母则取其字符的HEX值的10进制值并加上其所在的位数。
5KA089DJ得出577680897582 呵呵,这个答案是猜测的,抱歉没能找到转换的地方。
—————————————————————————————————
调用OLEAUT32.VarBstrCat 连接所得出的字符:
66025324 > 55 PUSH EBP
66025325 8BEC MOV EBP,ESP
66025327 8D45 08 LEA EAX,DWORD PTR SS:[EBP+8]
6602532A 50 PUSH EAX
6602532B FF75 08 PUSH DWORD PTR SS:[EBP+8]
6602532E FF75 0C PUSH DWORD PTR SS:[EBP+C]
66025331 FF15 6CFE1066 CALL DWORD PTR DS:[6610FE6C]; OLEAUT32.VarBstrCat
66025337 85C0 TEST EAX,EAX
66025339 0F8C D11A0200 JL MSVBVM60.66046E10
6602533F 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
====>5KA089DJ最后得出 EAX=577680897582
66025342 5D POP EBP
66025343 C2 0800 RETN 8
—————————————————————————————————
下面再取577680897582:
66024882 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]
====>EAX=577680897582
66024886 03D8 ADD EBX,EAX
1、 ====>EBX=897582 从第7位取577680897582
2、 ====>EBX=7680897582 从第3位取577680897582
66024888 53 PUSH EBX
66024889 FF15 EC190066 CALL DWORD PTR DS:[<&OLEAUT32.#150>] ; OLEAUT32.SysAllocStringByteLen
6602488F 8BF0 MOV ESI,EAX
66024891 85F6 TEST ESI,ESI
66024893 0F84 51260200 JE MSVBVM60.66046EEA
66024899 8BC6 MOV EAX,ESI
1、 ====>897 取897582的前3位
2、 ====>768 取7680897582的前3位
6602489B 5F POP EDI
6602489C 5E POP ESI
6602489D 5B POP EBX
6602489E C2 0C00 RETN 0C
66024A2A 8B41 FC MOV EAX,DWORD PTR DS:[ECX-4]
66024A2D 2BC2 SUB EAX,EDX
66024A2F 52 PUSH EDX
66024A30 03C1 ADD EAX,ECX
66024A32 50 PUSH EAX
3、 ====>EAX=582
4、 ====>EAX=768582
66024A33 FF15 EC190066 CALL DWORD PTR DS:[<&OLEAUT32.#150>] ; OLEAUT32.SysAllocStringByteLen
66024A39 8BF0 MOV ESI,EAX
66024A3B 85F6 TEST ESI,ESI
66024A3D 0F84 84240200 JE MSVBVM60.66046EC7
66024A43 8BC6 MOV EAX,ESI
66024A45 5E POP ESI
66024A46 C2 0800 RETN 8
—————————————————————————————————
对上面所取的字符进行连接:
66105616 FFD3 CALL EBX ; MSVBVM60.__vbaVarAdd
66105618 57 PUSH EDI
66105619 33C0 XOR EAX,EAX
6610561B 8A46 02 MOV AL,BYTE PTR DS:[ESI+2]
6610561E 83C6 03 ADD ESI,3
66105621 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]
跟进MSVBVM60.__vbaVarAdd:
77A2F04D >/$ 55 PUSH EBP
77A2F04E |. 8BEC MOV EBP,ESP
77A2F050 |. 53 PUSH EBX
77A2F051 |. 56 PUSH ESI
77A2F052 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
77A2F055 |. 57 PUSH EDI
77A2F056 |. 85F6 TEST ESI,ESI
77A2F058 |. 75 2E JNZ SHORT OLEAUT32.77A2F088
77A2F05A |. 33DB XOR EBX,EBX
77A2F05C |> 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]
77A2F05F |. 85C0 TEST EAX,EAX
77A2F061 |. 75 2A JNZ SHORT OLEAUT32.77A2F08D
77A2F063 |. 2145 08 AND DWORD PTR SS:[EBP+8],EAX
77A2F066 |> 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
77A2F069 |. 03C3 ADD EAX,EBX
77A2F06B |. 50 PUSH EAX
77A2F06C |. 6A 00 PUSH 0
77A2F06E |. E8 194EF8FF CALL OLEAUT32.SysAllocStringByteLen
77A2F073 |. 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
77A2F076 |. 85C0 TEST EAX,EAX
77A2F078 |. 8901 MOV DWORD PTR DS:[ECX],EAX
77A2F07A |. 75 19 JNZ SHORT OLEAUT32.77A2F095
77A2F07C |. B8 0E000780 MOV EAX,8007000E
77A2F081 |> 5F POP EDI
77A2F082 |. 5E POP ESI
77A2F083 |. 5B POP EBX
77A2F084 |. 5D POP EBP
77A2F085 |. C2 0C00 RETN 0C
577680897582重新连接的结果为:577897768582
然后再分别取前6位、后6位运算。
—————————————————————————————————
分别取768582、577897与程序给的654321相加:
77A2F546 E8 B420F8FF CALL OLEAUT32.VariantChangeTypeEx
77A2F54B 85C0 TEST EAX,EAX
77A2F54D 8945 08 MOV DWORD PTR SS:[EBP+8],EAX
77A2F550 ^ 0F8C ADFDFFFF JL OLEAUT32.77A2F303
77A2F556 DD45 E0 FLD QWORD PTR SS:[EBP-20]
====>SS:[EBP-20]=654321.0000000000 程序自给
77A2F559 DC45 F0 FADD QWORD PTR SS:[EBP-10]
1、====>ST=654321.0000000000 + 768582.0000000000=1422903.0000000000000
2、====>ST=654321.0000000000 + 577897.0000000000=701353.00000000000000
77A2F55C DD55 F8 FST QWORD PTR SS:[EBP-8]
77A2F55F 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4]
77A2F562 B8 0000F07F MOV EAX,7FF00000
77A2F567 23C8 AND ECX,EAX
77A2F569 6A 05 PUSH 5
77A2F56B 3BC8 CMP ECX,EAX
77A2F56D 5B POP EBX
77A2F56E 0F85 E0000000 JNZ OLEAUT32.77A2F654
77A2F574 DDD8 FSTP ST
77A2F576 DBE2 FCLEX
77A2F578 C745 08 0A00028>MOV DWORD PTR SS:[EBP+8],8002000A
77A2F57F ^ E9 9FFDFFFF JMP OLEAUT32.77A2F323
—————————————————————————————————
将1422903和701053转换成UNICODE格式:
661034CF E8 FA15FEFF CALL MSVBVM60.__vbaStrI4
661034D4 50 PUSH EAX
1、====>EAX=1422903
2、====>EAX=701353
661034D5 33C0 XOR EAX,EAX
661034D7 8A06 MOV AL,BYTE PTR DS:[ESI]
661034D9 46 INC ESI
661034DA FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]
—————————————————————————————————
将1422903和701053 连接起来:
660FE996 E8 8969F2FF CALL MSVBVM60.__vbaStrCat
660FE99B 50 PUSH EAX
660FE99C 33C0 XOR EAX,EAX
660FE99E 8A06 MOV AL,BYTE PTR DS:[ESI]
660FE9A0 46 INC ESI
660FE9A1 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]
66025324 > 55 PUSH EBP
66025325 8BEC MOV EBP,ESP
66025327 8D45 08 LEA EAX,DWORD PTR SS:[EBP+8]
6602532A 50 PUSH EAX
6602532B FF75 08 PUSH DWORD PTR SS:[EBP+8]
6602532E FF75 0C PUSH DWORD PTR SS:[EBP+C]
66025331 FF15 6CFE1066 CALL DWORD PTR DS:[6610FE6C]; OLEAUT32.VarBstrCat
66025337 85C0 TEST EAX,EAX
66025339 0F8C D11A0200 JL MSVBVM60.66046E10
6602533F 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
====>EAX=1422903701053
66025342 5D POP EBP
66025343 C2 0800 RETN 8
—————————————————————————————————
取1422903701053的前8位14229037的16进制值:
66103650 E8 7150FEFF CALL MSVBVM60.__vbaI4ErrVar
66103655 50 PUSH EAX
====>EAX=00D91E2D(H)=14229037(D)
66103656 33C0 XOR EAX,EAX
66103658 8A06 MOV AL,BYTE PTR DS:[ESI]
6610365A 46 INC ESI
6610365B FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]
00D91E2D就是运算注册码的核心参数!!!
—————————————————————————————————
用14229037生成软件上所显示的机器码:
呵呵,我实在是太累了,这一步无法详细跟踪了,最后再给个简单的求逆方式。^O^^O^
66103675 E8 6315FEFF CALL MSVBVM60.rtBstrFromErrVar
6610367A 50 PUSH EAX
====>EAX=140069162 很象我的机器码的某些位呀^O^^O^
6610367B 33C0 XOR EAX,EAX
6610367D 8A06 MOV AL,BYTE PTR DS:[ESI]
6610367F 46 INC ESI
66103680 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]
660F99F0 57 PUSH EDI
660F99F1 56 PUSH ESI
660F99F2 8B73 FC MOV ESI,DWORD PTR DS:[EBX-4]
660F99F5 D1EE SHR ESI,1
660F99F7 56 PUSH ESI
660F99F8 6A 00 PUSH 0
660F99FA FF15 E8190066 CALL DWORD PTR DS:[<&OLEAUT32.#4>] ; OLEAUT32.SysAllocStringLen
660F9A00 8BF8 MOV EDI,EAX
...........
.......
660F9A27 41 INC ECX
660F9A28 4A DEC EDX
660F9A29 66:8930 MOV WORD PTR DS:[EAX],SI
660F9A2C ^ 75 F3 JNZ SHORT MSVBVM60.660F9A21
660F9A2E 8BC7 MOV EAX,EDI
660F9A30 5E POP ESI
660F9A31 5F POP EDI
660F9A32 ^ EB B8 JMP SHORT MSVBVM60.660F99EC
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
====>下面是填入试炼码后拦截的关键部分:
—————————————————————————————————
分别取试炼码13572468和核心参数14229037。并转换成UNICODE格式:
6601B79B FFD6 CALL ESI
6601B79D 837D 0C FF CMP DWORD PTR SS:[EBP+C],-1
6601B7A1 8BF8 MOV EDI,EAX
6601B7A3 75 01 JNZ SHORT MSVBVM60.6601B7A6
6601B7A5 4F DEC EDI
6601B7A6 57 PUSH EDI
6601B7A7 53 PUSH EBX
6601B7A8 FF15 E8190066 CALL DWORD PTR DS:[<&OLEAUT32.#4>]; OLEAUT32.SysAllocStringLen
6601B7AE 3BC3 CMP EAX,EBX
6601B7B0 8945 FC MOV DWORD PTR SS:,EAX
====>[EBP-4]=EAX=14229037 机器码生成的核心参数
6601B7B3 0F84 E9F90100 JE MSVBVM60.6603B1A2
6601B7B9 47 INC EDI
6601B7BA 57 PUSH EDI
6601B7BB 50 PUSH EAX
6601B7BC FF75 0C PUSH DWORD PTR SS:[EBP+C]
6601B7BF FF75 08 PUSH DWORD PTR SS:[EBP+8]
====>[EBP+8]=13572468 试炼码
6601B7C2 53 PUSH EBX
6601B7C3 53 PUSH EBX
6601B7C4 FFD6 CALL ESI
====>将试炼码和14229037转换成UNICODE格式
6601B7C6 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
1、 ====>EAX=1357248
2、 ====>EAX=14229037
6601B7C9 5F POP EDI
6601B7CA 5E POP ESI
6601B7CB 5B POP EBX
6601B7CC C9 LEAVE
6601B7CD C2 0800 RETN 8
—————————————————————————————————
下面是调用 MSVBVM60.__vbaI4Str 取14229037的16进制值
66103597 E8 BB1FFEFF CALL MSVBVM60.__vbaI4Str
====>取14229037的16进制值00D91E2D
6610359C 50 PUSH EAX
====>EAX=00D91E2D
6610359D 33C0 XOR EAX,EAX
6610359F 8A06 MOV AL,BYTE PTR DS:[ESI]
661035A1 46 INC ESI
661035A2 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]
—————————————————————————————————
下面是对00D91E2D进行简单的 除2 运算,取得商:
6610533B 59 POP ECX
6610533C 58 POP EAX
6610533D 99 CDQ
6610533E F7F9 IDIV ECX
====>EAX=00D91E2D / 2=006C8F16(H)=7114518(D)
66105340 50 PUSH EAX
66105341 33C0 XOR EAX,EAX
66105343 8A06 MOV AL,BYTE PTR DS:[ESI]
66105345 46 INC ESI
66105346 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]
—————————————————————————————————
下面是取商006C8F16的10进制值:
661034CF E8 FA15FEFF CALL MSVBVM60.__vbaStrI4
661034D4 50 PUSH EAX
====>EAX=7114518
661034D5 33C0 XOR EAX,EAX
661034D7 8A06 MOV AL,BYTE PTR DS:[ESI]
661034D9 46 INC ESI
661034DA FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]
—————————————————————————————————
下面是调用 rtcStrReverse 命令将7114518倒序排列:^O^^O^
660F9A00 8BF8 MOV EDI,EAX
====>EDI=EAX=7114518
660F9A02 85FF TEST EDI,EDI
660F9A04 75 07 JNZ SHORT MSVBVM60.660F9A0D
660F9A06 6A 0E PUSH 0E
660F9A08 E8 85BBF2FF CALL MSVBVM60.66025592
660F9A0D 66:832477 00 AND WORD PTR DS:[EDI+ESI*2],0
660F9A12 8D0477 LEA EAX,DWORD PTR DS:[EDI+ESI*2]
660F9A15 8BD6 MOV EDX,ESI
660F9A17 4E DEC ESI
660F9A18 85D2 TEST EDX,EDX
660F9A1A 8BCB MOV ECX,EBX
660F9A1C 76 10 JBE SHORT MSVBVM60.660F9A2E
660F9A1E 8D56 01 LEA EDX,DWORD PTR DS:[ESI+1]
660F9A21 66:8B31 MOV SI,WORD PTR DS:[ECX]
660F9A24 48 DEC EAX
660F9A25 48 DEC EAX
660F9A26 41 INC ECX
660F9A27 41 INC ECX
660F9A28 4A DEC EDX
660F9A29 66:8930 MOV WORD PTR DS:[EAX],SI
660F9A2C ^ 75 F3 JNZ SHORT MSVBVM60.660F9A21
660F9A2E 8BC7 MOV EAX,EDI
====>EAX=8154117 倒序排列的结果!注意!!
660F9A30 5E POP ESI
660F9A31 5F POP EDI
660F9A32 ^ EB B8 JMP SHORT MSVBVM60.660F99EC
—————————————————————————————————
下面是调用 MSVBVM60.__vbaLenBstr 命令取8154117的长度:
661071D4 E8 F2D6F1FF CALL MSVBVM60.__vbaLenBstr
661071D9 50 PUSH EAX
====>EAX=7 以此长度取下面的试炼码进行比较!
661071DA 33C0 XOR EAX,EAX
661071DC 8A06 MOV AL,BYTE PTR DS:[ESI]
661071DE 46 INC ESI
—————————————————————————————————
下面是调用 MSVBVM60.rtcLeftVar 命令取试炼码的前7位字符:
660248EE > 55 PUSH EBP
660248EF 8BEC MOV EBP,ESP
660248F1 83EC 10 SUB ESP,10
660248F4 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
660248F7 56 PUSH ESI
660248F8 03C0 ADD EAX,EAX
660248FA 57 PUSH EDI
660248FB 50 PUSH EAX
660248FC 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
660248FF FF75 0C PUSH DWORD PTR SS:[EBP+C]
66024902 50 PUSH EAX
66024903 E8 11000000 CALL MSVBVM60.rtcLeftVar
66024908 8BF0 MOV ESI,EAX
6602490A 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
6602490D 8BF8 MOV EDI,EAX
6602490F A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
66024910 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
66024911 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
66024912 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
66024913 5F POP EDI
66024914 5E POP ESI
66024915 C9 LEAVE
66024916 C2 0C00 RETN 0C
66024919 > 55 PUSH EBP
6602491A 8BEC MOV EBP,ESP
6602491C 83EC 10 SUB ESP,10
6602491F 56 PUSH ESI
66024920 57 PUSH EDI
66024921 FF35 B0FE1066 PUSH DWORD PTR DS:[6610FEB0]
66024927 FF15 AC100066 CALL DWORD PTR DS:[<&KERNEL32.TlsGetvalue>]
6602492D 8D70 50 LEA ESI,DWORD PTR DS:[EAX+50]
66024930 56 PUSH ESI
66024931 FF75 0C PUSH DWORD PTR SS:[EBP+C]
66024934 E8 37000000 CALL MSVBVM60.66024970
66024939 83F8 FF CMP EAX,-1
6602493C 0F84 52250200 JE MSVBVM60.66046E94
66024942 FF75 10 PUSH DWORD PTR SS:[EBP+10]
66024945 50 PUSH EAX
====>EAX=13572468 试炼码
66024946 E8 18FEFFFF CALL MSVBVM60.rtcLeftBstr
====>取试炼码的前7位!
6602494B 66:833E 08 CMP WORD PTR DS:[ESI],8
6602494F 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX
====>[EBP-8]=EAX=1357246 试炼码的前7位
66024952 66:C745 F0 0800 MOV WORD PTR SS:[EBP-10],8
66024958 0F84 24250200 JE MSVBVM60.66046E82
6602495E 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8]
66024961 8D75 F0 LEA ESI,DWORD PTR SS:[EBP-10]
66024964 8BF8 MOV EDI,EAX
66024966 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
66024967 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
66024968 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
66024969 A5 MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ESI]
6602496A 5F POP EDI
6602496B 5E POP ESI
6602496C C9 LEAVE
6602496D C2 0C00 RETN 0C
—————————————————————————————————
下面是调用 OLEAUT32.VarCmp 进行比较了:^O^^O^^O^^O^
66100055 FF15 60FE1066 CALL DWORD PTR DS:[6610FE60] ; OLEAUT32.VarCmp
6610005B 8945 08 MOV DWORD PTR SS:[EBP+8],EAX
6610005E 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
66100061 85F6 TEST ESI,ESI
66100063 0F8C E9780000 JL MSVBVM60.66107952
====>不跳则OVER! 呵呵,可惜无法爆破了。
66100069 8D46 FF LEA EAX,DWORD PTR DS:[ESI-1]
6610006C 5F POP EDI
6610006D 5E POP ESI
6610006E 5B POP EBX
6610006F C9 LEAVE
66100070 C2 0C00 RETN 0C
跟进OLEAUT32.VarCmp:
77A329D3 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
====>ESI=1357246 试炼码的前7位!
77A329D6 |. 57 PUSH EDI
77A329D7 |. 85F6 TEST ESI,ESI
77A329D9 |. 75 4C JNZ SHORT OLEAUT32.77A32A27
77A329DB |. 2175 FC AND DWORD PTR SS:[EBP-4],ESI
77A329DE |> 8B4D 0C MOV ECX,DWORD PTR SS:[EBP+C]
====>ECX=8154117 呵呵,这就是我的注册码了!
77A329E1 |. 85C9 TEST ECX,ECX
77A329E3 |. 75 4A JNZ SHORT OLEAUT32.77A32A2F
77A329E5 |. 33DB XOR EBX,EBX
77A329E7 |> 395D FC CMP DWORD PTR SS:[EBP-4],EBX
77A329EA |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
77A329ED |. 72 02 JB SHORT OLEAUT32.77A329F1
77A329EF |. 8BD3 MOV EDX,EBX
77A329F1 |> 8B45 10 MOV EAX,DWORD PTR SS:[EBP+10]
77A329F4 |. 85C0 TEST EAX,EAX
77A329F6 |. 75 5B JNZ SHORT OLEAUT32.77A32A53
77A329F8 |. 85D2 TEST EDX,EDX
77A329FA |. 74 60 JE SHORT OLEAUT32.77A32A5C
77A329FC |. 8BC2 MOV EAX,EDX
77A329FE |. D1E8 SHR EAX,1
77A32A00 |. 8945 10 MOV DWORD PTR SS:[EBP+10],EAX
77A32A03 |. 8B7D 0C MOV EDI,DWORD PTR SS:[EBP+C]
77A32A06 |. 8B75 08 MOV ESI,DWORD PTR SS:[EBP+8]
77A32A09 |. 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]
77A32A0C |. 33C0 XOR EAX,EAX
77A32A0E |. F3:66:A7 REPE CMPS WORD PTR ES:[EDI],WORD PTR DS:[ESI]
====>逐位比较!有一个不同就OVER了!
77A32A11 |. 74 05 JE SHORT OLEAUT32.77A32A18
====>不跳则OVER!
77A32A13 |. 1BC0 SBB EAX,EAX
77A32A15 |. 83D8 FF SBB EAX,-1
77A32A18 |> 85C0 TEST EAX,EAX
77A32A1A |. 7F 45 JG SHORT OLEAUT32.77A32A61
77A32A1C |. 7D 16 JGE SHORT OLEAUT32.77A32A34
77A32A1E |. 33C0 XOR EAX,EAX
77A32A20 |> 5F POP EDI
77A32A21 |. 5E POP ESI
77A32A22 |. 5B POP EBX
77A32A23 |. C9 LEAVE
77A32A24 |. C2 1000 RETN 10
—————————————————————————————————
【算 法 总 结】:
这应该是我跟踪过的最麻烦的P-Code程序了。
程序首先取我的硬盘某个参数5KA089DJ生成运算注册码的核心参数14229037,再用14229037生成显示出来的机器码。
呵呵,我学习 SIMONYAN 大侠的教材简单猜测一下过程,感谢 SIMONYAN 大侠!
1、我的机器码是6004111345232619 取机器码的前5位60041 和后4位 2619
2、分别倒序排列:60041->14006 2619->9162
3、将这2部分连接起来:140069162
4、140069162-125840125=14229037 (125840125应该是固定参数)这样就得出了我上面的核心参数了。
5、14229037 / 2=7114518 (取商)
6、7114518 倒序排列:8154117 这个就是我的注册码了!
当然,这个求逆过程有些是我的猜测,并不一定是完全正确的。
以前有人说过其注册码是10位的,但是我分析的这个3.6版却没有这个限制,或许程序还有其它的暗桩。
限于我的水平太低,只能分析到这一步了,欢迎老师们指教!^O^^O^^O^^O^
—————————————————————————————————
【注册信息保存】:
REGEDIT4
[HKEY_CURRENT_USER\Software\VB and VBA Program Settings\bogo\enbogo]
"englishbogo"="7114518"
—————————————————————————————————
【整 理】:
机器码:6004111345232619
注册码:8154117
—————————————————————————————————
|
相关阅读
Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么
-
热门文章
去除winrar注册框方法
最新文章
比特币病毒怎么破解 比去除winrar注册框方法
华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)通过Access破解MSSQL获得数据
人气排行
华为无线路由器HG522-C破解教程(附超级密码JEB格式文件京东电子书下载和阅读限制破解教UltraISO注册码全集(最新)qq相册密码破解方法去除winrar注册框方法(适应任何版本)怎么用手机破解收费游戏华为无线猫HG522破解如何给软件脱壳基础教程
查看所有0条评论>>