• 标 题:大岩个人所得税计算软件 1.0(P-Code) 
  • 作 者:fly
  • 时 间:2003/06/03 12:45pm
  • 链 接:http://bbs.pediy.com

算法浅探——大岩个人所得税计算软件 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