查看: 26265|回复: 13

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

[复制链接]
发表于 2009-1-7 19:09:57 |广西| 显示全部楼层 |阅读模式
本帖最后由 天涯 于 2009-1-7 11:15 编辑 9 I9 c. {4 _0 h; M( P! G" c5 |* `
( g, q7 G. d2 ], F  `
http://www.unpack.cn/viewthread.php?tid=2015&extra=page%3D1&page=1
. R. O, K: s$ N, R% G原创作者:gzgzlxg
2 w, V* f: h" q( L  ?# o" z
4 N/ ]& q9 e, V原文写的非常的详细,请耐心阅读,其实在看雪也有,但看雪现在注册不容易啊。+ x$ J# B5 t9 S- q
, A: @( [9 D9 o
按照原文,一步步的做,就可以成功的注册 V3.37的版本。6 b. |8 x6 \, d8 G' I
2 S& g5 C( D; [6 M# ~$ r
1.安装3.37版,调试3.37脱壳版。注册,OK。
0 N; y* ^2 p  |: K2.再安装3.81普及版,用3.37版的注册信息再注册一次,OK。  e+ [; r+ c! G/ k  f7 ]
3.注册过程中会用到的两个东东。[附件中]
2 g3 L" \5 x' i1 m; d0 s4 K! r0 K# Z* x( d
% M4 v% W$ M* o' v9 q最后,直接使用V3.81版,给你的宝宝起个自己喜欢的名字 :)
. |1 ?0 |* _8 N9 v5 v# v. k

本帖子中包含更多资源

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

×
 楼主| 发表于 2009-1-7 19:25:00 |广西| 显示全部楼层
正确获得同益起名大师v337 的注册号――解读 moon 帮主的妙文. Q3 R. Y1 X$ I% V" c4 p
【作者】gzgzlxg( B* f+ d: T, P
【声明】只是好奇,没有别的目的,如有,我就把注册机发表了(已经写好了),不要发信向我要注册机,我不会发表的,这也是看雪老大的要求,其实我觉得这篇文章已经很过分。按这篇文章,你100%可以得到正确的注册码。
( d3 B$ a" r" L- e【工具】IDA,OllyDBG
9 G  Q( k* H# V$ t' E【软件】使用我在【ACProtect 1.41 -- 同益起名大师 v3.36、v3.37、vp3.33(专业版)完美脱壳】中所完美脱壳后的 GoodName.Exe v3.37版。使用脱壳版,跟踪比较容易,当然你也可以直接使用原版,但会困难一些。
0 }- Y+ e- L" Z$ d5 shttp://bbs.pediy.com/showthread. ... &threadid=162045 N  a* t$ D  ]( H! ^0 H' o# V  A
【注】读此文前,请先读 moon 帮主的【谜----同益起名大师3.36注册算法分析】,
8 j1 }! q5 l' a4 |http://bbs.pediy.com/showthread. ... &threadid=14716  凡是和moon 相同的部分我就不再多废笔墨。
( L) |. ^) W7 ~. K, L7 W1 }本文同时发表在看雪论坛和DFCG,转载时请保持完整,版主如果觉得不合适可以删除。/ a, K. A% Y- q% u( {" _+ k% g
前言:" [) v) K9 l, S- F3 y8 Q7 L
同益起名的注册码验证遍布全程序,在主窗体建立,子窗口建立,按键操作,对注册码和注册申请码的验证无所不在,而且计算方法来回重复,例如获取注册申请码就有三个完全相同的过程,DES 算法也有完整的两套。我们用来分析注册码取的是注册操作部分,其实在主窗口建立、子窗口建立的过程中都可以进行,因为他们是完全相同的。/ w: W1 Q9 X4 J
这是注册窗口(Tfxhm)VMT表中的方法表部分,(全表太长)。这些代码都是在 IDA 中分析得到的。 4 R& J3 g3 O7 N3 B" D
复制内容到剪贴板 & k+ e/ `6 [: N& T* i- }' w
代码:......* ~5 v8 x3 j3 F9 g
0055647F TfxhmMethodTable dw 65 k8 i- k  M5 D9 O' k% o
00556481                   dw 16h
" s- L2 B( z. S; A' I00556483                   dd offset Tfxhm@suiButton2Click ;退出按键
6 I0 Q& Y% l9 A7 q( A( I00556487 aSuibutton2click  db 0Fh,'suiButton2Click'
" O$ W2 U  [* W) n9 K00556497                   dw 10h/ r1 Y& }; K/ W+ P
00556499                   dd offset Tfxhm@FormClose       ;关闭窗口
, q, L5 y5 G+ X; M& z0055649D aFormclose_0      db 9,'FormClose'8 w4 Z/ \0 w( Q0 V" R7 P8 b# F0 J
005564A7                   dw 11h- w# r% l% L' A* e: i5 _$ y) F, D
005564A9                   dd offset Tfxhm@FormCreate      ;建立窗口$ W' r( y( L% A5 k: Y
005564AD aFormcreate_0     db 0Ah+ c% D3 l5 b2 K' K1 B) i: k: T" M
005564AD                   db 'FormCreate'; q9 P8 l3 ?$ u" [1 k) D0 v4 l
005564B8                   dw 16h
( B* U1 |# o: x* ^) v005564BA                   dd offset Tfxhm@suiButton1Click ;注册按键
3 o  O6 U" {; k005564BE aSuibutton1cli    ck db 0Fh,'suiButton1Click'7 Z$ v0 q9 E6 q0 V
005564CE                   dw 0Fh
; Y! o/ `; H* M  }) I" z# q005564D0                   dd offset Tfxhm@get_text        ;suiButton1Click 调用的校验注册申请码
" t7 v! O2 v0 y/ Y0 z                                                           ;和注册码并注册的子过程
; J0 ~" N4 G" I/ A% {0 G9 k! u5 L1 ^. D005564D4 aGet_text         db 8,'get_text'
8 \+ R5 ~" `8 R/ x! m+ N  l" A005564DD                   dw 0Fh. H# D, ]+ C) K( J4 h1 @' P
005564DF                   dd offset Tfxhm@FormShow        ;显示窗口
% ?5 R7 J$ f) F: \. q* n005564E3 aFormshow_0       db 8,'FormShow'# r" @( ]# s' n. [, K
005564EC Tfxhm             db 5,'Tfxhm'                    ;类名! S, f9 I- [! k) U' e
005564F2 word_5564F2       dw 5
3 `" X1 m  X# N005564F4                   dd offset TsuiForm@VMT@Prt      ;父辈 TsuiForm 的 VMT 表指针地址
& w- x. ^6 D: v* }7 V0 }! m......我们分析的所有代码都是属于 Tfxhm@get_text 过程和它的子过程的。 Tfxhm@get_text 起始地址: 0055986C
) {' h2 m( ?. z) V一、 获取注册码第28位
* k% l6 p( `6 ~4 |3 M确定你想注册姓氏的正确笔划数(必须和同益数据库中 slzik 所查到的相同,以繁体字笔画数为准,同益库中有些字的笔画数并不正确,这时你可以在同益起名的姓名分析中获得姓氏的笔画数)。在下面的字符串中从左到右查寻,得到第 28 位注册码:例如,吕:繁体字为 7 划。(从0开始数)
; n' P8 r+ y7 ]+ x0123456 7 89012345678901234567890
% J6 f4 j8 ?9 A, k0AH6CD3 B EF4TRS2PUV5K1MN78YZ9GIJ9 m& r  J( D' J$ Y  Z) B5 E0 {% Y5 j
得到的字母为 B,这样我们的注册码有如下形式:(31 位)下面是我们的起始注册码
) W$ e( Q! i  d  B& A123456789012345678901234567 8 901- o9 u. B) \( A9 F' U- q& v
123456789ABCDEFGHIJKLMNOPQR S TUV
' r$ b2 j+ [$ b- p, O( ^3 X+ |5 ~加入第 28 个字母 B,得如下注册码:
- J1 U2 O& k6 Y; p1 I; X123456789ABCDEFGHIJKLMNOPQR B TUV5 F( |2 L9 q! p; z6 k
根据 moon 提出的换位法(4*i+1位和4*(i+1)位互换,i=0,1,2,...,末尾不足4位时,最后两位互换),2528位对调,这个B应该在第25 位
3 m8 m6 p' g. `4 E$ y( [为了便于调位,写了几句Delphi的小程序来完成:(这种操作,还是汇编容易,所以实际还是汇编写的)
$ {: X; ?2 n7 F9 A6 T: S$ v复制内容到剪贴板
4 E" ~$ _4 b) W8 U代码:procedure TForm1.Button2Click(Sender: TObject);
/ n0 |& g4 V. x4 p& y; Cvar
0 x8 J/ n9 x! E$ g- h1 T! A- M' A    Str: String;% `3 X' c  K/ l0 G0 N" }! y9 T
begin
$ t& x3 v" |0 s# @/ N    Str := Edit1.Text;5 B' ^$ |" g0 s2 A' h5 L$ q- l
    asm5 P8 M- ?+ u! f+ q: f4 P0 u4 k
        PushA$ `4 ]/ X- B1 x6 A+ S7 Z! g
        Xor  Edx, Edx
$ D, ^, j1 n8 v: w& d        Mov  Esi, Str# \8 {% B: y  K) W/ P4 v
        Mov  Ecx, 7
0 |2 H7 g& ~& n2 E7 y2 X  Z# J# _# H    @1:
( v6 g  B0 G6 P: n6 z7 N6 c        Mov  Al, [Esi + Edx]5 _. V$ k) v$ o3 ^; g; M- e
        Xchg Al, [Esi + Edx + 3]
- p# K; \" @0 P* g6 }, R1 ?        Xchg Al, [Esi + Edx]; S7 j% W- E9 ?2 _9 j( B2 z
        Dec  Ecx
) g1 R1 E& z4 k2 |3 ~7 l5 @/ T        Add  Edx, 4
. v0 I! `* H) s& T( v        Cmp  Ecx, 0
7 R% Q; Y5 c& c9 L: v0 C        Jnz  @1
0 O# t$ z( N; w        Mov  Al,    [Esi + Edx + 1]/ x+ H- D0 ~. ^0 K% O9 k9 V
        Xchg Al, [Esi + Edx + 2]
" v* v7 }2 U& Y; x' L        Xchg Al, [Esi + Edx + 1]$ `- y& m7 o- z% W' c9 q  A: }* d3 j
        PopA1 K" ?- J7 {) c
    end;
& C" J" ]# Y# E; W1 [6 P7 v    Edit2.Text := Str;  }; S; U; b8 i9 Q  i& g" X
end;在 Edit1 中输入 123456789ABCDEFGHIJKLMNOPQRBTUV,按 Button2 键得到下面的新注册码:
; u- d5 E: s0 n新注册码为:
4 _, J2 G% u) Z; {7 \123456789012345678901234 5 678901& ^3 s2 I$ l4 m; v( O. i
42318675CAB9GEFDKIJHOMNL B QRPTVU( j" b) V2 m* Y1 [, R! T# e
具体分析请看 moon 的解释。9 p: m6 ~0 L; p5 S& h
二、 获取注册码 23~27 位注册码  l% L+ L: a. k& f: i9 t
用OD载如 UNGDN.exe (脱壳后的程序)
. s, [" \& I3 E1 ~5 n复制内容到剪贴板 * a  f2 y8 A: _# J
代码:Tfxhm@get_text+ S5 c  s+ q; U3 n! @
......
3 U# L' x! ?# [4 T* x& M......
# F( |& U2 Z+ A8 x, V' X0055CF7E  mov eax, ds:AppIDAndName_CryHex@Prt ;注册申请号加姓氏和1FH 异或得到的结果
% I& U; }! K- C; M0055CF83  mov eax, [eax]) {! U& v! n' o
0055CF85  call sub_4FED88                 ;EncodeFunction1
0 {& g+ n# ?: a9 |  Y0055CF8A  lea eax, [ebp+var_94]           ;这里断下获取计算23-27位的三个字符
( I7 E( g- \9 c0 P8 s0055CF8A                                  ;按照 moon帮主的给出的算法可以获得" ]7 j  ^5 X, q+ J
0055CF90  pus  eax
0 ?+ Z) q; w& \2 k$ b$ @0055CF91  lea  edx, [ebp+var_98]
) w9 Q# D% Z& Q$ I/ k* Q: G' S0055CF97  mov  eax, ds:Serial_CryHex@Prt  ;注册号和 1FH 异或得到的结果: w, T+ ]! j# @
0055CF9C  mov  eax, [eax]& q( J) Y. T7 \4 X, N) o; D* j+ `
0055CF9E  call CycleConversionStr         ;经过 1FH 异或,即还原
( a7 A3 |0 `. D0 O5 Y. f$ y( j* E1 a0055CFA3  mov  eax, [ebp+var_98]9 g: ^( Y1 m! o. n  z
0055CFA9  mov  ecx, 5
5 D# R0 R  W' `( g& J" ?1 u: y0055CFAE  mov  edx, 17h3 P& I3 u# i" s; ?
0055CFB3  call LStrCopy                   ;取第 23~27位
$ N) H! h7 h' X1 @# _! ^0055CFB8  mov  eax, [ebp+var_94]) Y: F  ^/ p" F) i$ ]3 [
0055CFBE  lea  edx, [ebp+var_90]$ J4 d; _* u' e- y$ j
0055CFC4  call sub_4F0048                 ;进行计算得到三个字符,如果和上面计算得到的三个字符相同,则过! y% ~7 R5 K. G# l% s0 `6 i
0055CFC9  mov  edx, [ebp+var_90]/ W7 z, P+ \6 Q/ D, z3 A: e
0055CFCF  mov  eax, [ebp+var_C]/ P3 p2 t9 _# _# i7 v% l/ r
0055CFD2  call LStrCmp                    ;关键比较,比较两种方式和数据计算得到的三个字符( ]) G; K& W* d) D: \
0055CFD7  jnz  loc_55D157
5 A* O4 n$ M9 a6 F; `0055CFDD  lea  eax, [ebp+var_A0]
1 q1 T8 l1 l2 P8 Q# d# [7 G+ b; D0055CFE3  push eax, C* L" P8 T' @. v0 x1 l0 L
0055CFE4  lea  edx, [ebp+var_A4]0 \2 T3 s0 y' J) H
0055CFEA  mov  eax, ds:Serial_CryHex@Prt
1 Y3 r( f9 R7 }5 ?3 D: f6 ^5 I0055CFEF  mov  eax, [eax]
+ }4 {& y0 h% \, {0055CFF1  call CycleConversionStr
0 L, x5 x5 l8 s8 L1 `" c4 R0055CFF6  mov  eax, [ebp+var_A4]
& f- F0 V' d" t2 }8 P" X0055CFFC  mov  ecx, 5& ?" m. u5 |; C5 o/ M
0055D001  mov  edx, 17h                   ;取注册号23~27
) r& A' r( n* Q  u9 Q/ A1 ?0055D006  call LStrCopy' b: Z) m3 i: A, u/ e! Y2 T8 p
0055D00B  mov  eax, [ebp+var_A0]9 ?4 l& d& y, x" o# C
0055D011  lea  edx, [ebp+var_9C]
* V& F4 \4 D- m4 v0055D017  call sub_4F0048
  o, _! l2 e) _0055D01C  mov  edx, [ebp+var_9C]( |* n4 W, B) c0 s- ~- R1 ~. ?$ d
0055D022  mov  eax, [ebp+var_C]
' u: ~/ B& h& R8 w) Q" ]7 m' x6 _0055D025  call LStrCmp                    ;关键比较,比较两种方式和数据计算得到的三个字符,和前面相同
0 T" m; m: D: b. @. U0055D02A  jnz  loc_55D0EA. A7 x! e1 f. {7 T" h
0055D030  lea  eax, [ebp+var_A8]
$ |1 m+ @' x* L! U0055D036  push eax1 P; Y1 h9 C# ]9 H1 ]: m9 j# ^
0055D037  lea  edx, [ebp+var_AC]
! w: b. B7 T4 V! q5 h0055D03D  mov  eax, ds:Serial_CryHex@Prt
4 ], k: U$ W  k0 \( M0055D042  mov  eax, [eax]
$ y% e! ^+ N1 g* p7 ]. o3 s0055D044  call CycleConversionStr4 P  j- e: `; J& w7 F( u2 ?
0055D049  mov  eax, [ebp+var_AC]
/ u6 F5 q( ?; e" ~' G  x% l0055D04F  mov  ecx, 3
! U6 @1 W" A- s& c; w9 Y0055D054  mov  edx, 1Dh                   ;取注册号 29~31 位
* l3 }( _) W, y. P/ I0055D059  call LStrCopy! h1 }0 Y: @7 w: R5 [: T# E2 p
0055D05E  mov  eax, [ebp+var_A8]
5 a$ I8 f3 D6 w4 e  \! ~0055D064  call 31decimalToHex             ;对29~31位注册码进行31进制到十六进制的转换
/ c7 d' ~5 ^+ l! X: P0055D069  mov  ebx, eax
; |4 l' d! n+ J/ E3 h7 M0055D06B  lea  eax, [ebp+var_B0]
& G1 ~, X' F& R' o2 c' I4 o& B7 d0055D071  push eax5 M% O( b5 x$ K6 G" {
0055D072  lea  edx, [ebp+var_B4]
+ X0 o8 l$ q$ ~+ V2 |  j0055D078  mov  eax, ds:Serial_CryHex@Prt  ;取注册号(经过1FH异或处理)
: ^& s9 t7 R( d+ {, f0055D07D  mov  eax, [eax]
' {3 ^6 |4 v/ U3 c0055D07F  call CycleConversionStr         ;经过相同的过程还原9 x& W% Y8 S- A0 J
0055D084  mov  eax, [ebp+var_B4]
# G$ d% j* P# M/ ?( u( N9 l0055D08A  mov  ecx, 1Ch
0 n+ ~/ i+ f# M, S) |6 Y& ^) ]  H0055D08F  mov  edx, 1                     ;取注册号 1~28 位" E: T. m; B7 f5 X
0055D094  call LStrCopy
1 A( c4 I6 z; f, n) z0055D099  mov  eax, [ebp+var_B0]: j5 P6 ~/ x0 ]1 {
0055D09F  call SumSerial_1to28            ;做 1~28 位累加(中间还有判断是否大于27000,见moon帮主的解释)
: M% }, x. [" Q, \0055D0A4  cmp  ebx, eax                   ;关键比较,将前面进制转换得到的数和累加和比较,在这里下断点& b; a) q/ _6 u- o3 G9 \$ f
0055D0A6  jnz  loc_55D157                 ;因为注册码没有完成,为了能够继续,暂时将这句 Nop 掉
( Y/ i4 P! b! f) v& P- a0 z+ J% t' u0055D0AC  mov  eax, offset a111_2         ; "111"4 u! {8 p; x1 |; [4 F/ [  u
0055D0B1  call CheckSerial_17to22         ;这里是获取 17~22 位注册码的入口
- l! m& u9 u% ]. w0055D0B6  mov  [ebp+var_1], al$ \' N, F6 t: S9 Q2 Q+ P
0055D0B9  cmp  [ebp+var_1], 0) L5 k" ?* _5 m9 q( f* k8 f; G9 {8 F
0055D0BD  jz   short  loc_55D0CC
7 ?4 J! _3 }5 \& \( ]6 y) h0055D0BF  lea  eax, [ebp+var_C]: s" i( U7 S8 A
0055D0C2  mov  edx, offset a111_2         ;"111"7 G. Y) E0 P% p: o, o: m* l: R) Q
0055D0C7  call LStrLAsg
4 ?+ }; q; k1 r$ ]/ q/ W0055D0CC3 J* V! `* ^, x
0055D0CC loc_55D0CC:
# L& _% I2 z% `4 h0055D0CC  cmp  [ebp+var_1], 0$ x9 a$ m0 h+ {
0055D0D0  jz   loc_55D157
; h3 S  C7 r- c% x0055D0D6  mov  eax, [ebp+var_C]
& Z' V7 ~5 c' w! E: C0055D0D9  mov  edx, offset a111_2         ;"111"0 r& r% {' ^+ t; |$ M1 D
0055D0DE  call LStrCmp+ S$ B; Z& }& @7 m
0055D0E3  jnz  short  loc_55D0EA
) A; ^# z5 r7 w! G: _0055D0E5  call CheckSerial_1to16          ;这里是获取 1~16 位注册码的入口在0055CF8A 处下断点,F9 运行,出现同益启动画面后选‘注册’->‘输入注册码',注册申请码是不能修改的,由你的机器的 CPU 和硬盘的参数变化而来。在【起名的姓氏】中输入你的姓氏,我这里是输入‘吕’,在【输入注册码】中将上面的 123456789ABCDEFGHIJKLMNOBWRSTUV 注册码拷贝到输入窗口。按【注册】键,中断在 0055CF8A ,清除断点(或关闭),由 [ebp - c] 中的内容,得到三个字符 VRB,记录下这三个字符,用moon帮主给出的方法:! z# m4 J+ F* M* t
5 @: a3 L  j% O
求逆方法:4 `' W' w! M7 q5 E! n! i
1. 执行到00559D0A,然后下:d [ebp-c],记下数据区显示的正确值x,y,z;
( J$ u& Z& E3 n2. 对3个字节的正确值进行调位,得到5个字节a,b,c,d,e,调位方法为:( p" V3 q; H0 @* N
0,0,0,x7,x6,x5,x4,x30 X$ m7 p2 a4 r, S
0,0,0,x2,x1,x0,y5,y4
- I$ d3 {' B9 W, x0,0,0,0 ,y3,y2,y1,y0* i& B" ~$ |3 }
0,0,0,y7,y6,z7,z6,z53 Q3 m. v6 t. v4 F% O$ T
0,0,0,z4,z3,z2,z1,z0
! V, c: m' o, a! D- K% r3. 根据5个字节查表"0KMT1EIJ2AB34FGH56PYZ7NRS89CDUVX",得到5位注册码即为23~27位。# _$ p0 r4 V' k0 G) ]3 p1 r, {$ u0 J  g
--摘自 moon 帮主文
) n. }+ _8 h6 P2 L
4 I) S/ z$ Y6 A- S. o- J1 Q7 L
我用Delphi写了几句小程序完成这个转换,程序如下:
% K" ^7 B, S( |( Z; A复制内容到剪贴板
; U4 h# f5 v) z9 J! W代码:procedure TForm1.Button1Click(Sender: TObject);6 N8 N2 x  c( z4 k( {8 u6 r% t
const
7 w! b8 t5 a3 [* ?. m, c    Str = '0KMT1EIJ2AB34FGH56PYZ7NRS89CDUVX';
8 x) p$ @1 K# S( y$ |var
* g4 W$ A6 L$ q, [4 I    X1, X2: Integer;( V4 c3 s2 ?( _- k
    x, y, z: Char;- ~: h2 e$ ~8 m4 }' m* X& u4 W
    a, b, c, d, e: string;
, T' D; @5 E- A9 x/ y- N2 B    Pin: string;4 ]2 P) `' N4 s$ X7 J  r6 ]
begin% C8 ~6 M& @; @, q6 Y8 o! f. x- i
    Pin := Edit1.Text;
5 k7 ^/ U. Q# U: g5 [' T    x   := Pin[1];
4 c" `3 e* `' n1 O    y   := Pin[2];
. U, c% D+ F7 `    z   := Pin[3];2 S& c8 J! j: n# J( ~7 L5 y
    x1  := (Byte(x) shr 3) and $1F;
& c' z. E; a* x; b* O% F% `- {    a   := Copy(Str, x1 + 1, 1);
/ }. B7 j1 f. K6 w9 [# w9 \: f8 Y    x1  := ((Byte(x) shl 2) and $1C) or ((Byte(y) shr 4) and $03);
; y' I3 ^; E  X' o    b   := Copy(Str, x1 + 1, 1);
( ^7 j! m* W$ K) [- w1 P    x1  := Byte(y)  and $0F;
( X  N1 z) X3 R/ P( e9 Z  m" W    c   := Copy(Str, x1 + 1, 1);
! m9 R% e$ [2 E5 m9 ?/ o, D    x1  := ((Byte(y) shr 3) and $18) + ((Byte(z) shr 5) and $07);
. F7 ]) ]  A1 m' ^    d   := Copy(Str, x1 + 1, 1);. v/ \. ]: U) v8 B
    x1  := (Byte(z) and $1F);
, d8 T5 l1 t+ H$ a2 _- C+ K    e   := Copy(Str, x1 + 1, 1);
# N( J2 X  d( I" ?) O) _# D    Edit2.Text := a + b + c + d + e;
1 Q9 i/ {1 Y. m& N3 s- Cend;在 Edit1 输入 VRB 按 Button1 键,在 Edit2 窗口中给出我们要的结果 B8MBM 。现在来继续完善我们的注册码。将得到的字符串替换原注册码中第 23~27 位:9 T) d, P. ~! B3 O8 L- T
1234567890123456789012 34567 8 9018 w% ^: G& v. z0 c2 u
123456789ABCDEFGHIJKLM B8MBM B TUV
8 }4 {. G1 V( ^% e' V0 k* p用前面的小程序进行调位,得新注册码如下:: P% u- ^# f) h
1234567890123456789012345678901* e4 D+ E% x' k! `. O5 l) Q
42318675CAB9GEFDKIJH8MBLBBMMTVU3 `- r9 }* u1 ]/ ?( H% c# D( R( U; P
三、 获得的 17~22 位注册码:5 X* k& P0 q3 F: L0 d9 Y
在OD中按 Ctrl-F2组合键,重新运行程序,将 0055D0A6 的 jnz loc_55D157 Nop 掉
  Q/ w$ z) K# Y$ m8 [复制内容到剪贴板 6 X* v0 B) q2 G
代码:0055D0A6  jnz  loc_55D157             ;因为注册码没有完成,为了能够继续,暂时将这句 Nop 掉1 ^6 i7 H& L* R4 H( O0 Z
0055D0AC  mov  eax, offset a111_2     ;"111"3 ]- p2 G8 A1 F' a+ W8 t) k* B
0055D0B1  call CheckSerial_17to22     ;这里是获取 17~22 位注册码的入口) G9 g% M7 ^, Y: Z$ R" d% h
跟进 0055D0B1  call CheckSerial_17to229 }% A% k  q9 G% p* D6 F( q
......! o! d/ Z- F! r; G
...... 省略
! t* G7 ?& t& O) ]( q6 \6 z0050C705  mov  edx, [ebp+var_20]' B6 O& ]# a: k# @
0050C708  mov  eax, [ebp+var_1C]
9 t6 H. n8 t' ]; m: O* w/ O* S0050C70B  call DES_EncryStr           ;在这里进行 DES 的 EncryStr 加密运算,运算结果再经过; S0 W" R8 ^! g6 W# p2 r
0050C70B                              ;另一过程处理,这个子过程我们后面还要用到1 S4 p  w) r+ Z% W+ B+ x% z  R
0050C710  mov  edx, [ebp+var_60]      ;moon 文中提到在这个位置获取 17~22 位注册码,可能. S8 F. p! w8 M8 \
0050C710                              ;是帮主写文章时粗心了,正确的位置应该在下面删除第5位
. W! ^' t8 j" {6 w7 P0050C710                              ;相同字母后才取结果。; t8 x  f# v6 \. [1 q* h- Y
0050C713  lea  eax, [ebp+var_20]
: ?2 h7 Z3 E- e  N& G- |0050C716  call LStrLAsg8 Z8 c5 l& G; [4 C& ?
0050C71B  lea  ecx, [ebp+var_64]8 J+ `5 C( O* z0 ^, ~$ R- n& }/ c' z, w
0050C71E  mov  eax, [ebp+var_20]
! J) e1 [- P* J# r: M, T0050C721  mov  dl, [eax+5]            ;取出 EncryStr 运算结果的字符串的第 5 位
$ v) M! z3 Z6 G9 ]/ u& k- D0050C724  mov  eax, [ebp+var_20]
* w5 |" h1 N/ y7 l. L0050C727  call DelChr                 ;将 EncryStr 运算结果中凡是和第5位相同的字母删除) l, R7 ]" I9 A. G$ p. ~
0050C72C  mov  edx, [ebp+var_64]
" L$ ]# e5 v: q: i( E, e9 |0050C72F  lea  eax, [ebp+var_20]      ;这里下断点,从Edx中取前6位,即我们要的第 17-22 位8 C; Z0 e; k, ]7 R; t, c# O
......4 s0 i, D3 p( t7 |8 X! {8 d& F- q
......省略在 0050C72C 处下断点,按F9 运行,出现同益启动画面后选‘注册’->‘输入注册码',在【起名的姓氏】中输入你的姓氏,我这里是输入‘吕’,在【输入注册码】中将上面的最后得到的注册码(42318675CAB9GEFDKIJH8MBLBBMMTVU)拷贝过去。点击【注册】按键。中断在 0050C72F,在Edx 返回一个长度为30的字符串(这个字符串的长度是不一定为30的,要看删除相同字符的数目而定),取前 6 为,即为我们要的注册码的第 17~22位,在我们的例子中得到的字符串是:DEDAHI。现在我们来修改我们的注册码:8 j: F- l0 z- e8 M1 T
1234567890123456 789012 34567 8 901
6 Z  A8 T' l& A$ h, M0 a3 O6 j123456789ABCDEFG DEDAHI B8MBM B TUV/ v* s* [! f0 h( P/ g
用前面的小程序调位后得新注册码:# b) V) I+ s+ g
1234567890123456789012345678901
) T5 F7 O+ K( e2 U2 {' |2 {: b42318675CAB9GEFDAEDD8IBHBBMMTVU
  [1 p  |2 v4 m* ~; O0 ~四、 获取 1~16 位注册码
2 {- d! ?# w$ F% {我们首先来看看程序的代码,从前面列出的程序最后一句:
% R  _! u& j! c4 g复制内容到剪贴板
7 Y- N1 P! \5 c5 F, y7 g代码:0055D0E5  call  CheckSerial_1to16     ;这里是获取 1~16 位注册码的入口
1 O! J1 R; u+ f) ~: S4 B1 v3 ?跟进 call CheckSerial_1to16
" y1 |9 M# z2 u2 }......
9 f/ g  O% M0 p; ~......省略
4 V% L/ b! Z/ z. `00508EEB  lea  edx, [ebp+var_18]: d9 W6 o9 v# S/ @( Z
00508EEE  mov  eax, ds:AppIDAndName_CryHex@Prt
0 w" q- ]* A6 `7 q6 {7 a00508EF3  mov  eax, [eax]
" g8 Z5 T  i- ?" w00508EF5  call ConversionHex10To163 X' _7 m0 _* {$ C) {7 b" i5 F" I
00508EFA  lea  eax, [ebp+var_18]
" e9 \9 J; X: V5 k1 U7 C- F* r00508EFD  lea  edx, [ebp+var_8]
4 D: b* t0 i2 ?% y- d; q4 ?2 T00508F00  call ConversionHexAndFNameToStr
8 G! g! y! P/ x( S& R% e1 N00508F05  lea  eax, [ebp+var_20]9 @; _. Y# w" U1 x
00508F08  push eax% c4 g! T( Z& z4 O# Q
00508F09  lea  edx, [ebp+var_24]: n2 f6 h* \7 c2 m0 F* c% s! K
00508F0C  mov  eax, ds:Serial_CryHex@Prt
& Y4 v( |5 U" u& l7 c3 z00508F11  mov  eax, [eax]
4 s( N8 V6 F  A00508F13  call CycleConversionStr
" m7 n3 l  p) k# m& Z' c00508F18  mov  eax, [ebp+var_24]" O- e7 ]7 O8 @& {) e5 J5 j1 \
00508F1B  mov  ecx, 10h9 n" {7 {/ F3 G9 Y1 e/ z
00508F20  mov  edx, 1                     ;取注册号 1~16 位$ n3 g  o; [) q4 k; O9 p6 P
00508F25  call LStrCopy5 |1 Y& p, I6 h9 C
00508F2A  mov  eax, [ebp+var_20]/ z5 y/ N- c4 L8 J4 K- P2 w, o8 E7 E
00508F2D  lea  ecx, [ebp+var_1C]; D1 F9 U1 J0 I2 E  ]$ T' i- J
00508F30  mov  edx, [ebp+var_8]  |* p6 {9 ^8 x& P# w
00508F33  call DES_DecryStr               ;这是 DES 的逆运算,我们再跟进9 z4 p7 g4 v2 v' a( V
00508F38  mov  eax, [ebp+var_1C]
  g5 \8 r' J! l! ^00508F3B  lea  edx, [ebp+var_18]6 L% T& {$ q- o6 H% M
00508F3E  call ConversionHex10To16
% m1 n# i* }; g  k2 ~' b00508F43  lea  eax, [ebp+var_18]
* R/ H0 ^2 D+ }00508F46  push eax
1 B7 A. l$ c3 c% |5 s00508F47  lea  edx, [ebp+var_38]
' u+ j& e. c1 a+ Z  f9 \00508F4A  mov  eax, ds:AppIDAndName_CryHex@Prt
8 l! J9 R2 s2 F& a5 M+ j& d00508F4F  mov  eax, [eax]
4 v: d+ O8 N. n0 X& W6 G1 |00508F51  call sub_4FBA70- j$ D! A* s% W/ E1 H
00508F56  mov  eax, [ebp+var_38]
+ c* A$ |& y" Q% H00508F59  lea  edx, [ebp+var_34]          ;这里是我们要下断点的地方
/ D8 t- J5 ]+ q/ c) v. K+ e% a......; X, b- [1 \# z# B. ~: Z
...... 省略. R5 ~6 [4 ?( k+ ~: Y$ ]. w6 B
跟进 call  DES_DecryStr3 v2 _+ Z* I& v9 j+ S
......
8 K8 ~+ W/ O5 @4 U( V) ^......省略  n9 \" ^# ~/ Q% z$ b
004F788E  lea  edx, [ebp+var_C]
3 c* r$ X8 e8 Z. k004F7891  mov  eax, [ebp+var_4]6 t2 p9 G7 B9 R1 x3 o& D. w% @
004F7894  call  sub_4E97BC/ c5 x2 z* t- n0 ~2 Q, y& r9 b
004F7899  mov  ecx, ebx. v" @' Q. t% s  V( u
004F789B  mov  edx, [ebp+var_8]
  x; l2 t8 M# f3 r/ I004F789E  mov  eax, [ebp+var_C]
+ [1 Q7 d0 P  Z( J6 n% a4 S004F78A1  call DecryStr                   ;DES 逆运算( [9 y  b+ X% ^6 H5 ^* m
004F78A6  xor  eax, eax                   ;这里是 moon 帮主提出下断点处,还有一些其他相应的做法
4 H4 `1 W( q" Q3 s0 N  F+ t" A                                                            ;请看 moon 原文。
1 ]2 I6 X8 ]" i3 B' n% M......
- R/ V0 e  n0 m; ~$ D' I2 O......省略在OD中按 Ctrl-F2,重新启动,在00508F59下断点,同上,将 0055D0A6 的 jnz loc_55D157 Nop 掉,按F9 运行,出现同益启动画面后选‘注册’->‘输入注册码',在【起名的姓氏】中输入你的姓氏,我这里是输入‘吕’,在【输入注册码】中将上面的最后得到的注册码(42318675CAB9GEFDAEDD8IBHBBMMTVU)拷贝过去。点击【注册】按键。中断在 00508F59,下面是堆栈内容: : D2 H1 ]  s+ b/ d" p4 z8 M- l, ~
复制内容到剪贴板
' w+ G+ ~( A' c! \2 k7 s! g代码:EBP-38  0012F910    00F303D0    ASCII "5FF51115"
/ ]% K. T' U, |4 |6 K/ D9 I& UEBP-34  0012F914    00000000
& }8 x* G/ i+ R- Y$ q/ {$ yEBP-30  0012F918    00000000
2 |. D6 `2 Q3 h% P; D; A0 iEBP-2C  0012F91C    000000005 W! i% Z& V7 Q6 E* h) p+ l1 |; k
EBP-28  0012F920    000000001 Y' u, x! L* }3 I# q# C& i& Z
EBP-24  0012F924    00F30038    ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"
+ p+ Q6 V: P" s* V+ JEBP-20  0012F928    00F29F5C    ASCII "123456789ABCDEFG"
0 d9 m. s: `* `6 \% h( ZEBP-1C  0012F92C    00F3009C
8 I/ s. T* }% _) U8 G2 o  Q/ G! xEBP-18  0012F930    C338FAD3; Q6 m4 u3 t' S0 j2 b
EBP-14  0012F934    DD5CB3D0
& a# f# ^6 }2 P' g" BEBP-10  0012F938    D5D42656
% e8 |+ x$ [1 H, O- F. `EBP-C   0012F93C    A2BB6C94; A* P' W9 B$ E2 y
EBP-8   0012F940    00F2FFF8    ASCII "M9BJBBRIDE88TNP4"# `1 f5 i' t  Y% ]8 B# f' x: k
EBP-4   0012F944    00000000注意: EBP-38   0  00F2A130  ASCII "5FF51115"  这是我们要的 DES 加密的明文。
6 r2 U' U* z* b1 ^3 M      EBP-8    0> 00F2FFE4    ASCII "M9BJBBRIDE88TNP4" 这是 Key。# p+ X1 L; J( y* {! R
按 moon 帮主的方法,修改两句代码,进行逆运算,但我经过努力,总是没有成功,可能是对 moon 的方法不能深刻的理解,于是决定改用其他的方法。我们注意到如下代码:
" `- H/ z) H9 g, l) K% a7 e复制内容到剪贴板
. s* f/ N  C0 `* p* [代码:004F788E  lea  edx, [ebp+var_C]* c! W6 \; s9 N: Y( F. o  y  i
004F7891  mov  eax, [ebp+var_4]
- A' [. E% N! \9 T004F7894  call sub_4E97BC! X: _+ e' ~" q* v# L, k- ?1 U  \
004F7899  mov  ecx, ebx* j7 J3 z- W' b0 [" B
004F789B  mov  edx, [ebp+var_8]# `- `. U' S" ]+ x' u
004F789E  mov  eax, [ebp+var_C]
! S# L( a7 [" o004F78A1  call DecryStr                   ;DES 逆运算在最后一句 Call DecryStr 做的其实是DES的逆运算,前面还有一个辅助的运算,我认为,同益的代码中一定有一个DES的正向运算,即EncryStr,所以我找了一下,其实就在上面第三节--【获得的 17~22 位注册码】中出现过,下面我们跟进这个Call: 1 f- Y0 z- _4 s& j! ]$ g
复制内容到剪贴板 ( F9 n/ U! ]( |3 f' S& j
代码:0050C70B  call DES_EncryStr
$ E4 X9 e. ~: u2 r跟进
% u- u+ m' J* V+ B. U......
+ d8 b& b+ r" Y$ D......省略) l  \8 j! Y. V6 ~( I" _
004F781A  lea  ecx, [ebp+var_C]           ; 返回地址6 k4 P) K  t7 x2 p. p1 m1 i
004F781D  mov  edx, [ebp+var_8]           ; Key = M9BJBBRIDE88TNP4
. ?; _/ B, D$ A4 {8 X% R004F7820  mov  eax, [ebp+var_4]           ; Str = 5FF51115
5 M7 [, v2 S% |( m4 `7 F004F7823  call EncryStr
# V. G7 R1 T- }! B$ A1 h  l004F7828  mov  edx, ebx
2 q$ _) K% r! G4 J" i) R8 i6 I: W0 q! ~004F782A  mov  eax, [ebp+var_C]
% e- \9 O) q% @8 c6 C004F782D  call sub_4E63F4
' y: ?& U( T0 ]5 `* J3 n( B004F7832  xor  eax, eax                   ;这里下断点
+ E0 f4 f2 q: A/ X......9 @  M5 z1 _+ Z2 m; k
......省略可以看出,它和上面的代码正好相反,我们用下面的方法来获得 1~16 位的代码。4 o$ a3 t1 A. r7 O* Q$ i
接前面,我们中断在 * \2 i9 R, o" \; b
复制内容到剪贴板
" R6 @' {: g5 M* E7 \1 ?- F代码:00508F59  lea  edx, [ebp+var_34]在代码窗口中按 Ctrl-G,输入004F781A,转移到 004F781A。按 Ctrl-*,将Eip地址改到 004F781A。( Z0 ?2 d# y) P
我们要做的工作其实就是修改堆栈的地址,下面是具体操作。 ; d( ^1 y- O0 ?) D# \
复制内容到剪贴板 8 e- F/ H! F% H. y/ S# T  W
代码:EBP-38  0012F910    00F303D0    ASCII "5FF51115"! o4 q) x: y- h; X8 B
EBP-34  0012F914    00000000$ M4 b2 G1 t3 u) E; V
EBP-30  0012F918    00000000; W% H  ?1 R  m' S* ^. T
EBP-2C  0012F91C    00000000) a+ l; v8 g. S! G: ^9 o
EBP-28  0012F920    00000000+ [% U" ^, H0 p1 Q7 N- n# W' z
EBP-24  0012F924    00F30038    ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"7 K6 T/ O3 \; M1 t, Y8 ^
EBP-20  0012F928    00F29F5C    ASCII "123456789ABCDEFG"
" M+ b( o. L. h5 aEBP-1C  0012F92C    00F3009C
% Z+ G3 W; o# P+ x( \. |EBP-18  0012F930    C338FAD3& P+ \! e  J* N5 h" O# S
EBP-14  0012F934    DD5CB3D0
* s8 ]' m7 q" O- t, t6 ?8 yEBP-10  0012F938    D5D42656% e' E- w$ M9 ]! X5 Z- y* H
EBP-C   0012F93C    A2BB6C94    结果返回地址,这里改为 0,程序运行时会自行分配新的内存
2 ^& Y3 A$ ]/ `, a) d% [EBP-8   0012F940    00F2FFF8    ASCII "M9BJBBRIDE88TNP4"8 R7 h' a! t5 d& L/ ^
EBP-4   0012F944    00000000    这里是 Str 所以将这里改为 00F303D0,也就是[EBP-38] 指向的地址。另外,最终返回结果在 Ebx 中,而Ebx 是由上一级的过程传递过来的参数,已经由入口程序做过初始化,所以,必须分配一个有效的返回地址,这点和 [EBP-C] 不同,需要要注意,这里我们将 [EBP-24] 的堆栈地址分配给 Ebx, 也就是Ebx = 0012F924
" D- P7 v; \3 C( m$ N/ U/ A改完后堆栈如下: ! \% ]0 [7 @: [# r  w
复制内容到剪贴板 3 m& O' p& D) C! ^
代码:EBP-C    0> 00000000/ S1 l3 H  D  Y* B: K2 J
EBP-8    0> 00F2FFF8    ASCII "M9BJBBRIDE88TNP4"    Key
7 G1 Z8 m3 R8 u! v/ OEBP-4    0> 00F303D0    ASCII "5FF51115"            Str
+ g* m6 j' A% @9 P5 l在将 Ebx 的内容改为 EBP-24 的堆栈地址,即 Ebx = 0012F924   ASCII "123456789ABCDEFGDEDAHIB8MBMBTUV"在 004F7832 下断点,F9 运行,d [Ebx], [Ebx] =0VBMHYAMA260CSD1  第 1~16 位的注册码4 q' b* h) n+ z0 Z
现在我们来修改我们的注册码:
/ c! G* G3 p- {8 Z0 w1 \7 Q$ |1234567890123456 789012 34567 8 901# w8 w( _3 R/ w7 c
0VBMHYAMA260CSD1 DEDAHI B8MBM B TUV4 e% D, ], _" U& w5 V' v& y
用前面的小程序调位后得新注册码:
2 C# }7 Z+ H& O# {* s) ^. R1 I1234567890123456789012345678901
7 j8 U/ C& y5 hMVB0MYAH026A1SDCAEDD8IBHBBMMTVU! U) G+ p9 F2 Y+ e! [5 @
五、 获取最后 29~31 位注册码
4 P& Q- F% S, i5 `9 y+ R. J打开注册表编辑器:将Serial中的内容清除:
- a7 D5 P9 x0 m' I[HKEY_LOCAL_MACHINE\SOFTWARE\GoodSoft\GoodName]
' p+ }5 y; J* _" ~7 l$ b"Appid"=dword:059c0935
2 b0 P4 x/ \+ ^$ l% v"Serial"="MVB0MYAH026A1SDCAEDD8IBHBBMMTVU"+ f1 {& l  O9 w/ [
"Serial"="0"
! i+ ]* c0 W0 S5 D在OD 中按 Ctrl-F2 重新启动,将下面两处 Nop 掉。
& Y( c, `" U  w8 B0 Z复制内容到剪贴板
- ?$ Y, K7 M1 a: r8 I1 s8 q. ~代码:0055CFD2  call LStrCmp            ;关键比较,比较两种方式和数据计算得到的三个字符. }6 o' u$ `. S0 _7 Z5 y
0055CFD7  jnz  loc_55D157         ;Nop 这里$ U6 R* }: w" k. P  e! t
0055D025  call LStrCmp            ;关键比较,比较两种方式和数据计算得到的三个字符,和前面相同# G3 B  t* p7 q& v% a+ k7 p, ~
0055D02A  jnz  loc_55D0EA         ;Nop这里/ D0 C: {2 I2 h4 W8 v* K
0055D0A4  cmp  ebx, eax           ;关键比较,将前面进制转换得到的数和累加和比较,在这里下断点在上面 0055D0A4 处下断点,F9运行,出现同益启动画面后选‘注册’->‘输入注册码',在【起名的姓氏】中输入你的姓氏,我这里是输入‘吕’,在【输入注册码】中将上面的最后得到的注册码(MVB0MYAH026A1SDCAEDD8IBHBBMMTVU)拷贝过去。点击【注册】按键。中断在 0055D0A4,记录下Eax寄存器的内容,我这里是 2C3AH,换算成十进制数为 11322
' ]: A  J# W7 o6 s% f- C  a根据 moon 帮主的文章:
: S# g+ @* q( G# z2 u
( T2 V3 q2 S+ P求逆方法:
7 G$ b/ T" F6 a4 [1. 执行到00559E24,记下eax中的值x,或按照上面的方法计算出这个值;
$ M) s: b- v+ t$ S. v2. x除以31,用余数查表"0AH6CD3BEF4TRS2PUV5K1MN78YZ9GIJ",所得字符作为第31位;4 d7 {! I1 G7 t7 w% e' P: J
3. 第2步的商除以31,用余数查表,作为第30位;
$ A, |# X9 E) W, E4. 第3步的商查表,作为第29位。
. A( x) Z& Q# U; u2 n9 ?--摘自 moon 帮主的文章4 R0 \# r& F' W  j/ G
) C( k% m* `6 p
写如下Delphi 的小程序计算最后3位注册码。
* X: b! B7 z+ w0 `复制内容到剪贴板 2 J# V1 ^- i: v: Z
代码:procedure TForm1.Button3Click(Sender: TObject);
7 z9 ~- J" r  ^4 j+ `const2 I& v! R; q9 I$ X6 [% k
    Str = '0AH6CD3BEF4TRS2PUV5K1MN78YZ9GIJ';
. g; T3 C+ D5 ~5 xvar
/ H* @1 m9 n+ h& [, D* c    x1, x2: Integer;
6 J- Q* n! z6 ^: b% v1 o+ i    S1, S2: String;) ^- S- [" v# F1 F
begin/ w6 V# z/ Y% p9 ~. q* v& q
    x2 := StrToInt(Edit1.Text);
5 }! F( Y, m* E) E0 ^( l& T; G    x1 := x2 mod 31;( P4 V5 X- k1 N+ }$ E" O
    S1 := Copy(Str, x1 + 1, 1);, n& w7 D% ^, |+ ~+ Z
    x1 := (x2 div 31) mod 31;
: O5 y  t; i( S9 ]% X- O    S2 := Copy(Str, x1 + 1, 1);* y/ X& z4 G; w+ g) N  u
    S1 := S2 + S1;6 @9 c- b( U3 u* m7 t
    x1 := (x2 div 31) div 31;; n( M! M! |& _
    S2 := Copy(Str, x1 + 1, 1);
" N' A) s& u- ~) d3 n# f    Edit2.Text := S2 + S1;6 c: t- K5 S& C2 j* b' b- H
end;在 Edit1 中输入 11322,按 Button3 键,在 Edit2 中给出结果 T8B
( n) q3 X) `- k2 ]' q现在我们将获得最终的注册号:
+ a$ u8 n$ z7 p$ v+ x1 G3 f1234567890123456 789012 34567 8 901
# m6 I, \* G- p8 x0VBMHYAMA260CSD1 DEDAHI B8MBM B T8B
9 i( |5 @  @& C. n, b& ~! `用前面的小程序调位后得新注册码:
2 E) u( v+ J7 z4 V' X9 g1234567890123456789012345678901
& ^6 H5 g  R  ]) l( r- Q* `MVB0MYAH026A1SDCAEDD8IBHBBMMTB8
5 [9 L. z  z  X# P6 _在我的机器上,注册号为 MVB0MYAH026A1SDCAEDD8IBHBBMMTB8 ,用未脱壳的原版注册后所有功能完全正常,公司后缀的分析类似,有兴趣的朋友可以自己试。
0 i6 O* w* f& D2 k# F8 ?) @另外,对于Delphi的小程序,什么版本都可以,但编译开关 Huge String 要勾上,我使用的是 Delphi 7。
! i8 u4 A8 v0 C1 g说明:& c  I$ j; y3 W+ z# d
" @) J1 Q4 Z" m& S! X; K
1、对于调位操作,字符串长度必须是 31 位(不算空格),可以带空格输入,这样比较方便直接拷贝,如可以直接输入:/ u- S8 q4 Q  d' ^2 g% T
"0VBMHYAMA260CSD1 DEDAHI B8MBM B T8B"
; h7 Y: s/ _5 v8 L3 F2、对于计算最后的第 29~31 位,可以直接输入十六进制数,不过要加 '$' 前缀,例如在我们这个例子中,可以直接输入 $2C3A (不分大小写)。3 D+ x8 X* @2 V7 T
发表于 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{{
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

相关侵权、举报、投诉及建议等,请发 E-mail:yesdong@qq.com

Powered by Discuz! X5.0 Licensed © 2001-2026 Discuz! Team.44152102000001

在本版发帖QQ客服返回顶部