老文章档案 · 2003 年

大岩个人所得税计算软件 1.0(P-Code)

破解教程 · 技术资料 · 2003-10-08 · 作者:fly 人气: · 出处:赢政天下整理收藏)

【软件限制】:30天试用、功能限制

【作者声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠赐教!

【破解工具】:TRW2000娃娃修改版、Ollydbg1.09、PEiD、W32Dasm 9.0白金版

—————————————————————————————————

【过 程】:

sds.exe 无壳。Visual Basic 6.0 编写。繁琐的P-Code程序!发现WKTVBDE用不了。

至于同门的某个公路工程预算软件就不公布了其笔记了,^O^ ^O^ 大体算法流程是差不多的。

用户名:fly

机器码:1055432603Pentium Pro07/11/02

试炼码:13572468

—————————————————————————————————

程序的机器码是取C盘序列号、CPU信息以及BIOS日期生成的。程序只对系统盘的序列号进行了简单的处理,因为主要是想看看注册码的算法,所以这里就不深究机器码的生成了。

66103486 8B47 08 MOV EAX,DWORD PTR DS:[EDI+8]

====>EAX=1055432603Pentium Pro07/11/02 机器码

66103489 0FBF1E MOVSX EBX,WORD PTR DS:[ESI]

6610348C 66:833F 08 CMP WORD PTR DS:[EDI],8

66103490 74 09 JE SHORT MSVBVM60.6610349B

66103492 57 PUSH EDI

66103493 E8 CD5BF2FF CALL MSVBVM60.__vbaStrVarCopy

66103498 89042B MOV DWORD PTR DS:[EBX+EBP],EAX

6610349B 50 PUSH EAX

6610349C 33C0 XOR EAX,EAX

6610349E 8A46 02 MOV AL,BYTE PTR DS:[ESI+2]

661034A1 83C6 03 ADD ESI,3

661034A4 FF2485 58EA0F66 JMP DWORD PTR DS:[EAX*4+660FEA58]

—————————————————————————————————

用MSVBVM60.rtcMidBstr依次取机器码的字符

66024808 E8 1E000000 CALL MSVBVM60.rtcMidBstr

6602480D C9 LEAVE

6602480E C2 0C00 RETN 0C

66024882 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]

====>EAX=1055432603Pentium Pro07/11/02 机器码

66024886 03D8 ADD EBX,EAX

66024888 53 PUSH EBX

66024889 FF15 EC190066 CALL DWORD PTR DS:[<&OLEAUT32.#150_SysAl>

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

取1、0、5、5、4、3、2、6、0、3、P、e、n、t、i、u、m、 、P、r、o、0、7、/、1、1、/、0、2

—————————————————————————————————

依次取机器码字符在程序自给的表中的位置,并以此位置为开始重新排表!

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

原表——共94位字符

00415604 38 00 78 00 33 00 70 00 35 00 42 00 65 00 61 00 8.x.3.p.5.B.e.a.

00415614 62 00 63 00 64 00 66 00 67 00 68 00 69 00 6A 00 b.c.d.f.g.h.i.j.

00415624 6B 00 6C 00 6D 00 6E 00 6F 00 71 00 72 00 73 00 k.l.m.n.o.q.r.s.

00415634 74 00 75 00 76 00 77 00 79 00 7A 00 41 00 43 00 t.u.v.w.y.z.A.C.

00415644 44 00 45 00 46 00 47 00 48 00 49 00 4A 00 4B 00 D.E.F.G.H.I.J.K.

00415654 4C 00 4D 00 4E 00 4F 00 50 00 51 00 52 00 53 00 L.M.N.O.P.Q.R.S.

00415664 54 00 55 00 56 00 57 00 58 00 59 00 5A 00 20 00 T.U.V.W.X.Y.Z. .

00415674 31 00 32 00 34 00 36 00 37 00 39 00 30 00 2D 00 1.2.4.6.7.9.0.-.

00415684 2E 00 23 00 2F 00 5C 00 21 00 40 00 24 00 3C 00 ..#./.\.!.@.$.<.

00415694 3E 00 26 00 2A 00 28 00 29 00 5B 00 5D 00 7B 00 >.&.*.(.).[.].{.

004156A4 7D 00 27 00 3B 00 3A 00 2C 00 3F 00 3D 00 2B 00 }.'.;.:.,.?.=.+.

004156B4 7E 00 60 00 5E 00 7C 00 25 00 5F ~.`.^.|.%._

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

如:机器码1->重排表为

1.2.4.6.7.9.0.-...#./.\.!.@.$.<.>.&.*.(.).[.].{.}.'.;.:.,.?.=.+.~.`.^.|.%._.

8.x.3.p.5.B.e.a.b.c.d.f.g.h.i.j.k.l.m.n.o.q.r.s.t.u.v.w.y.z.A.C.D.E.F.G.

H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z. .

机器码5->重排表为

5.B.e.a.b.c.d.f.g.h.i.j.k.l.m.n.o.q.r.s.t.u.v.w.y.z.A.C.D.E.F.G.H.I.J.K.L.M.

N.O.P.Q.R.S.T.U.V.W.X.Y.Z. .1.2.4.6.7.9.0.-...#./.\.!.@.$.<.>.&.*.(.).[.].{.

}.'.;.:.,.?.=.+.~.`.^.|.%._.8.x.3.p.

