【文章标题】: Aurora Media Workshop 3.4.2注册过程
【文章作者】: thdzhqg
【软件名称】: Aurora Media Workshop
【软件大小】: 4.66 MB
【下载地址】: 华军软件园
【加壳方式】: 无
【保护方式】: 注册码
【编写语言】: Microsoft Visual C++ 6.0
【使用工具】: od
【操作平台】: winxp
【软件介绍】: 国外一款多媒体编辑软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
od载入查找字符串‘invalid username or registration code’来到
0045BDA0 . 6A FF push -1 ; (initial cpu selection)
0045BDA2 . 68 18204700 push 00472018 ; SE 处理程序安装
0045BDA7 . 64:A1 0000000>mov eax, fs:[0]
0045BDAD . 50 push eax
0045BDAE . 64:8925 00000>mov fs:[0], esp
0045BDB5 . 51 push ecx
0045BDB6 . 53 push ebx
0045BDB7 . 56 push esi
0045BDB8 . 8BF1 mov esi, ecx
0045BDBA . 57 push edi
0045BDBB . 8D4C24 0C lea ecx, [esp+C]
0045BDBF . E8 64A40000 call <jmp.&MFC42.#540_CString::CString>
0045BDC4 . 6A 01 push 1 ; 在0045BDC4处F2,不然会跳到注册失败,seh?
0045BDC6 . 8BCE mov ecx, esi
0045BDC8 . C74424 1C 000>mov dword ptr [esp+1C], 0
0045BDD0 . E8 D3A80000 call <jmp.&MFC42.#6334_CWnd::UpdateData>
0045BDD5 . E8 FCA70000 call <jmp.&MFC42.#1168_AfxGetModuleState>
0045BDDA . 8B48 04 mov ecx, [eax+4]
0045BDDD . E8 08A90000 call <jmp.&MFC42.#1669_CCmdTarget::BeginWaitCu>
0045BDE2 . 68 E8030000 push 3E8 ; /Timeout = 1000. ms
0045BDE7 . FF15 3C324700 call [<&KERNEL32.Sleep>] ; \Sleep
0045BDED . E8 E4A70000 call <jmp.&MFC42.#1168_AfxGetModuleState>
0045BDF2 . 8B48 04 mov ecx, [eax+4]
0045BDF5 . E8 EAA80000 call <jmp.&MFC42.#2652_CCmdTarget::EndWaitCurs>
0045BDFA . 8B46 64 mov eax, [esi+64]
0045BDFD . 8B4E 60 mov ecx, [esi+60]
0045BE00 . 8D5E 64 lea ebx, [esi+64]
0045BE03 . 8D7E 60 lea edi, [esi+60]
0045BE06 . 50 push eax
0045BE07 . 51 push ecx
0045BE08 . E8 733F0000 call 0045FD80 ; 关键call 跟进
0045BE0D . 83C4 08 add esp, 8
0045BE10 . 85C0 test eax, eax
0045BE12 . 75 1F jnz short 0045BE33 ; 关键比较
0045BE14 . 6A 40 push 40 ; (initial cpu selection)
0045BE16 . 68 9C4C4900 push 00494C9C ; sorry
0045BE1B . 68 704C4900 push 00494C70 ; invalid username or registration code
0045BE20 . 8BCE mov ecx, esi
0045BE22 . E8 7DA90000 call <jmp.&MFC42.#4224_CWnd::MessageBoxA>
0045BE27 . C705 D8FB4D00>mov dword ptr [4DFBD8], 0
0045BE31 . EB 76 jmp short 0045BEA9
0045BE33 > 8B07 mov eax, [edi]
0045BE35 . 8D4C24 0C lea ecx, [esp+C]
0045BE39 . 50 push eax
0045BE3A . 68 544C4900 push 00494C54 ; license to:%s
0045BE3F . 51 push ecx
0045BE40 . E8 97A70000 call <jmp.&MFC42.#2818_CString::Format>
0045BE45 . 8B5424 18 mov edx, [esp+18]
0045BE49 . 83C4 0C add esp, 0C
0045BE4C . 8BCE mov ecx, esi
0045BE4E . 6A 40 push 40
0045BE50 . 68 484C4900 push 00494C48 ; thank you
0045BE55 . 52 push edx
0045BE56 . E8 49A90000 call <jmp.&MFC42.#4224_CWnd::MessageBoxA>
0045BE5B . 57 push edi
0045BE5C . B9 D4D24900 mov ecx, 0049D2D4
0045BE61 . E8 CEA30000 call <jmp.&MFC42.#858_CString::operator=>
0045BE66 . 53 push ebx
0045BE67 . B9 D8D24900 mov ecx, 0049D2D8
0045BE6C . E8 C3A30000 call <jmp.&MFC42.#858_CString::operator=>
0045BE71 . C705 D8FB4D00>mov dword ptr [4DFBD8], 1
0045BE7B . 8B3F mov edi, [edi]
0045BE7D . 57 push edi
0045BE7E . 68 A0C24800 push 0048C2A0 ; username
0045BE83 . 68 94C24800 push 0048C294 ; register
0045BE88 . B9 C4D14900 mov ecx, 0049D1C4
0045BE8D . E8 5EC7FEFF call 004485F0
0045BE92 . 8B1B mov ebx, [ebx]
0045BE94 . B9 C4D14900 mov ecx, 0049D1C4
0045BE99 . 53 push ebx
0045BE9A . 68 84C24800 push 0048C284 ; registercode
0045BE9F . 68 94C24800 push 0048C294 ; register
0045BEA4 . E8 47C7FEFF call 004485F0
0045BEA9 > 8BCE mov ecx, esi
0045BEAB . E8 04A80000 call <jmp.&MFC42.#4853_CDialog::OnOK>
0045BEB0 . 8D4C24 0C lea ecx, [esp+C]
0045BEB4 . C74424 18 FFF>mov dword ptr [esp+18], -1
0045BEBC . E8 1FA30000 call <jmp.&MFC42.#800_CString::~CString>
0045BEC1 . 8B4C24 10 mov ecx, [esp+10]
0045BEC5 . 5F pop edi
0045BEC6 . 5E pop esi
0045BEC7 . 5B pop ebx
0045BEC8 . 64:890D 00000>mov fs:[0], ecx
0045BECF . 83C4 10 add esp, 10
0045BED2 . C3 retn
------------------------------------------------------------------------------
进入关键call
0045FD80 /$ 53 push ebx
0045FD81 |. 55 push ebp
0045FD82 |. 8B6C24 0C mov ebp, [esp+C]
0045FD86 |. 56 push esi
0045FD87 |. 57 push edi
0045FD88 |. BE 54D14900 mov esi, 0049D154 ; 下面判断用户名第一位是不是0
0045FD8D |. 8BC5 mov eax, ebp ; 用户名入eax
0045FD8F |> 8A10 /mov dl, [eax] ; 用户名第一位入dl
0045FD91 |. 8A1E |mov bl, [esi] ; 0入bl
0045FD93 |. 8ACA |mov cl, dl ; t和x比较
0045FD95 |. 3AD3 |cmp dl, bl ; t和0比较
0045FD97 |. 75 1E |jnz short 0045FDB7
0045FD99 |. 84C9 |test cl, cl
0045FD9B |. 74 16 |je short 0045FDB3
0045FD9D |. 8A50 01 |mov dl, [eax+1]
0045FDA0 |. 8A5E 01 |mov bl, [esi+1]
0045FDA3 |. 8ACA |mov cl, dl
0045FDA5 |. 3AD3 |cmp dl, bl
0045FDA7 |. 75 0E |jnz short 0045FDB7
0045FDA9 |. 83C0 02 |add eax, 2
0045FDAC |. 83C6 02 |add esi, 2
0045FDAF |. 84C9 |test cl, cl
0045FDB1 |.^ 75 DC \jnz short 0045FD8F
0045FDB3 |> 33C0 xor eax, eax
0045FDB5 |. EB 05 jmp short 0045FDBC
0045FDB7 |> 1BC0 sbb eax, eax ; 借位减=0
0045FDB9 |. 83D8 FF sbb eax, -1 ; =1
0045FDBC |> 85C0 test eax, eax
0045FDBE |. 74 51 je short 0045FE11
0045FDC0 |. 8B7C24 18 mov edi, [esp+18] ; 注册码地址进edi
0045FDC4 |. BE 54D14900 mov esi, 0049D154 ; 下面判断注册码第一位是不是等于0
0045FDC9 |. 8BC7 mov eax, edi ; 注册码进eax
0045FDCB |> 8A10 /mov dl, [eax] ; 注册码第一位进dl
0045FDCD |. 8A1E |mov bl, [esi] ; 49d154地址为0 进bl
0045FDCF |. 8ACA |mov cl, dl ; 注册码第一位进cl
0045FDD1 |. 3AD3 |cmp dl, bl ; 7和0比较
0045FDD3 |. 75 1E |jnz short 0045FDF3
0045FDD5 |. 84C9 |test cl, cl
0045FDD7 |. 74 16 |je short 0045FDEF
0045FDD9 |. 8A50 01 |mov dl, [eax+1]
0045FDDC |. 8A5E 01 |mov bl, [esi+1]
0045FDDF |. 8ACA |mov cl, dl
0045FDE1 |. 3AD3 |cmp dl, bl
0045FDE3 |. 75 0E |jnz short 0045FDF3
0045FDE5 |. 83C0 02 |add eax, 2
0045FDE8 |. 83C6 02 |add esi, 2
0045FDEB |. 84C9 |test cl, cl
0045FDED |.^ 75 DC \jnz short 0045FDCB
0045FDEF |> 33C0 xor eax, eax
0045FDF1 |. EB 05 jmp short 0045FDF8
0045FDF3 |> 1BC0 sbb eax, eax ; 借位减 eax=0
0045FDF5 |. 83D8 FF sbb eax, -1 ; =1
0045FDF8 |> 85C0 test eax, eax
0045FDFA |. 74 15 je short 0045FE11
0045FDFC |. 57 push edi ; 注册码入栈
0045FDFD |. 55 push ebp ; 用户名入栈
0045FDFE |. E8 4DFDFFFF call 0045FB50 ; 关键call
0045FE03 |. 83C4 08 add esp, 8
0045FE06 |. F7D8 neg eax
0045FE08 |. 5F pop edi
0045FE09 |. 5E pop esi
0045FE0A |. 1BC0 sbb eax, eax
0045FE0C |. 5D pop ebp
0045FE0D |. F7D8 neg eax
0045FE0F |. 5B pop ebx
0045FE10 |. C3 retn
0045FE11 |> 5F pop edi
0045FE12 |. 5E pop esi
0045FE13 |. 5D pop ebp
0045FE14 |. 33C0 xor eax, eax
0045FE16 |. 5B pop ebx
0045FE17 \. C3 retn
上面是判断用户名和注册码是否为空,继续进入0045FDFE
0045FB50 /$ 6A FF push -1
0045FB52 |. 68 F0264700 push 004726F0 ; SE 处理程序安装
0045FB57 |. 64:A1 0000000>mov eax, fs:[0]
0045FB5D |. 50 push eax
0045FB5E |. 64:8925 00000>mov fs:[0], esp
0045FB65 |. 83EC 14 sub esp, 14
0045FB68 |. 8B4424 24 mov eax, [esp+24] ; 用户名进eax
0045FB6C |. 53 push ebx
0045FB6D |. 55 push ebp
0045FB6E |. 56 push esi
0045FB6F |. 57 push edi
0045FB70 |. 50 push eax
0045FB71 |. 8D4C24 18 lea ecx, [esp+18]
0045FB75 |. E8 78660000 call <jmp.&MFC42.#537_CString::CString> ; 注册码地址进ecx
0045FB7A |. 8D4C24 14 lea ecx, [esp+14]
0045FB7E |. C74424 2C 000>mov dword ptr [esp+2C], 0
0045FB86 |. E8 A56A0000 call <jmp.&MFC42.#6282_CString::TrimLeft>; 去掉用户名左右空格
0045FB8B |. 8D4C24 14 lea ecx, [esp+14]
0045FB8F |. E8 966A0000 call <jmp.&MFC42.#6283_CString::TrimRigh>
0045FB94 |. 6A 20 push 20
0045FB96 |. 8D4C24 18 lea ecx, [esp+18]
0045FB9A |. E8 316D0000 call <jmp.&MFC42.#2915_CString::GetBuffe>
0045FB9F |. 8B4C24 38 mov ecx, [esp+38] ; 注册码进ecx
0045FBA3 |. 8BD8 mov ebx, eax
0045FBA5 |. 51 push ecx
0045FBA6 |. 8D4C24 14 lea ecx, [esp+14]
0045FBAA |. E8 43660000 call <jmp.&MFC42.#537_CString::CString>
0045FBAF |. 8D4C24 10 lea ecx, [esp+10] ; 注册码进ecx
0045FBB3 |. C64424 2C 01 mov byte ptr [esp+2C], 1
0045FBB8 |. E8 736A0000 call <jmp.&MFC42.#6282_CString::TrimLeft>; 去掉注册码左右空格
0045FBBD |. 8D4C24 10 lea ecx, [esp+10]
0045FBC1 |. E8 646A0000 call <jmp.&MFC42.#6283_CString::TrimRigh>
0045FBC6 |. 6A 20 push 20
0045FBC8 |. 8D4C24 14 lea ecx, [esp+14]
0045FBCC |. E8 FF6C0000 call <jmp.&MFC42.#2915_CString::GetBuffe>
0045FBD1 |. 8BD0 mov edx, eax ; 注册码进edx
0045FBD3 |. 83CE FF or esi, FFFFFFFF
0045FBD6 |. 8BFA mov edi, edx
0045FBD8 |. 8BCE mov ecx, esi
0045FBDA |. 33C0 xor eax, eax
0045FBDC |. 895424 20 mov [esp+20], edx ; 注册码进栈
0045FBE0 |. F2:AE repne scas byte ptr es:[edi] ; ecx=fffffff7
0045FBE2 |. F7D1 not ecx ; ecx=7
0045FBE4 |. 49 dec ecx ; 7-1=6
0045FBE5 |. 8BFB mov edi, ebx ; 注册码进edi
0045FBE7 |. 8BE9 mov ebp, ecx
0045FBE9 |. 8BCE mov ecx, esi
0045FBEB |. F2:AE repne scas byte ptr es:[edi]
0045FBED |. F7D1 not ecx ; fffffff8
0045FBEF |. 49 dec ecx ; 8-1=7
0045FBF0 |. 3BCD cmp ecx, ebp ; 比较注册码位数是否大于用户名
0045FBF2 |. 0F87 54010000 ja 0045FD4C ; 关键不能跳
0045FBF8 |. 8BFB mov edi, ebx ; 注册码进edi
0045FBFA |. 8BCE mov ecx, esi ; ffffffff进ecx
0045FBFC |. F2:AE repne scas byte ptr es:[edi] ; ecx=fffffff7
0045FBFE |. F7D1 not ecx ; ecx=8
0045FC00 |. 49 dec ecx ; 8-1=7
0045FC01 |. 0F84 45010000 je 0045FD4C ; 关键不能跳
0045FC07 |. 8BFA mov edi, edx ; 注册码进edi
0045FC09 |. 8BCE mov ecx, esi
0045FC0B |. F2:AE repne scas byte ptr es:[edi]
0045FC0D |. F7D1 not ecx ; ecx=fffffff8
0045FC0F |. 49 dec ecx ; ecx=7-1=6不等于0
0045FC10 |. 0F84 36010000 je 0045FD4C ; 关键跳不能跳
0045FC16 |. 894424 38 mov [esp+38], eax
0045FC1A |> 8B5424 38 /mov edx, [esp+38] ; 清空edx
0045FC1E |. 8D4C24 34 |lea ecx, [esp+34] ; 用户名进ecx
0045FC22 |. 8A82 884E4900 |mov al, [edx+494E88] ; p的ascll进al
0045FC28 |. 884424 18 |mov [esp+18], al
0045FC2C |. E8 F7650000 |call <jmp.&MFC42.#540_CString::CString>
0045FC31 |. 8BFB |mov edi, ebx ; 用户名进edi
0045FC33 |. 83C9 FF |or ecx, FFFFFFFF ; ecx=ffffffff
0045FC36 |. 33C0 |xor eax, eax ; eax=0
0045FC38 |. 33ED |xor ebp, ebp ; ebx=0
0045FC3A |. F2:AE |repne scas byte ptr es:[edi]
0045FC3C |. F7D1 |not ecx ; ecx=fffffff7
0045FC3E |. 49 |dec ecx ; ecx=8-1=7
0045FC3F |. C64424 2C 02 |mov byte ptr [esp+2C], 2
0045FC44 |. 74 4B |je short 0045FC91 ; 是否=2
0045FC46 |> 8A042B |/mov al, [ebx+ebp] ; 循环用户名
0045FC49 |. 33F6 ||xor esi, esi
0045FC4B |> 3A0475 204E49>||/cmp al, [esi*2+494E20] ; 循环找用户名等于字母表第几位
0045FC52 |. 74 08 |||je short 0045FC5C
0045FC54 |. 46 |||inc esi
0045FC55 |. 83FE 34 |||cmp esi, 34
0045FC58 |.^ 7C F1 ||\jl short 0045FC4B
0045FC5A |. EB 11 ||jmp short 0045FC6D
0045FC5C |> 8A0C75 214E49>||mov cl, [esi*2+494E21] ; 然后在乱序表中根据位数找到字母
0045FC63 |. 51 ||push ecx
0045FC64 |. 8D4C24 38 ||lea ecx, [esp+38]
0045FC68 |. E8 43680000 ||call <jmp.&MFC42.#940_CString::operato>
0045FC6D |> 83FE 34 ||cmp esi, 34 ; 位数是否等于34
0045FC70 |. 75 0E ||jnz short 0045FC80
0045FC72 |. 8B5424 18 ||mov edx, [esp+18]
0045FC76 |. 8D4C24 34 ||lea ecx, [esp+34]
0045FC7A |. 52 ||push edx
0045FC7B |. E8 30680000 ||call <jmp.&MFC42.#940_CString::operato>; 得到PkIFkdM
0045FC80 |> 8BFB ||mov edi, ebx
0045FC82 |. 83C9 FF ||or ecx, FFFFFFFF
0045FC85 |. 33C0 ||xor eax, eax
0045FC87 |. 45 ||inc ebp
0045FC88 |. F2:AE ||repne scas byte ptr es:[edi]
0045FC8A |. F7D1 ||not ecx
0045FC8C |. 49 ||dec ecx
0045FC8D |. 3BE9 ||cmp ebp, ecx ; 用户名位数和1比
0045FC8F |.^ 72 B5 |\jb short 0045FC46
0045FC91 |> 8B4424 34 |mov eax, [esp+34] ; PkIFkdM进eax
0045FC95 |. 8B48 F8 |mov ecx, [eax-8] ; 位数进ecx
0045FC98 |. 83F9 10 |cmp ecx, 10 ; 是否等于16位
0045FC9B |. 7D 3A |jge short 0045FCD7 ; 大于等于跳
0045FC9D |. 8BC1 |mov eax, ecx
0045FC9F |. B9 10000000 |mov ecx, 10
0045FCA4 |. 2BC8 |sub ecx, eax ; 16-7=9
0045FCA6 |. 8D5424 1C |lea edx, [esp+1C]
0045FCAA |. 51 |push ecx
0045FCAB |. 52 |push edx
0045FCAC |. B9 90FB4D00 |mov ecx, 004DFB90
0045FCB1 |. E8 02660000 |call <jmp.&MFC42.#4129_CString::Left> ; 取字符串LdQsBcmpJpaE左边位数填充9位
0045FCB6 |. 50 |push eax
0045FCB7 |. 8D4C24 38 |lea ecx, [esp+38]
0045FCBB |. C64424 30 03 |mov byte ptr [esp+30], 3
0045FCC0 |. E8 E5670000 |call <jmp.&MFC42.#939_CString::operator>; ‘PkIFkdM’+‘LdQsBcmpJ’
0045FCC5 |. 8D4C24 1C |lea ecx, [esp+1C]
0045FCC9 |. C64424 2C 02 |mov byte ptr [esp+2C], 2
0045FCCE |. E8 0D650000 |call <jmp.&MFC42.#800_CString::~CString>
0045FCD3 |. 8B4424 34 |mov eax, [esp+34]
0045FCD7 |> 8B4C24 20 |mov ecx, [esp+20] ; 注册码进ecx
0045FCDB |. 51 |push ecx ; /s2
0045FCDC |. 50 |push eax ; |s1
0045FCDD |. FF15 A03A4700 |call [<&MSVCRT._mbscmp>] ; \比较是否等于PkIFkdMLdQsBcmpJ
0045FCE3 |. 83C4 08 |add esp, 8
0045FCE6 |. 8D4C24 34 |lea ecx, [esp+34]
0045FCEA |. 85C0 |test eax, eax
0045FCEC |. C64424 2C 01 |mov byte ptr [esp+2C], 1
0045FCF1 |. 74 1B |je short 0045FD0E ; 关键比较
0045FCF3 |. 33F6 |xor esi, esi
0045FCF5 |. E8 E6640000 |call <jmp.&MFC42.#800_CString::~CString>
0045FCFA |. 8B4424 38 |mov eax, [esp+38]
0045FCFE |. 40 |inc eax
0045FCFF |. 83F8 03 |cmp eax, 3
0045FD02 |. 894424 38 |mov [esp+38], eax
0045FD06 |.^ 0F8C 0EFFFFFF \jl 0045FC1A
0045FD0C |. EB 0A jmp short 0045FD18
0045FD0E |> BE 01000000 mov esi, 1
0045FD13 |. E8 C8640000 call <jmp.&MFC42.#800_CString::~CString>
0045FD18 |> 8D4C24 10 lea ecx, [esp+10]
0045FD1C |. C64424 2C 00 mov byte ptr [esp+2C], 0
0045FD21 |. E8 BA640000 call <jmp.&MFC42.#800_CString::~CString>
0045FD26 |. 8D4C24 14 lea ecx, [esp+14]
0045FD2A |. C74424 2C FFF>mov dword ptr [esp+2C], -1
0045FD32 |. E8 A9640000 call <jmp.&MFC42.#800_CString::~CString>
0045FD37 |. 8BC6 mov eax, esi
0045FD39 |. 5F pop edi
0045FD3A |. 5E pop esi
0045FD3B |. 5D pop ebp
0045FD3C |. 5B pop ebx
0045FD3D |. 8B4C24 14 mov ecx, [esp+14]
0045FD41 |. 64:890D 00000>mov fs:[0], ecx
0045FD48 |. 83C4 20 add esp, 20
0045FD4B |. C3 retn
0045FD4C |> 8D4C24 10 lea ecx, [esp+10] ; 注册码进ecx
0045FD50 |. C64424 2C 00 mov byte ptr [esp+2C], 0
0045FD55 |. E8 86640000 call <jmp.&MFC42.#800_CString::~CString>
0045FD5A |. 8D4C24 14 lea ecx, [esp+14] ; 用户名进ecx
0045FD5E |. 897424 2C mov [esp+2C], esi
0045FD62 |. E8 79640000 call <jmp.&MFC42.#800_CString::~CString>
0045FD67 |. 8B4C24 24 mov ecx, [esp+24] ; 注册码进ecx
0045FD6B |. 5F pop edi
0045FD6C |. 5E pop esi
0045FD6D |. 5D pop ebp
0045FD6E |. 33C0 xor eax, eax
0045FD70 |. 5B pop ebx
0045FD71 |. 64:890D 00000>mov fs:[0], ecx
0045FD78 |. 83C4 20 add esp, 20
0045FD7B \. C3 retn
字符表:
aCbxcidIeAfXgMhkiEjVkZlemRnyoBpKqdrTsStPuWvlwjxDyHzFAzBqCpDOEkFgGYHmItJaKrLQMnNsOuPUQGRJSLTNUbVcWfXhYoZwPWM
如果不够16位填充的字符表:
LdQsBcmpJpaE
--------------------------------------------------------------------------------
【经验总结】
1.注册码位数必须大于用户名位数
2.循环判断用户名在字符表的位置,即esi*2+494E20,字符表按照a * b * c * d * f *....排列,*的位置是乱序字符,根
据用户名的位置数找到乱序字符,即esi*2+494E21的位置,esi等于顺序排列字符的位置(如果用户名字符>34h(102)即字符表中Z的位置就填充字母P,例如用户名:~!@#¥%……&*()~!@#¥ ,注册码:PPPPPPPPPPPPPPPP 就能注册成功,感谢一衰烟雨鹭影依凌
版主提醒。)
3.如果用户名不等于16位,把填充字符表从左开始补够16位
4.比较注册码是否和算出来的注册码比较
一组可用的注册码
Name:thdzhqg
Registration Code:PkIFkdMLdQsBcmpJ
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课