lol成哥是谁?今天看到WE若风草莓微笑笑笑爆笑5排视频里面老听到里面老叫成哥成哥的,所以你知道lol成哥是谁?不知道小编告诉你
【软件限制】:功能限制 【作者声明】:初学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.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.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.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.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.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:[] 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 —————————————————————————————————