呵呵,下面再多举2个例子 ^Q^ ~Q~

6601468A E8 46000000 CALL MSVBVM60.660146D5

6601468F 85C0 TEST EAX,EAX

66014691 74 33 JE SHORT MSVBVM60.660146C6

66014693 8B4D E4 MOV ECX,DWORD PTR SS:[EBP-1C]

66014696 40 INC EAX

66014697 40 INC EAX

66014698 8D7E 02 LEA EDI,DWORD PTR DS:[ESI+2]

6601469B 8BF0 MOV ESI,EAX

6601469D 33D2 XOR EDX,EDX

6601469F F3:A6 REPE CMPS BYTE PTR ES:[EDI],BYTE PTR DS:>

660146A1 75 1A JNZ SHORT MSVBVM60.660146BD

660146A3 8BC8 MOV ECX,EAX

660146A5 2B4D F8 SUB ECX,DWORD PTR SS:[EBP-8]

660146A8 D1F9 SAR ECX,1

660146AA 837D 08 00 CMP DWORD PTR SS:[EBP+8],0

660146AE 0F85 57290300 JNZ MSVBVM60.6604700B

660146B4 8BC1 MOV EAX,ECX

660146D9 8B7D 08 MOV EDI,DWORD PTR SS:[EBP+8]

660146DC 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10]

660146DF 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]

660146E2 0BE4 OR ESP,ESP

660146E4 F2:66:AF REPNE SCAS WORD PTR ES:[EDI]

====>比较机器码字符在表中的位置

660146E7 B8 00000000 MOV EAX,0

660146EC 75 03 JNZ SHORT MSVBVM60.660146F1

660146EE 8D47 FE LEA EAX,DWORD PTR DS:[EDI-2]

660146F1 5F POP EDI

660146F2 5D POP EBP

660146F3 C2 0C00 RETN 0C

—————————————————————————————————

循环依次取用户名字符

660247FD 8B45 0C MOV EAX,DWORD PTR SS:[EBP+C]

66024800 8D4400 FF LEA EAX,DWORD PTR DS:[EAX+EAX-1]

66024804 50 PUSH EAX

66024805 FF75 08 PUSH DWORD PTR SS:[EBP+8]

66024808 E8 1E000000 CALL MSVBVM60.rtcMidBstr

6602480D C9 LEAVE

6602480E C2 0C00 RETN 0C

66024882 8B4424 14 MOV EAX,DWORD PTR SS:[ESP+14]

66024886 03D8 ADD EBX,EAX

66024888 53 PUSH EBX

