找回密码
 注册

QQ登录

只需一步,快速开始

查看: 18004|回复: 13

同益起名大师 V3.37 版的注册码获取方法步骤。

[复制链接]
发表于 2009-1-7 19:09:57 | 显示全部楼层 |阅读模式
本帖最后由 天涯 于 2009-1-7 11:15 编辑 , Q7 i' H8 X2 x( D/ Z

% \; l5 D' N  T/ Uhttp://www.unpack.cn/viewthread.php?tid=2015&extra=page%3D1&page=1
3 C; H) r8 D7 Y7 H8 s原创作者:gzgzlxg8 p2 {3 w* \% ]/ O& @7 ?
; o/ q. q$ F! O  s. ^% T) K: ^
原文写的非常的详细,请耐心阅读,其实在看雪也有,但看雪现在注册不容易啊。
* K! B& z1 Y$ \9 [% n$ P. C1 j9 B2 g
按照原文,一步步的做,就可以成功的注册 V3.37的版本。1 |8 O9 @8 N3 L3 H

' ~+ d8 E0 s) Z8 r1.安装3.37版,调试3.37脱壳版。注册,OK。
  N/ J9 [, ~4 z2 D# Y# b0 X' d( [8 `2.再安装3.81普及版,用3.37版的注册信息再注册一次,OK。
' V% g. ~) {7 L1 z/ g3.注册过程中会用到的两个东东。[附件中]: \" N, I! Y6 F0 }
, g/ T% d- G( o4 U
最后,直接使用V3.81版,给你的宝宝起个自己喜欢的名字 :)2 Z3 k% Z! h' @: F' z

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 发表于 2009-1-7 19:25:00 | 显示全部楼层
正确获得同益起名大师v337 的注册号――解读 moon 帮主的妙文# Y7 n; o- ?: O( {3 D
【作者】gzgzlxg
4 I* c. D- C$ C1 y【声明】只是好奇,没有别的目的,如有,我就把注册机发表了(已经写好了),不要发信向我要注册机,我不会发表的,这也是看雪老大的要求,其实我觉得这篇文章已经很过分。按这篇文章,你100%可以得到正确的注册码。
1 A2 r1 ]$ v+ R" ]  G2 X, h: y【工具】IDA,OllyDBG
- l) X1 K* ?: X2 a( f( m( @/ Q! s4 |【软件】使用我在【ACProtect 1.41 -- 同益起名大师 v3.36、v3.37、vp3.33(专业版)完美脱壳】中所完美脱壳后的 GoodName.Exe v3.37版。使用脱壳版,跟踪比较容易,当然你也可以直接使用原版,但会困难一些。) C" H) _6 k% r: ?, M0 [* z
http://bbs.pediy.com/showthread. ... &threadid=16204  z$ g" g$ I% x3 K% L
【注】读此文前,请先读 moon 帮主的【谜----同益起名大师3.36注册算法分析】,$ [" p9 t: D/ Z; b% P1 {$ U
http://bbs.pediy.com/showthread. ... &threadid=14716  凡是和moon 相同的部分我就不再多废笔墨。" g  q/ {0 A7 O* [
本文同时发表在看雪论坛和DFCG,转载时请保持完整,版主如果觉得不合适可以删除。2 O$ x, M- z6 J+ a" d
前言:
9 a& T" Y4 n# j! z' F同益起名的注册码验证遍布全程序,在主窗体建立,子窗口建立,按键操作,对注册码和注册申请码的验证无所不在,而且计算方法来回重复,例如获取注册申请码就有三个完全相同的过程,DES 算法也有完整的两套。我们用来分析注册码取的是注册操作部分,其实在主窗口建立、子窗口建立的过程中都可以进行,因为他们是完全相同的。! K% @( @0 l0 x7 V0 F" O" Z8 q6 r
这是注册窗口(Tfxhm)VMT表中的方法表部分,(全表太长)。这些代码都是在 IDA 中分析得到的。
. B4 G3 H" ~- Z4 @9 W复制内容到剪贴板 2 K' U# A3 W. U  o
代码:......9 P6 W& ]- h# M! k9 G
0055647F TfxhmMethodTable dw 6
2 N* M2 G, O. F3 b. x; O' G00556481                   dw 16h
$ x+ f: i, [2 z- \! w00556483                   dd offset Tfxhm@suiButton2Click ;退出按键
' q2 Z: _+ O/ O00556487 aSuibutton2click  db 0Fh,'suiButton2Click'
% H/ F) L. |% F6 I: U/ s9 @0 @$ o& \00556497                   dw 10h
3 G7 b" ]/ f  }! D00556499                   dd offset Tfxhm@FormClose       ;关闭窗口
9 k3 E( V0 L8 A0 A0 T, X6 n# i0055649D aFormclose_0      db 9,'FormClose'" E+ O' d! `3 P' y2 u* `6 y2 ?7 K
005564A7                   dw 11h5 h) k5 ?) @& u* H
005564A9                   dd offset Tfxhm@FormCreate      ;建立窗口$ o, h# q; k3 g' n  E7 W
005564AD aFormcreate_0     db 0Ah
$ @- p* c) b# k6 u' F0 z005564AD                   db 'FormCreate'. g0 X3 @" e1 W( J/ s" c. G
005564B8                   dw 16h
3 A0 e3 N; _/ s$ j7 x1 c5 p( s3 {005564BA                   dd offset Tfxhm@suiButton1Click ;注册按键
+ U2 A  C" C8 K: ?005564BE aSuibutton1cli    ck db 0Fh,'suiButton1Click'' P8 K9 I: O0 U* D: N
005564CE                   dw 0Fh) u( p& W- _! {: x! S
005564D0                   dd offset Tfxhm@get_text        ;suiButton1Click 调用的校验注册申请码4 I9 b( n. i. v
                                                           ;和注册码并注册的子过程
& A$ }: G5 K: \/ \: J8 b/ F3 T005564D4 aGet_text         db 8,'get_text'4 i4 C4 q9 u1 h7 C/ s1 t! Y; h% C
005564DD                   dw 0Fh
0 K. Q3 a& u5 o005564DF                   dd offset Tfxhm@FormShow        ;显示窗口3 R$ m5 C# ^. A( a9 H8 L) D
005564E3 aFormshow_0       db 8,'FormShow'
+ L- ^$ Z( I# W1 J4 G7 j005564EC Tfxhm             db 5,'Tfxhm'                    ;类名5 [% Y' Q* c1 w5 V: p
005564F2 word_5564F2       dw 5, q8 ^5 N. h) Z
005564F4                   dd offset TsuiForm@VMT@Prt      ;父辈 TsuiForm 的 VMT 表指针地址7 [0 G; ], Q9 Z( E8 v  k
......我们分析的所有代码都是属于 Tfxhm@get_text 过程和它的子过程的。 Tfxhm@get_text 起始地址: 0055986C
' {) Y' {+ s& r一、 获取注册码第28位
# a) C6 G# p0 _确定你想注册姓氏的正确笔划数(必须和同益数据库中 slzik 所查到的相同,以繁体字笔画数为准,同益库中有些字的笔画数并不正确,这时你可以在同益起名的姓名分析中获得姓氏的笔画数)。在下面的字符串中从左到右查寻,得到第 28 位注册码:例如,吕:繁体字为 7 划。(从0开始数)
: e8 N/ r* k$ F, \+ \9 d: F' C. g0123456 7 89012345678901234567890+ {5 s" r2 Z# `
0AH6CD3 B EF4TRS2PUV5K1MN78YZ9GIJ
* [8 A8 H- Y. O3 k/ ?/ `' u得到的字母为 B,这样我们的注册码有如下形式:(31 位)下面是我们的起始注册码
# \$ g  A4 T) }0 U: @* d! W123456789012345678901234567 8 901
" y5 d1 A* L) W8 h6 t) c& o123456789ABCDEFGHIJKLMNOPQR S TUV
' C5 B+ \% ?& s) F! D+ X1 M加入第 28 个字母 B,得如下注册码:
. |$ f9 b5 w* K9 b2 _! {+ h4 @123456789ABCDEFGHIJKLMNOPQR B TUV
0 ]) d' L" i$ w  O1 f9 d% l8 d根据 moon 提出的换位法(4*i+1位和4*(i+1)位互换,i=0,1,2,...,末尾不足4位时,最后两位互换),2528位对调,这个B应该在第25 位0 f1 {/ u3 Y6 B: G( m2 r9 q. G
为了便于调位,写了几句Delphi的小程序来完成:(这种操作,还是汇编容易,所以实际还是汇编写的)
  x1 \( p* ^4 _复制内容到剪贴板
1 P! h3 N) y. `) |" H' F3 K6 W代码:procedure TForm1.Button2Click(Sender: TObject);: g. _  j' V5 m
var
: z+ @9 p1 P7 q: {* P    Str: String;9 Y& f. C, c- K7 z- M
begin# a: A: V* D, W6 u# t* p# J
    Str := Edit1.Text;7 N" E/ G. ?* {1 j$ r/ T; c
    asm
: ~* y* v9 R- T        PushA1 h* F& N) c& s5 J. S1 P8 O1 ^
        Xor  Edx, Edx
0 ~% }0 M4 ~- ~" M1 N0 v% p% y4 [        Mov  Esi, Str
2 A# ^/ ]; D- d! u  O! D        Mov  Ecx, 7, W& G) Q7 W/ F1 [( [, G
    @1:
5 P7 V6 J5 F1 V* p: o        Mov  Al, [Esi + Edx]
7 f) y# _. }1 _! C: z# {% e        Xchg Al, [Esi + Edx + 3]
  I. [# }! a+ w& ]! G        Xchg Al, [Esi + Edx]: R8 I" m( d) ^# @
        Dec  Ecx# y3 ^* a+ A4 Z$ b5 B( m
        Add  Edx, 40 \! n5 L+ f7 y/ w  X
        Cmp  Ecx, 0
* @9 E" ~" b0 K) G8 L" ]* H0 N        Jnz  @1
4 g- _- p% t0 v        Mov  Al,    [Esi + Edx + 1]
6 `4 S6 m; P# B. Q8 k! s        Xchg Al, [Esi + Edx + 2]
4 a1 E3 Q  k, J  X4 ^5 o/ Q. H        Xchg Al, [Esi + Edx + 1]; G+ z" Y/ G9 G2 {
        PopA
7 |# D  X; Z4 E- K    end;! z4 x# x/ R* V6 H0 O7 |1 H# c
    Edit2.Text := Str;+ l3 o+ H# c4 H
end;在 Edit1 中输入 123456789ABCDEFGHIJKLMNOPQRBTUV,按 Button2 键得到下面的新注册码:
  i8 l- g/ o  \5 n新注册码为:0 R$ }) Z% s+ w4 E8 L+ d
123456789012345678901234 5 678901
' f' T! E2 q. d8 q2 O42318675CAB9GEFDKIJHOMNL B QRPTVU8 e  }9 C9 P( A% y1 l5 n( H) z
具体分析请看 moon 的解释。
' o+ K0 c6 p: q二、 获取注册码 23~27 位注册码
6 y' S5 @! j9 ^8 ~# J用OD载如 UNGDN.exe (脱壳后的程序)   Q9 {% Z) y# u4 l2 @
复制内容到剪贴板 # R8 Z2 \* q/ G
代码:Tfxhm@get_text
- u6 H9 g! E8 q1 B: ~; ^/ s# H......
) r( ~: h) S4 j. h- Z" x$ j......0 b+ j' |- k- {
0055CF7E  mov eax, ds:AppIDAndName_CryHex@Prt ;注册申请号加姓氏和1FH 异或得到的结果
; x2 f0 K8 G; [  U; f0055CF83  mov eax, [eax]
% o/ B6 K( |# @5 b4 v! _0055CF85  call sub_4FED88                 ;EncodeFunction1/ [! P. J+ A3 q- c2 _$ a9 U
0055CF8A  lea eax, [ebp+var_94]           ;这里断下获取计算23-27位的三个字符2 O2 p1 w1 [, I0 ?2 m" E
0055CF8A                                  ;按照 moon帮主的给出的算法可以获得' [4 ?: Y# Y7 m2 W1 V, a8 m
0055CF90  pus  eax
- z7 f+ Z% Q% @' i' Z9 J; H0055CF91  lea  edx, [ebp+var_98]
2 o0 l* c+ K* f6 A3 a% d+ Q9 i) h0055CF97  mov  eax, ds:Serial_CryHex@Prt  ;注册号和 1FH 异或得到的结果$ \2 |+ H% ?* k4 }
0055CF9C  mov  eax, [eax]
) t/ [9 H) a: A5 @# R& c& I0055CF9E  call CycleConversionStr         ;经过 1FH 异或,即还原
/ t$ ?9 S+ [- R" t6 M7 L) w0055CFA3  mov  eax, [ebp+var_98]0 @' C; g: |1 E6 r9 U: e1 c! m
0055CFA9  mov  ecx, 5
/ ?6 Z: ?; s! ?% @6 U3 ^0055CFAE  mov  edx, 17h
) `. V3 X& |% w4 ]- ?/ c" d0055CFB3  call LStrCopy                   ;取第 23~27位
: K% s$ i' t+ t0055CFB8  mov  eax, [ebp+var_94]
8 L1 L$ h3 ?; D' L' w7 F/ b" g9 b0055CFBE  lea  edx, [ebp+var_90]# \7 v' [4 `* `3 ~% Y
0055CFC4  call sub_4F0048                 ;进行计算得到三个字符,如果和上面计算得到的三个字符相同,则过& t5 a4 @% D) b! U/ {
0055CFC9  mov  edx, [ebp+var_90]
6 @" k4 x+ l8 y- r& i6 D! S0055CFCF  mov  eax, [ebp+var_C]7 X/ B4 O8 Q. ]
0055CFD2  call LStrCmp                    ;关键比较,比较两种方式和数据计算得到的三个字符
: ~" |! G9 _" i$ q7 g8 v0055CFD7  jnz  loc_55D157
/ Z/ t+ C% z& L9 [, }0055CFDD  lea  eax, [ebp+var_A0]
% U' K, A; N2 u5 J" I0055CFE3  push eax
( }6 p% q# I- L0055CFE4  lea  edx, [ebp+var_A4]6 C, z$ w4 R/ t5 N
0055CFEA  mov  eax, ds:Serial_CryHex@Prt
; s6 C6 O1 t" ~2 Q  _) B$ B0055CFEF  mov  eax, [eax]
3 b, [3 i9 X2 g) I8 |; y0055CFF1  call CycleConversionStr) ]) X6 ^( @& {
0055CFF6  mov  eax, [ebp+var_A4]
7 i- C8 @- H, N1 z2 c6 b, j" G0055CFFC  mov  ecx, 5/ H/ B. x1 x4 ]: Q: l, t
0055D001  mov  edx, 17h                   ;取注册号23~27& K6 [$ K3 [# c$ a) V' R
0055D006  call LStrCopy
, h" X1 q  i* ?0 R% I, r0055D00B  mov  eax, [ebp+var_A0]
/ Z& A  N# l* w0055D011  lea  edx, [ebp+var_9C]; @3 e* ~" {3 _" o3 p
0055D017  call sub_4F0048
2 Y& c4 D: E+ ~! y* ?3 x0055D01C  mov  edx, [ebp+var_9C]6 J3 j2 q& x4 |$ m- y
0055D022  mov  eax, [ebp+var_C]# |& g- G. U7 E  T7 B" Q
0055D025  call LStrCmp                    ;关键比较,比较两种方式和数据计算得到的三个字符,和前面相同
0 Q; m8 x/ D: T8 i( u) Y% ]2 V0055D02A  jnz  loc_55D0EA
& m3 ]/ R$ U3 w5 R+ l7 }8 v" s0055D030  lea  eax, [ebp+var_A8]
7 O- A1 ]# G, s+ i0055D036  push eax
3 d4 {* n. ]9 \% y+ h9 D0055D037  lea  edx, [ebp+var_AC]& k7 C& ~7 o  Z* L! z
0055D03D  mov  eax, ds:Serial_CryHex@Prt
. v) `" y- B8 p) z& j9 w7 _7 W0055D042  mov  eax, [eax]6 J; O" A( {4 @* c' s
0055D044  call CycleConversionStr
6 A+ a9 K& P) f! C5 V0055D049  mov  eax, [ebp+var_AC]
8 |7 U5 R1 P$ ?2 A6 ?9 x0055D04F  mov  ecx, 3" F5 ]' T( \( s
0055D054  mov  edx, 1Dh                   ;取注册号 29~31 位
) K$ A! o. D) R4 Y0055D059  call LStrCopy( O* C% N& w3 f. @  h
0055D05E  mov  eax, [ebp+var_A8]3 i/ |% o1 ~3 O( U5 z
0055D064  call 31decimalToHex             ;对29~31位注册码进行31进制到十六进制的转换
/ G6 ~% o% x0 i3 U$ x. |0055D069  mov  ebx, eax
( ~. Z6 Z; j. _- n1 j" l/ U6 o0055D06B  lea  eax, [ebp+var_B0]) R% ]3 |& x7 B* ~' i9 o2 M- n4 y+ P
0055D071  push eax: s: J- x3 N8 a5 r4 K9 Q
0055D072  lea  edx, [ebp+var_B4], s" U0 d: ~  c- Q& ]! s
0055D078  mov  eax, ds:Serial_CryHex@Prt  ;取注册号(经过1FH异或处理). U! b) e: \4 e0 Z$ V! ]1 z/ P' u8 x
0055D07D  mov  eax, [eax]
! Y' A' u' p# I0055D07F  call CycleConversionStr         ;经过相同的过程还原+ y- I6 g9 b" x
0055D084  mov  eax, [ebp+var_B4]8 O, |3 \" m! W: e. u8 n
0055D08A  mov  ecx, 1Ch
. x* z$ S# M! i: c0055D08F  mov  edx, 1                     ;取注册号 1~28 位
+ ?0 z3 a5 u1 G1 W0 i0055D094  call LStrCopy
$ |2 M% ~/ U" D9 q0055D099  mov  eax, [ebp+var_B0]& j  L1 Q" e( O# }$ f( s
0055D09F  call SumSerial_1to28            ;做 1~28 位累加(中间还有判断是否大于27000,见moon帮主的解释)! f8 u; J( I# i1 F, L2 F- m
0055D0A4  cmp  ebx, eax                   ;关键比较,将前面进制转换得到的数和累加和比较,在这里下断点' T$ s9 B  r8 g) r
0055D0A6  jnz  loc_55D157                 ;因为注册码没有完成,为了能够继续,暂时将这句 Nop 掉
9 a' \# Q8 l4 Q; Q7 r8 i4 d- h0055D0AC  mov  eax, offset a111_2         ; "111"
$ Z3 K; X! o1 z0055D0B1  call CheckSerial_17to22         ;这里是获取 17~22 位注册码的入口
6 y' Z- \5 l# @% c: @  G0055D0B6  mov  [ebp+var_1], al- F. g1 T- X+ n+ M
0055D0B9  cmp  [ebp+var_1], 0
) i) e/ ?( y7 {7 |7 r! V0055D0BD  jz   short  loc_55D0CC) t  C4 N" A# t9 a: I
0055D0BF  lea  eax, [ebp+var_C]
7 s9 d% `7 ?  d2 d* W0055D0C2  mov  edx, offset a111_2         ;"111"3 p5 E) p+ F7 C' u
0055D0C7  call LStrLAsg
- B9 Y5 }% P1 y  Q7 c0055D0CC5 W0 d: A9 H: k1 i" _
0055D0CC loc_55D0CC:
0 j5 _% s( j1 [& b1 e& j0055D0CC  cmp  [ebp+var_1], 0
2 G( N4 i" e/ j( M0055D0D0  jz   loc_55D157! f2 O7 s0 _0 R; _9 a! Q
0055D0D6  mov  eax, [ebp+var_C]+ v; u& k5 [7 Z% ^5 B0 r6 ]
0055D0D9  mov  edx, offset a111_2         ;"111"
1 N( {$ K& l9 x, q* H* V. t9 h0055D0DE  call LStrCmp
  t8 Q0 m7 j1 c. f# R, [) c0055D0E3  jnz  short  loc_55D0EA) P- V1 Q' l( V  i7 y; ~( Z. g
0055D0E5  call CheckSerial_1to16          ;这里是获取 1~16 位注册码的入口在0055CF8A 处下断点,F9 运行,出现同益启动画面后选‘注册’->‘输入注册码',注册申请码是不能修改的,由你的机器的 CPU 和硬盘的参数变化而来。在【起名的姓氏】中输入你的姓氏,我这里是输入‘吕’,在【输入注册码】中将上面的 123456789ABCDEFGHIJKLMNOBWRSTUV 注册码拷贝到输入窗口。按【注册】键,中断在 0055CF8A ,清除断点(或关闭),由 [ebp - c] 中的内容,得到三个字符 VRB,记录下这三个字符,用moon帮主给出的方法:
" n) G! D% ]/ k( a2 K: O" E; _& G3 k
. p( n9 F. K6 {( [6 j# Z求逆方法:4 ]. d7 v5 S% m# ]
1. 执行到00559D0A,然后下:d [ebp-c],记下数据区显示的正确值x,y,z;
1 a/ I5 ]/ {' H) b! y8 ~+ E7 x2. 对3个字节的正确值进行调位,得到5个字节a,b,c,d,e,调位方法为:3 k, N! S( S; W/ D6 K0 w
0,0,0,x7,x6,x5,x4,x3
; U' W  Z. q5 C' V. p( D0,0,0,x2,x1,x0,y5,y4
1 {8 F% }, T/ B% _  C0,0,0,0 ,y3,y2,y1,y02 g+ @% o1 b: R2 v" C( ^
0,0,0,y7,y6,z7,z6,z59 N/ v$ D! d) d" s+ @, X, d; E, h, J
0,0,0,z4,z3,z2,z1,z0
. v: x# x: Z, L2 {) r- n0 p3. 根据5个字节查表"0KMT1EIJ2AB34FGH56PYZ7NRS89CDUVX",得到5位注册码即为23~27位。
2 K) s5 V5 f2 B: c2 G--摘自 moon 帮主文
0 _7 \( n  a! j2 S# y. n8 B

0 M0 C3 p2 b9 P我用Delphi写了几句小程序完成这个转换,程序如下:
4 {9 v8 t6 c* Q( i6 t( x; I* i% {复制内容到剪贴板 9 m3 E+ T9 Q3 o$ k
代码:procedure TForm1.Button1Click(Sender: TObject);
/ u7 ^* Y2 f/ `) @. V: [5 N, G& z$ `const
/ @& }. C, H; K% `' Q    Str = '0KMT1EIJ2AB34FGH56PYZ7NRS89CDUVX';5 P( V0 i8 n8 J1 M$ r  ~5 a2 i
var4 b9 |& R  b4 q( K% [/ G2 R
    X1, X2: Integer;. |8 I7 `) \  k+ @3 W+ B  P
    x, y, z: Char;
; O4 {% \& |+ L7 O, @& D    a, b, c, d, e: string;  z+ `( \$ k. Q" U: n
    Pin: string;
; J2 s% O. U- mbegin: s# D8 i  e) P8 U
    Pin := Edit1.Text;5 r0 B3 `( m' x& d. H( U1 v6 l
    x   := Pin[1];
& f) F. L  _! p6 n( r# m2 W    y   := Pin[2];
9 S# q4 w3 l& `( f    z   := Pin[3];3 g, g" E% s& u4 n4 [5 r  O
    x1  := (Byte(x) shr 3) and $1F;; W7 _) z/ h+ c4 U8 W* |
    a   := Copy(Str, x1 + 1, 1);
. T- p. S/ q, v& l, b% U* F5 t    x1  := ((Byte(x) shl 2) and $1C) or ((Byte(y) shr 4) and $03);4 e5 r) _& O; B) T* L5 x( f
    b   := Copy(Str, x1 + 1, 1);
2 e1 i/ g) ?6 h    x1  := Byte(y)  and $0F;
% {8 v' H, h8 P0 Z- h, p6 j    c   := Copy(Str, x1 + 1, 1);
* v& u2 V7 s  B7 b0 u    x1  := ((Byte(y) shr 3) and $18) + ((Byte(z) shr 5) and $07);
, q7 |" P7 {3 N9 O3 x    d   := Copy(Str, x1 + 1, 1);
5 P4 o3 C4 S- j% W( Q' t  L    x1  := (Byte(z) and $1F);
5 R, R7 Q0 H3 Y( ^6 j2 n    e   := Copy(Str, x1 + 1, 1);6 c( m3 W) `% \8 v: P$ h7 d8 Z
    Edit2.Text := a + b + c + d + e;9 E) p5 \  B  Q: z( @3 L9 ~. F
end;在 Edit1 输入 VRB 按 Button1 键,在 Edit2 窗口中给出我们要的结果 B8MBM 。现在来继续完善我们的注册码。将得到的字符串替换原注册码中第 23~27 位:
$ n9 d6 z# B( }: K) Q& H8 K# D1234567890123456789012 34567 8 901
! X$ F% P5 i; g- t9 `, s0 ?. O: o123456789ABCDEFGHIJKLM B8MBM B TUV
5 e/ @2 Z1 l# q; e% R$ A3 o用前面的小程序进行调位,得新注册码如下:
$ A+ p. t3 c$ s4 s# E. w1234567890123456789012345678901
, W1 A, b8 U7 U8 W( [42318675CAB9GEFDKIJH8MBLBBMMTVU1 Z( ?/ v$ K, s6 M- c' I, u
三、 获得的 17~22 位注册码:
6 ~8 i. _( F3 g/ t5 e) }在OD中按 Ctrl-F2组合键,重新运行程序,将 0055D0A6 的 jnz loc_55D157 Nop 掉
: G: ]) R5 H* Z' Z/ ?复制内容到剪贴板
- i, m" L# @6 U7 W: o代码:0055D0A6  jnz  loc_55D157             ;因为注册码没有完成,为了能够继续,暂时将这句 Nop 掉
* k+ k5 r2 ]% e, U6 T% G0 ]0055D0AC  mov  eax, offset a111_2     ;"111"
6 E1 Z8 _5 ?  w/ q" r) W0055D0B1  call CheckSerial_17to22     ;这里是获取 17~22 位注册码的入口
3 \3 S4 p" @3 t  c' g跟进 0055D0B1  call CheckSerial_17to22. e% l) R+ m+ O
......, R3 ]; o7 W3 T& i7 w8 ?0 m
...... 省略) o( E8 O! A2 p; n- h# z* m
0050C705  mov  edx, [ebp+var_20]. U3 b" {* G/ E) S% h9 y$ M
0050C708  mov  eax, [ebp+var_1C]  ?9 ?( W7 n* h3 e$ V  H( O7 h) ?8 F
0050C70B  call DES_EncryStr           ;在这里进行 DES 的 EncryStr 加密运算,运算结果再经过
  }" q1 K/ J0 a( X, w2 d& ^0050C70B                              ;另一过程处理,这个子过程我们后面还要用到
, u% p) x$ f, G  \0050C710  mov  edx, [ebp+var_60]      ;moon 文中提到在这个位置获取 17~22 位注册码,可能
/ F7 y+ o9 Z7 l; j6 A0050C710                              ;是帮主写文章时粗心了,正确的位置应该在下面删除第5位- h% a  H8 W. I/ \2 l9 |8 F
0050C710                              ;相同字母后才取结果。
7 M- N( c0 d9 z+ V  a" `* ^% `' u0050C713  lea  eax, [ebp+var_20]% N: {$ T# _1 [; L) l0 v3 d
0050C716  call LStrLAsg( f0 z" x& ]3 a& |$ Q& ^
0050C71B  lea  ecx, [ebp+var_64]* K$ ~+ h9 K4 q- Z! M+ S2 I
0050C71E  mov  eax, [ebp+var_20]
/ X, f* W6 Y7 q; j. X: k! r$ F) `0050C721  mov  dl, [eax+5]            ;取出 EncryStr 运算结果的字符串的第 5 位  h4 x, P+ o) A$ _% [
0050C724  mov  eax, [ebp+var_20]
* h- L' |& G8 ]  i0050C727  call DelChr                 ;将 EncryStr 运算结果中凡是和第5位相同的字母删除9 s- S( t1 m' M& I9 ]! p
0050C72C  mov  edx, [ebp+var_64]
8 t% w$ f: f# U0050C72F  lea  eax, [ebp+var_20]      ;这里下断点,从Edx中取前6位,即我们要的第 17-22 位
* K( E3 \5 Z  d; _' c9 @5 F......
  E' N# X9 T3 Y6 x......省略在 0050C72C 处下断点,按F9 运行,出现同益启动画面后选‘注册’->‘输入注册码',在【起名的姓氏】中输入你的姓氏,我这里是输入‘吕’,在【输入注册码】中将上面的最后得到的注册码(42318675CAB9GEFDKIJH8MBLBBMMTVU)拷贝过去。点击【注册】按键。中断在 0050C72F,在Edx 返回一个长度为30的字符串(这个字符串的长度是不一定为30的,要看删除相同字符的数目而定),取前 6 为,即为我们要的注册码的第 17~22位,在我们的例子中得到的字符串是:DEDAHI。现在我们来修改我们的注册码:
/ U; E8 x5 _. w/ n; B  [1234567890123456 789012 34567 8 9013 J- t# p- P. m) C
123456789ABCDEFG DEDAHI B8MBM B TUV
& m; X- ?# \+ c/ Q3 L% {9 j! N用前面的小程序调位后得新注册码:
; ^8 p4 i$ }7 M+ D9 {! {. g8 a( G: j1234567890123456789012345678901
" T6 C6 H7 |  M+ ~* N; a& {42318675CAB9GEFDAEDD8IBHBBMMTVU1 `7 a2 W* ~6 ^2 e9 O6 R
四、 获取 1~16 位注册码
7 q0 x6 {- o; v0 Z) ?+ k' W5 w我们首先来看看程序的代码,从前面列出的程序最后一句: % g& _% h0 B0 W5 s, N2 |
复制内容到剪贴板
- u: p+ c! z: s, I! _代码:0055D0E5  call  CheckSerial_1to16     ;这里是获取 1~16 位注册码的入口
7 F9 R" n8 G% k. Q, ]' K; t4 h跟进 call CheckSerial_1to16
* B$ u% O4 w* Q3 h+ \3 I- c......
8 ]+ E$ G) R4 V+ q+ @, x; T......省略- ]9 D6 p8 N3 u& n1 _
00508EEB  lea  edx, [ebp+var_18]
2 w) u; {8 p, n; J) Y" N; U5 G00508EEE  mov  eax, ds:AppIDAndName_CryHex@Prt0 O9 w- E! {/ n, t0 t& z; m
00508EF3  mov  eax, [eax]$ l& i# \7 r. e" \8 _+ r
00508EF5  call ConversionHex10To16
7 Y4 J- a. S8 O, J9 W/ H00508EFA  lea  eax, [ebp+var_18]3 c" [, q2 N/ b+ c/ W2 @9 i
00508EFD  lea  edx, [ebp+var_8]" t2 r  u9 U) R% d2 o/ O/ d" a0 d
00508F00  call ConversionHexAndFNameToStr  k+ X: N* [/ a! j
00508F05  lea  eax, [ebp+var_20]9 g: x+ q, E! l) K9 W! f" Y3 V2 X
00508F08  push eax( o. j/ C% V3 }2 B3 t
00508F09  lea  edx, [ebp+var_24]8 H  ]/ D2 I7 x, v0 U
00508F0C  mov  eax, ds:Serial_CryHex@Prt
# o1 Y% g5 ^$ |) {00508F11  mov  eax, [eax]
& A% E7 ~3 W. j2 U7 B00508F13  call CycleConversionStr
4 F* k6 L; _; h4 b4 z& j/ [3 H' S0 d00508F18  mov  eax, [ebp+var_24]  N# a; p7 S( g5 ]
00508F1B  mov  ecx, 10h) z2 m9 m! ]/ ?+ X4 B
00508F20  mov  edx, 1                     ;取注册号 1~16 位
$ V+ j; l( V9 q; Y5 w0 C# u2 V00508F25  call LStrCopy
7 @2 }) S7 o$ U8 Q5 E/ O- ^0 g00508F2A  mov  eax, [ebp+var_20]9 W; d; N/ \4 ]  [) Q6 x- D* [- L
00508F2D  lea  ecx, [ebp+var_1C]% V- E+ p! Y' w
00508F30  mov  edx, [ebp+var_8]
# C% W9 r( h0 ^6 q9 ?00508F33  call DES_DecryStr               ;这是 DES 的逆运算,我们再跟进. C+ h3 l, h9 r' u# B$ [9 d
00508F38  mov  eax, [ebp+var_1C]
2 D) ]7 \* ]7 b  d& l' g7 o00508F3B  lea  edx, [ebp+var_18]
" n- g  M% v& p00508F3E  call ConversionHex10To16
* I5 [% A# h  X4 W00508F43  lea  eax, [ebp+var_18]
# O; U" X) Z, I( A9 n4 [00508F46  push eax: P3 e! ?1 M" |
00508F47  lea  edx, [ebp+var_38]1 A  s* y; j+ a% a" [: Y
00508F4A  mov  eax, ds:AppIDAndName_CryHex@Prt
5 K8 ^, \6 B) Y+ X1 D/ p/ ~; H00508F4F  mov  eax, [eax]
' l+ h1 \, O' S( C& R5 }00508F51  call sub_4FBA70# a% z& h" F- d4 p7 u! Q' E
00508F56  mov  eax, [ebp+var_38]
; T1 h* g* }. e4 t2 o. M5 Z00508F59  lea  edx, [ebp+var_34]          ;这里是我们要下断点的地方6 A" j: j* v8 N, @3 S
......
9 I, h4 l$ u1 O$ X...... 省略
9 z% V$ |/ s- Q* s5 N- W3 W跟进 call  DES_DecryStr. F, i* C5 T' j% o1 W; A7 {  @# s0 c
......
+ i3 W, m& C- R* E1 K......省略
: h) t% G+ U4 @004F788E  lea  edx, [ebp+var_C]
$ N. S: ?! b' C% S, W: i8 f& P004F7891  mov  eax, [ebp+var_4]
/ G/ S1 f: Z$ u004F7894  call  sub_4E97BC8 b  q+ x. V8 j& |
004F7899  mov  ecx, ebx- Y* S& u0 k1 ^8 e+ S4 b% d( \
004F789B  mov  edx, [ebp+var_8]
* ~: K3 f1 I4 o. F' ]/ T6 i004F789E  mov  eax, [ebp+var_C]" a+ H! x: i) i8 r
004F78A1  call DecryStr                   ;DES 逆运算
8 Y1 f) u$ F3 F3 [0 B004F78A6  xor  eax, eax                   ;这里是 moon 帮主提出下断点处,还有一些其他相应的做法
8 L5 M. {' f( f) \/ J+ k0 ^6 q9 B                                                            ;请看 moon 原文。' c+ q, w% \6 m; V* B, b! K
......
" L1 T! K% Z9 a+ m......省略在OD中按 Ctrl-F2,重新启动,在00508F59下断点,同上,将 0055D0A6 的 jnz loc_55D157 Nop 掉,按F9 运行,出现同益启动画面后选‘注册’->‘输入注册码',在【起名的姓氏】中输入你的姓氏,我这里是输入‘吕’,在【输入注册码】中将上面的最后得到的注册码(42318675CAB9GEFDAEDD8IBHBBMMTVU)拷贝过去。点击【注册】按键。中断在 00508F59,下面是堆栈内容:
& N  z( E& w8 h" F5 R复制内容到剪贴板 - [9 Y4 O2 y  S) H3 w1 R
代码:EBP-38  0012F910    00F303D0    ASCII "5FF51115"$ o6 x! h# x* y( z, P/ h6 ?% ]
EBP-34  0012F914    00000000# J' r# |1 q; R
EBP-30  0012F918    00000000! I# d% M" c' Z+ i5 t3 L: d
EBP-2C  0012F91C    00000000
; \, ~5 X0 \: ~% g. J! E4 r% REBP-28  0012F920    00000000- v3 @- K" m8 g% R
EBP-24  0012F924    00F30038    ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"0 p9 _. A& S4 L5 S
EBP-20  0012F928    00F29F5C    ASCII "123456789ABCDEFG"
* {3 s: c$ A$ R1 s/ h$ \  ]EBP-1C  0012F92C    00F3009C
4 [! T8 d1 M/ X$ f- tEBP-18  0012F930    C338FAD31 M) s' j2 }3 C
EBP-14  0012F934    DD5CB3D0' A3 ~$ y7 W* B% k1 U
EBP-10  0012F938    D5D426560 M- L8 y) ^- _1 S6 T% |1 K
EBP-C   0012F93C    A2BB6C94
4 @! C6 b5 F2 s2 @- yEBP-8   0012F940    00F2FFF8    ASCII "M9BJBBRIDE88TNP4". @& v( i- X* d4 f
EBP-4   0012F944    00000000注意: EBP-38   0  00F2A130  ASCII "5FF51115"  这是我们要的 DES 加密的明文。
/ U$ Q3 X& w4 B) S      EBP-8    0> 00F2FFE4    ASCII "M9BJBBRIDE88TNP4" 这是 Key。
" Q" ~/ \, h0 I按 moon 帮主的方法,修改两句代码,进行逆运算,但我经过努力,总是没有成功,可能是对 moon 的方法不能深刻的理解,于是决定改用其他的方法。我们注意到如下代码:
7 i+ m  `) K% x2 c复制内容到剪贴板
, P( ^4 ]' p4 z, y: ~8 R代码:004F788E  lea  edx, [ebp+var_C]
9 _5 G4 V- W) r. D2 ?004F7891  mov  eax, [ebp+var_4]
* w: ^$ I9 X: a% j! Q; q4 `004F7894  call sub_4E97BC
/ ?+ i+ ^. f: e/ k' Y004F7899  mov  ecx, ebx. L. ?7 I- F% j- X9 Z
004F789B  mov  edx, [ebp+var_8], |+ t  h; m( ~
004F789E  mov  eax, [ebp+var_C]
. n/ v6 B& v, I. z004F78A1  call DecryStr                   ;DES 逆运算在最后一句 Call DecryStr 做的其实是DES的逆运算,前面还有一个辅助的运算,我认为,同益的代码中一定有一个DES的正向运算,即EncryStr,所以我找了一下,其实就在上面第三节--【获得的 17~22 位注册码】中出现过,下面我们跟进这个Call:
. f3 R4 Q5 {3 U- @- L复制内容到剪贴板 $ z- R3 @; I% t9 \0 |
代码:0050C70B  call DES_EncryStr
; ]* p* I4 X2 e$ x跟进
. [# [8 U# K' q......$ p2 u: d$ |( I- P
......省略- P- ^" N* d+ E; K
004F781A  lea  ecx, [ebp+var_C]           ; 返回地址2 M# Y7 y; |: x9 [6 D$ g9 Y
004F781D  mov  edx, [ebp+var_8]           ; Key = M9BJBBRIDE88TNP4
" G2 e& k& W8 F" t3 R. l: I004F7820  mov  eax, [ebp+var_4]           ; Str = 5FF51115
( `7 k& r. I. ^/ }004F7823  call EncryStr, ~; D  X6 |  P  E  Q- d5 @0 C
004F7828  mov  edx, ebx$ j: L; [! r$ f& x! r
004F782A  mov  eax, [ebp+var_C]# \+ r' h+ Y4 a4 P
004F782D  call sub_4E63F4
4 T$ D/ N6 @& O5 @0 d004F7832  xor  eax, eax                   ;这里下断点
& _6 ^+ m( T0 z& m......& F' t/ X1 @/ R: n, n4 R
......省略可以看出,它和上面的代码正好相反,我们用下面的方法来获得 1~16 位的代码。) T7 s6 T1 o5 k3 [5 n6 H1 ]5 ~
接前面,我们中断在
4 w+ N' M1 Q) z复制内容到剪贴板
3 c. P. S6 D1 l代码:00508F59  lea  edx, [ebp+var_34]在代码窗口中按 Ctrl-G,输入004F781A,转移到 004F781A。按 Ctrl-*,将Eip地址改到 004F781A。, m1 E' g& ~# G& v3 z! |1 n3 u" p( F5 ]
我们要做的工作其实就是修改堆栈的地址,下面是具体操作。 ! |! E- R# Z. g  y. P$ g- e7 r
复制内容到剪贴板
" N* [: d8 J7 \# P; q7 o( c代码:EBP-38  0012F910    00F303D0    ASCII "5FF51115"% ?$ z1 j% ?7 t9 |% s) R& A7 z* w
EBP-34  0012F914    00000000, n- v4 H% X8 F7 o
EBP-30  0012F918    00000000
; |7 e" P! o7 \# I$ U. g" j7 ~EBP-2C  0012F91C    00000000, v+ Q! J- f' R- E, P# \
EBP-28  0012F920    00000000' t+ j) N* V6 Y4 C/ f. W
EBP-24  0012F924    00F30038    ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"
7 P3 Z, n4 O: K) w6 ]3 Z) u# OEBP-20  0012F928    00F29F5C    ASCII "123456789ABCDEFG"* P" Y3 q1 k( T2 H
EBP-1C  0012F92C    00F3009C* y1 O2 Y) v) P. [3 |! ]5 t" \( B
EBP-18  0012F930    C338FAD3" \, {/ O2 G0 B$ a- m2 J$ l% N7 e
EBP-14  0012F934    DD5CB3D0/ h. Z. @% q1 ~7 h( d2 M; d; r
EBP-10  0012F938    D5D42656
: ~, v! k. w% c9 O& c& k4 fEBP-C   0012F93C    A2BB6C94    结果返回地址,这里改为 0,程序运行时会自行分配新的内存
8 K. H9 L& o% O2 r" k$ @& E1 sEBP-8   0012F940    00F2FFF8    ASCII "M9BJBBRIDE88TNP4"
& Q4 s/ J6 [6 q2 @  YEBP-4   0012F944    00000000    这里是 Str 所以将这里改为 00F303D0,也就是[EBP-38] 指向的地址。另外,最终返回结果在 Ebx 中,而Ebx 是由上一级的过程传递过来的参数,已经由入口程序做过初始化,所以,必须分配一个有效的返回地址,这点和 [EBP-C] 不同,需要要注意,这里我们将 [EBP-24] 的堆栈地址分配给 Ebx, 也就是Ebx = 0012F924
: i! s* E' t; l$ R: S. q改完后堆栈如下:
' D  z9 D" L/ v6 }) [复制内容到剪贴板
" E. n; h! \- U$ o' m$ o) \代码:EBP-C    0> 00000000% k6 G4 S! L( S, j7 {: q
EBP-8    0> 00F2FFF8    ASCII "M9BJBBRIDE88TNP4"    Key
8 h" r" h" D, F( {$ sEBP-4    0> 00F303D0    ASCII "5FF51115"            Str  \2 B) ~+ Q4 O- j
在将 Ebx 的内容改为 EBP-24 的堆栈地址,即 Ebx = 0012F924   ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"在 004F7832 下断点,F9 运行,d [Ebx], [Ebx] =0VBMHYAMA260CSD1  第 1~16 位的注册码
1 V4 n; M2 |* H1 a. A; P1 j现在我们来修改我们的注册码:7 |9 Y  U% `4 U0 N  `2 z* G% [
1234567890123456 789012 34567 8 901
7 o% i2 i* y8 w0 K8 J2 p5 Q0VBMHYAMA260CSD1 DEDAHI B8MBM B TUV1 e" M& D+ l6 e$ T0 {
用前面的小程序调位后得新注册码:
: K  t/ Y- P: A2 C" r. r3 X1234567890123456789012345678901( w* B- P* o7 @9 }# P( V; D4 ^
MVB0MYAH026A1SDCAEDD8IBHBBMMTVU2 A( I, Z& S& ]3 A
五、 获取最后 29~31 位注册码
  A# E5 W# j. d/ ^$ }打开注册表编辑器:将Serial中的内容清除:7 X8 R6 |( i; }# V$ _+ \5 P8 n; m
[HKEY_LOCAL_MACHINE\SOFTWARE\GoodSoft\GoodName]
  Z# H  B- z2 m2 p4 L& B) i5 A"Appid"=dword:059c0935
2 d( L0 s5 B& X- d+ i  C4 g5 ?"Serial"="MVB0MYAH026A1SDCAEDD8IBHBBMMTVU"
7 [0 u9 s- F2 z5 R"Serial"="0"% Y$ s" K2 E6 T) B
在OD 中按 Ctrl-F2 重新启动,将下面两处 Nop 掉。 # L6 f& Q5 N$ G  x
复制内容到剪贴板 6 h$ V' }0 \/ M! P6 W
代码:0055CFD2  call LStrCmp            ;关键比较,比较两种方式和数据计算得到的三个字符
( ]# F  k- ~4 |- l$ H' W( ^0055CFD7  jnz  loc_55D157         ;Nop 这里
- N/ M+ K* d8 Q9 N0055D025  call LStrCmp            ;关键比较,比较两种方式和数据计算得到的三个字符,和前面相同
& K! ~3 x: U& {& J1 V4 G0055D02A  jnz  loc_55D0EA         ;Nop这里/ Z: e7 m8 T' b
0055D0A4  cmp  ebx, eax           ;关键比较,将前面进制转换得到的数和累加和比较,在这里下断点在上面 0055D0A4 处下断点,F9运行,出现同益启动画面后选‘注册’->‘输入注册码',在【起名的姓氏】中输入你的姓氏,我这里是输入‘吕’,在【输入注册码】中将上面的最后得到的注册码(MVB0MYAH026A1SDCAEDD8IBHBBMMTVU)拷贝过去。点击【注册】按键。中断在 0055D0A4,记录下Eax寄存器的内容,我这里是 2C3AH,换算成十进制数为 11322
( t/ |9 @3 f& Y! R8 j  F根据 moon 帮主的文章:6 i5 u7 ~& U: m* o
) K/ z0 A3 v6 Y' P' D
求逆方法:0 n2 P: Q2 E% N9 d3 W2 t5 X
1. 执行到00559E24,记下eax中的值x,或按照上面的方法计算出这个值;) O! Y( A3 R) f& `
2. x除以31,用余数查表"0AH6CD3BEF4TRS2PUV5K1MN78YZ9GIJ",所得字符作为第31位;+ t% m  L1 J- h
3. 第2步的商除以31,用余数查表,作为第30位;
! i' P$ H: s+ |2 I4. 第3步的商查表,作为第29位。1 Q3 U, `* ~3 }8 l$ m
--摘自 moon 帮主的文章
. d* w6 ^- }% T$ L5 G0 ^" H' N6 b

7 l! Y( }6 ]+ E! S写如下Delphi 的小程序计算最后3位注册码。 ; N# g& }0 e5 Y( \5 [$ L) p
复制内容到剪贴板
/ A& O) S7 g  x8 f& @# E& x7 Q: S代码:procedure TForm1.Button3Click(Sender: TObject);" o7 q+ P, P$ h# A5 a( ?8 p
const* ~% |7 g' w/ U. L1 ]; e" l8 L
    Str = '0AH6CD3BEF4TRS2PUV5K1MN78YZ9GIJ';
: g, I2 h/ E% q3 n7 \+ d* fvar5 R; V' m7 l& _2 e$ ^
    x1, x2: Integer;  y( ^+ p1 s1 L1 {1 j
    S1, S2: String;
- o7 {2 S" l& m0 K4 |/ P( pbegin
9 ^8 t" z; ~+ u! H5 O9 F- d    x2 := StrToInt(Edit1.Text);2 Y$ v% s8 F$ }8 ~
    x1 := x2 mod 31;9 }, U9 U+ u, z
    S1 := Copy(Str, x1 + 1, 1);5 B9 O( l- u& i! @/ y
    x1 := (x2 div 31) mod 31;/ l4 Z- e* y7 A  |$ \
    S2 := Copy(Str, x1 + 1, 1);; K# c) ^- P' A0 I+ W" J+ e" Q
    S1 := S2 + S1;
2 ^! I( h3 X  s& E( E  T    x1 := (x2 div 31) div 31;$ s1 {! q3 a* p$ ^' T+ X
    S2 := Copy(Str, x1 + 1, 1);6 {" G6 X1 g2 R( ^3 h/ v7 a
    Edit2.Text := S2 + S1;
: c( h9 @! A  N) u- x6 c/ b8 {" uend;在 Edit1 中输入 11322,按 Button3 键,在 Edit2 中给出结果 T8B
! Z, [7 ~1 [! K! ?& j  L( U2 p现在我们将获得最终的注册号:  Q9 O$ e# Y9 P7 ~) p
1234567890123456 789012 34567 8 9010 {% i3 _7 W7 v
0VBMHYAMA260CSD1 DEDAHI B8MBM B T8B! h% V2 n- X5 _! V- G% Y
用前面的小程序调位后得新注册码:" w' r# w9 Z& P7 [% x
12345678901234567890123456789017 ]" m+ V( G" d& O8 R% {
MVB0MYAH026A1SDCAEDD8IBHBBMMTB85 Y1 i4 s2 I- B$ ^; H
在我的机器上,注册号为 MVB0MYAH026A1SDCAEDD8IBHBBMMTB8 ,用未脱壳的原版注册后所有功能完全正常,公司后缀的分析类似,有兴趣的朋友可以自己试。. m" D: j5 u$ Z6 Q' `& d5 t
另外,对于Delphi的小程序,什么版本都可以,但编译开关 Huge String 要勾上,我使用的是 Delphi 7。
9 k. Z- V7 a, U( Z7 w# @7 F$ ]$ ~% }说明:
% r! Z5 O/ a( z% A7 |( k8 y
- F4 g0 j( u3 ]* j9 C0 F! q( d1、对于调位操作,字符串长度必须是 31 位(不算空格),可以带空格输入,这样比较方便直接拷贝,如可以直接输入:! d/ m7 S/ N4 i$ H  G
"0VBMHYAMA260CSD1 DEDAHI B8MBM B T8B"
: _# o7 @, {$ b2、对于计算最后的第 29~31 位,可以直接输入十六进制数,不过要加 '$' 前缀,例如在我们这个例子中,可以直接输入 $2C3A (不分大小写)。# d9 B( Y3 H6 @4 [: d: Z* j: R
发表于 2009-1-7 22:54:30 | 显示全部楼层
LZ小宝宝的相片,有机会上个啊。让本站网友也瞧一瞧。。{{loves{{
tianchenqq 该用户已被删除
发表于 2009-1-15 12:35:03 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-3-24 09:00:34 | 显示全部楼层
厉害学习了
发表于 2009-3-24 09:39:48 | 显示全部楼层
看不懂,有没图解啊
lirize 该用户已被删除
发表于 2009-3-27 15:12:05 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
nnzqj 该用户已被删除
发表于 2009-4-9 00:00:49 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
发表于 2009-4-10 11:25:41 | 显示全部楼层
有点晕{{gangzai24{{
发表于 2009-4-15 20:50:05 | 显示全部楼层
这个也太让人头晕了吧{{gangzai3{{
*滑块验证:
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|宽带技术网 |网站地图 粤公网安备44152102000001号

GMT+8, 2025-6-21 12:42 , Processed in 0.045319 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5 Licensed

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表