算法浅探——大岩个人所得税计算软件 1.0(P-Code)
下载页面: http://www.dayansoft.com/down.htm
软件大小: 916 KB
【软件简介】:一款非常实用的个人所得税计算程序,操作简单计算精确。
【软件限制】: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
—————————————————————————————————
, _/
/| _.-~/ \_
, 青春都一饷
( /~ /
\~-._ |\
`\\ _/ \ ~\
) 忍把浮名
_-~~~-.) )__/;;,.
\_ //'
/'_,\ --~
\ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂
`~ _(
,_..--\ ( ,;'' / ~-- /._`\
/~~//'
/' `~\ ) /--.._, )_ `~
"
`~" " `" /~'`\
`\\~~\
" " "~' ""
Cracked By 巢水工作坊——fly [OCN][FCG]
2003-06-03 02:42