66024889 FF15 EC190066 CALL DWORD PTR DS:[<&OLEAUT32.#150_SysAl>

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

直至循环用户名字符和机器码位数相等:

1055432603Pentium Pro07/11/02

flyflyflyflyflyflyflyflyflyfl 共29位

—————————————————————————————————

依次从变化后的新表中取字符和用户名的字符比较!实际就是取用户名字符在新表中的位置!但是作者这种逐一取字符比较的做法却有点“恐怖”呀。多少循环呀!^O^ ^O^ 稍不注意就转晕了!

653C433C F3:66:A7 REPE CMPS WORD PTR ES:[EDI],WORD PTR DS:>

====>循环求用户名字符在新表中的位置

—————————————————

如:第1位机器码1->重排后的新表为

1.2.4.6.7.9.0.-...#./.\.!.@.$.<.>.&.*.(.).[.].{.}.'.;.:.,.?.=.+.~.`.^.|.

%._.8.x.3.p.5.B.e.a.b.c.d.f.g.h.i.j.k.l.m.n.o.q.r.s.t.u.v.w.y.z.A.C.D.E.

F.G.H.I.J.K.L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z. .

则用户名第一位f->在新表的第50位

—————————————————

如:第2位机器码0->重排后的新表为

0.-...#./.\.!.@.$.<.>.&.*.(.).[.].{.}.'.;.:.,.?.=.+.~.`.^.|.%._.8.x.3.p.

5.B.e.a.b.c.d.f.g.h.i.j.k.l.m.n.o.q.r.s.t.u.v.w.y.z.A.C.D.E.F.G.H.I.J.K.

L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z. .1.2.4.6.7.9.

则用户名第二位l->也在新表的第50位

—————————————————

如:第3位机器码5->重排后的新表为

5.B.e.a.b.c.d.f.g.h.i.j.k.l.m.n.o.q.r.s.t.u.v.w.y.z.A.C.D.E.F.G.H.I.J.K.

L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z. .1.2.4.6.7.9.0.-...#./.\.!.@.$.<.>.&.*.(.

).[.].{.}.'.;.:.,.?.=.+.~.`.^.|.%._.8.x.3.p.

则用户名第三位y->在新表的第25位

—————————————————

如:第4位机器码5->重排后的新表为

5.B.e.a.b.c.d.f.g.h.i.j.k.l.m.n.o.q.r.s.t.u.v.w.y.z.A.C.D.E.F.G.H.I.J.K.

L.M.N.O.P.Q.R.S.T.U.V.W.X.Y.Z. .1.2.4.6.7.9.0.-...#./.\.!.@.$.<.>.&.*.(.

).[.].{.}.'.;.:.,.?.=.+.~.`.^.|.%._.8.x.3.p.

则用户名第四位f->在新表的第8位 (循环用户名字符了)

…… ……直至取完19位…… ^O^ …… 晕呀 …… ^O^ ……

—————————————————————————————————

以上面所得的位置从原表中取字符生成注册码:

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

原表——共94位字符

00415604 38 00 78 00 33 00 70 00 35 00 42 00 65 00 61 00 8.x.3.p.5.B.e.a.

00415614 62 00 63 00 64 00 66 00 67 00 68 00 69 00 6A 00 b.c.d.f.g.h.i.j.

00415624 6B 00 6C 00 6D 00 6E 00 6F 00 71 00 72 00 73 00 k.l.m.n.o.q.r.s.

00415634 74 00 75 00 76 00 77 00 79 00 7A 00 41 00 43 00 t.u.v.w.y.z.A.C.

00415644 44 00 45 00 46 00 47 00 48 00 49 00 4A 00 4B 00 D.E.F.G.H.I.J.K.

00415654 4C 00 4D 00 4E 00 4F 00 50 00 51 00 52 00 53 00 L.M.N.O.P.Q.R.S.

00415664 54 00 55 00 56 00 57 00 58 00 59 00 5A 00 20 00 T.U.V.W.X.Y.Z. .

00415674 31 00 32 00 34 00 36 00 37 00 39 00 30 00 2D 00 1.2.4.6.7.9.0.-.

00415684 2E 00 23 00 2F 00 5C 00 21 00 40 00 24 00 3C 00 ..#./.\.!.@.$.<.

00415694 3E 00 26 00 2A 00 28 00 29 00 5B 00 5D 00 7B 00 >.&.*.(.).[.].{.

004156A4 7D 00 27 00 3B 00 3A 00 2C 00 3F 00 3D 00 2B 00 }.'.;.:.,.?.=.+.

004156B4 7E 00 60 00 5E 00 7C 00 25 00 5F ~.`.^.|.%._

☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆

1、用户名第一位f->在新表的第50位 则取原表第50位U 作为第1位注册码

2、用户名第二位l->也在新表的第50位 则取原表第50位U 作为第2位注册码

3、用户名第三位y->在新表的第25位 则取原表第25位t 作为第3位注册码

4、用户名第四位f->在新表的第8位 则取原表第8 位a 作为第4位注册码

…… ……直至取完19位…… ^O^ …… 晕呀 …… ^O^ ……

66024903 E8 11000000 CALL MSVBVM60.rtcLeftVar

6602477C 8B4424 08 MOV EAX,DWORD PTR SS:[ESP+8]

66024780 8BCE MOV ECX,ESI

66024782 85C0 TEST EAX,EAX

66024784 0F84 D7260200 JE MSVBVM60.66046E61

6602478A 8B50 FC MOV EDX,DWORD PTR DS:[EAX-4]

6602478D 3BF2 CMP ESI,EDX

6602478F 0F87 D3260200 JA MSVBVM60.66046E68

66024795 51 PUSH ECX

66024796 50 PUSH EAX

66024797 FF15 EC190066 CALL DWORD PTR DS:[<&OLEAUT32.#150_SysAl>

6602479D 8BF0 MOV ESI,EAX

====>U、U、t、a、Y、v、T、X、7……

6602479F 85F6 TEST ESI,ESI

660247A1 0F84 D4260200 JE MSVBVM60.66046E7B

660247A7 8BC6 MOV EAX,ESI

660247A9 5E POP ESI

660247AA C2 0800 RETN 8

—————————————————————————————————

把所得的字符连接起来

660FE996 E8 8969F2FF CALL MSVBVM60.__vbaStrCat

660FE99B 50 PUSH EAX

最后得出注册码 ====>EAX=UUtaYvTX7c\r=+i}_\9`bOW1U 1OZ

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]

—————————————————————————————————

注册时比较真假码的地方:

6602471A E8 03000000 CALL MSVBVM60.__vbaStrComp

6602471F C2 0800 RETN 8

66024722 > 837C24 04 02 CMP DWORD PTR SS:[ESP+4],2

66024727 0F84 B3290200 JE MSVBVM60.660470E0

6602472D 68 01000300 PUSH 30001

66024732 FF7424 08 PUSH DWORD PTR SS:[ESP+8]

66024736 FF7424 10 PUSH DWORD PTR SS:[ESP+10]

====>UUtaYvTX7c\r=+i}_\9`bOW1U 1OZ 注册码

6602473A FF7424 18 PUSH DWORD PTR SS:[ESP+18]

====>13572468 试炼码

6602473E FF15 74FE1066 CALL DWORD PTR DS:[6610FE74] ; OLEAUT32.VarBstrCmp

====>比较CALL!

66024744 85C0 TEST EAX,EAX

66024746 0F8C 9B290200 JL MSVBVM60.660470E7

6602474C 48 DEC EAX

6602474D C2 0C00 RETN 0C

—————————————————————————————————

【算 法 总 结】:

这个P-Code相对来说算法保护的够“麻烦”了,采用机子的多个信息生成机器码,在加上用户名,通过查表循环运算得出注册码。可惜最后还是简单的用了明码比较。发现程序对中文用户名的处理或许不是太好,故以上分析只是针对英文用户名。

—————————————————————————————————

【注册信息保存】:

同目录下的 regSDS.ini 中。

—————————————————————————————————

【整 理】:

用户名:fly

机器码:1055432603Pentium Pro07/11/02

注册码:UUtaYvTX7c\r=+i}_\9`bOW1U 1OZ

(出处:赢政天下整理收藏)

相关文章:

相关软件:

→ 特别推荐

→ 热点TOP10

我为人人《《==》》人人为我

关于我们 |

帮助(?)

| 广告服务 |

版权声明 |

商业合作 |

发展历程 |

加盟我们 |

联系我们

Copyright © 1999-2003

winzheng.com All Rights Reserved.

繁体版:由华琦数码技术提供

Powered

by:MeSky.Net

2003-2004 年,宽带刚刚普及,下载站的文章区是许多人学电脑的第一课堂。
🕰 → 🤖 从那时到现在

当年一篇教程能让一台电脑焕然一新;今天的效率工具换成了 AI。 想知道当下最可靠的 AI 模型怎么选?看 赢政指数——我们用了 28 年的选软件严谨,现在用来评测大模型。

档案性质声明:本页为赢政天下(1998-2011)老文章的历史档案复原, 内容反映当年发表时的原貌——包括当年的技术表述、软件版本与观点,部分方法在今天已不适用或不合规,仅作互联网历史记录与研究用途, 不提供任何形式的下载。原始数据经由公共网络存档(Internet Archive)复原。发现问题请联系我们
← 返回老文章档案 · 软件史档案馆 · 赢政天下站史