【破文标题】KeyGenMe2007_C简单算法分析+VB注册机源码
【破解作者】hrbx
【作者主页】hrbx.ys168.com
【作者邮箱】hrbx@163.com
【破解平台】WinXP
【使用工具】flyOD1.10、Peid
【破解日期】2007-06-13
【软件名称】KeyGenMe2007_C
【软件大小】67KB
【下载地址】http://bbs.chinapyg.com/viewthread.php?tid=16561
【加壳方式】UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo
【软件简介】KeyGenMe2007_C[WWW.CHINAPYG.COM]
-----------------------------------------------------------------------------------------------
【破解声明】我是一只小菜鸟,偶得一点心得,愿与大家分享:)
-----------------------------------------------------------------------------------------------
【破解过程】
1.脱壳。用Peid扫描程序,显示为:UPX 0.89.6 - 1.02 / 1.05 - 1.24 -> Markus & Laszlo。ESP定律脱之,再次用Peid核心扫描,显示为:Microsoft Visual C++ 6.0。
2.试运行。运行程序,输入注册信息后,点"OK"按钮没有任何提示。
3.追出算法。OD载入脱壳后的程序,F9运行,输入注册信息:
====================================================
RegName:hrbx
RegCode:9876543210
====================================================
转到OD,ALT+M,右键--搜索,输入注册名:hrbx,找到后右键--断点--内存访问,回到程序,点"OK"按钮,立即中断:
77D32169 881F mov byte ptr ds:[edi],bl ; 内存访问后中断在这里
77D3216B 8B4D 08 mov ecx,dword ptr ss:[ebp+8]
77D3216E E8 6D63FEFF call USER32.77D184E0
77D32173 8BF0 mov esi,eax
F8往下, 走回程序领空,来到:
00402490 56 push esi
00402491 8BF1 mov esi,ecx
00402493 6A 01 push 1
00402495 E8 585D0000 call <jmp.&MFC42.#6334_CWnd::UpdateData>
0040249A 74 03 je short Unpacked.0040249F ; F8返回这里
0040249C 75 01 jnz short Unpacked.0040249F
0040249E 68 8B862C01 push 12C868B
004024A3 0000 add byte ptr ds:[eax],al
004024A5 8378 F8 2D cmp dword ptr ds:[eax-8],2D ; 比较注册码长度是否为0x2D(45)
004024A9 0F85 FF000000 jnz Unpacked.004025AE ; 不等则Over,暴破点1,改为Nop
004024AF 74 03 je short Unpacked.004024B4
004024B1 75 01 jnz short Unpacked.004024B4
004024B3 68 EB01858B push 8B8501EB
004024B8 8E2C01 mov gs,word ptr ds:[ecx+eax]
004024BB 0000 add byte ptr ds:[eax],al ; 依次取注册码特定位置的字符运算
004024BD 8A41 06 mov al,byte ptr ds:[ecx+6] ; 第7位
004024C0 8A51 05 mov dl,byte ptr ds:[ecx+5] ; 第6位
004024C3 33C2 xor eax,edx ; 第7位 xor 第6位
004024C5 0FBE51 07 movsx edx,byte ptr ds:[ecx+7] ; 第8位
004024C9 83E0 7F and eax,7F ; (第7位 xor 第6位)and 0x7F
004024CC 0FBE49 04 movsx ecx,byte ptr ds:[ecx+4] ; 第5位
004024D0 0FAFC2 imul eax,edx ; ((第7位 xor 第6位)and 0x7F)*第8位
004024D3 03C1 add eax,ecx ; ((第7位 xor 第6位)and 0x7F)*第8位+第5位
004024D5 B9 6B000000 mov ecx,6B ; ECX=0x6B,常数1
004024DA 99 cdq
004024DB F7F9 idiv ecx ; EAX/ECX
004024DD 85D2 test edx,edx ; EDX=余数
004024DF 0F85 C9000000 jnz Unpacked.004025AE ; 不能整除则Over,暴破点2,改为Nop
004024E5 74 03 je short Unpacked.004024EA
004024E7 75 01 jnz short Unpacked.004024EA
004024E9 68 74037501 push 1750374
004024EE 68 EB0185EB push EB8501EB
004024F3 0185 8B8E2C01 add dword ptr ss:[ebp+12C8E8B],eax
004024F9 0000 add byte ptr ds:[eax],al
004024FB 0FBE41 0A movsx eax,byte ptr ds:[ecx+A] ; 第11位
004024FF 0FBE51 09 movsx edx,byte ptr ds:[ecx+9] ; 第10位
00402503 23C2 and eax,edx ; 第11位 and 第10位
00402505 0FBE51 0B movsx edx,byte ptr ds:[ecx+B] ; 第12位
00402509 0FBE49 08 movsx ecx,byte ptr ds:[ecx+8] ; 第9位
0040250D 0FAFC2 imul eax,edx ; (第11位 and 第10位)*第12位
00402510 03C1 add eax,ecx ; (第11位 and 第10位)*第12位+第9位
00402512 B9 65000000 mov ecx,65 ; ECX=0x65,常数2
00402517 99 cdq
00402518 F7F9 idiv ecx ; EAX/ECX
0040251A 83FA 08 cmp edx,8 ; EDX=余数,余数与8比较
0040251D 0F85 8B000000 jnz Unpacked.004025AE ; 不等则Over,暴破点3,改为Nop
00402523 EB 01 jmp short Unpacked.00402526
00402525 85EB test ebx,ebp
00402527 0185 8B8E2C01 add dword ptr ss:[ebp+12C8E8B],eax
0040252D 0000 add byte ptr ds:[eax],al
0040252F 0FBE41 0E movsx eax,byte ptr ds:[ecx+E] ; 第15位
00402533 0FBE51 0D movsx edx,byte ptr ds:[ecx+D] ; 第14位
00402537 0FAFC2 imul eax,edx ; 第15位 * 第14位
0040253A 0FBE51 0F movsx edx,byte ptr ds:[ecx+F] ; 第16位
0040253E 0FBE49 0C movsx ecx,byte ptr ds:[ecx+C] ; 第13位
00402542 03C2 add eax,edx ; (第15位 * 第14位)+第16位
00402544 03C1 add eax,ecx ; (第15位 * 第14位)+第16位+第13位
00402546 B9 69000000 mov ecx,69 ; ECX=0x69,常数3
0040254B 99 cdq
0040254C F7F9 idiv ecx ; EAX/ECX
0040254E 85D2 test edx,edx ; EDX=余数
00402550 75 5C jnz short Unpacked.004025AE ; 不能整除则Over,暴破点4,改为Nop
00402552 74 03 je short Unpacked.00402557
00402554 75 01 jnz short Unpacked.00402557
00402556 68 EB01858B push 8B8501EB
0040255B 8E2C01 mov gs,word ptr ds:[ecx+eax]
0040255E 0000 add byte ptr ds:[eax],al
00402560 0FBE41 12 movsx eax,byte ptr ds:[ecx+12] ; 第19位
00402564 0FBE51 11 movsx edx,byte ptr ds:[ecx+11] ; 第18位
00402568 0BC2 or eax,edx ; 第19位 or 第18位
0040256A 0FBE51 13 movsx edx,byte ptr ds:[ecx+13] ; 第20位
0040256E 0FBE49 10 movsx ecx,byte ptr ds:[ecx+10] ; 第17位
00402572 0FAFC2 imul eax,edx ; (第19位 or 第18位)*第20位
00402575 03C1 add eax,ecx ; (第19位 or 第18位)*第20位+第17位
00402577 B9 69000000 mov ecx,69 ; ECX=0x69,常数3
0040257C 99 cdq
0040257D F7F9 idiv ecx ; EAX/ECX
0040257F 85D2 test edx,edx ; EDX=余数
00402581 75 2B jnz short Unpacked.004025AE ; 不能整除则Over,暴破点5,改为Nop
00402583 EB 01 jmp short Unpacked.00402586 ; 在此处按Enter
00402585 8581 7E60CB4B test dword ptr ds:[ecx+4BCB607E],eax
0040258B A4 movs byte ptr es:[edi],byte ptr ds:[esi]
0040258C 0D 74187403 or eax,3741874
00402591 75 01 jnz short Unpacked.00402594
00402593 68 8BCEE855 push 55E8CE8B
00402598 0300 add eax,dword ptr ds:[eax]
0040259A 00EB add bl,ch
0040259C 0185 8BCEE80B add dword ptr ss:[ebp+BE8CE8B],eax
004025A2 04 00 add al,0
004025A4 00EB add bl,ch
004025A6 07 pop es
004025A7 8BCE mov ecx,esi
004025A9 E8 42020000 call Unpacked.004027F0
004025AE 8B56 20 mov edx,dword ptr ds:[esi+20]
004025B1 6A 01 push 1
004025B3 52 push edx
004025B4 FF15 2C934000 call dword ptr ds:[<&USER32.KillTimer>] ; USER32.KillTimer
004025BA 6A 00 push 0
004025BC 8BCE mov ecx,esi
004025BE E8 2F5C0000 call <jmp.&MFC42.#6334_CWnd::UpdateData>
004025C3 5E pop esi
004025C4 C3 retn
由于程序有花指令干扰,调试时应注意。
调试到00402583处,直接按Enter,来到00402586处:
00402586 817E 60 CB4BA40D cmp dword ptr ds:[esi+60],0DA44BCB ; 比较ds:[esi+60]处的值与0DA44BCB是否相等
0040258D 74 18 je short Unpacked.004025A7 ; 不等则Over,暴破点6,改为jmp
0040258F 74 03 je short Unpacked.00402594
00402591 75 01 jnz short Unpacked.00402594
00402593 68 8BCEE855 push 55E8CE8B
看一下程序是在什么地方给ds:[esi+60]处赋值的。
修改上面几处暴破点的跳转,来到00402586处,观察窗口提示:
==================================
堆栈 ds:[0012FE20]=0001E240
==================================
命令栏输入:d 0012fe20,对0012fe20处下断:右键--断点--设置硬件访问断点-Byte(不能下"内存访问"断点,否则会异常)
F9运行程序,弹出2个伪注册成功提示窗体,确定后随便更改一下用户名,立即中断:
004027B0 56 push esi
004027B1 8BF1 mov esi,ecx
004027B3 6A 01 push 1
004027B5 E8 385A0000 call <jmp.&MFC42.#6334_CWnd::UpdateData>
004027BA 8B86 30010000 mov eax,dword ptr ds:[esi+130] ; 用户名
004027C0 8378 F8 05 cmp dword ptr ds:[eax-8],5 ; 用户名长度与5比较
004027C4 7C 1E jl short Unpacked.004027E4 ; 小于则跳至004027E4
004027C6 8B8E 2C010000 mov ecx,dword ptr ds:[esi+12C] ; 注册码
004027CC 8379 F8 2D cmp dword ptr ds:[ecx-8],2D ; 注册码长度与0x2D(45)比较
004027D0 75 12 jnz short Unpacked.004027E4 ; 不相等则跳至004027E4
004027D2 8B56 20 mov edx,dword ptr ds:[esi+20]
004027D5 6A 00 push 0
004027D7 6A 0A push 0A
004027D9 6A 01 push 1
004027DB 52 push edx
004027DC FF15 30934000 call dword ptr ds:[<&USER32.SetTimer>] ; USER32.SetTimer
004027E2 5E pop esi
004027E3 C3 retn
004027E4 C746 60 40E20100 mov dword ptr ds:[esi+60],1E240 ; 对ds:[esi+60]处赋值0x1E240
004027EB 5E pop esi ; 下硬件访问断点后在此中断
004027EC C3 retn
由以上代码可知,用户名必须不小于5位,注册码必须为0x2D(45)位,否则对对ds:[esi+60]处赋值0x1E240。
确定0012fe20处的"硬件访问断点"没有删除,继续F9运行程序,来到:
00402637 55 push ebp ; 继续F9运行程序后在此中断
00402638 56 push esi
00402639 8DB3 30010000 lea esi,dword ptr ds:[ebx+130]
0040263F 6A 01 push 1
向上查找,来到004025D0处F2下断,继续F9运行,中断:
004025D0 64:A1 00000000 mov eax,dword ptr fs:[0] ; F2在此下断
004025D6 6A FF push -1
004025D8 68 00874000 push Unpacked.00408700
004025DD 50 push eax
004025DE 64:8925 00000000 mov dword ptr fs:[0],esp
004025E5 83EC 20 sub esp,20
004025E8 53 push ebx
004025E9 57 push edi
004025EA 8BD9 mov ebx,ecx
004025EC 6A 01 push 1
004025EE E8 FF5B0000 call <jmp.&MFC42.#6334_CWnd::UpdateData>
004025F3 8B83 2C010000 mov eax,dword ptr ds:[ebx+12C] ; 注册码
004025F9 8DBB 2C010000 lea edi,dword ptr ds:[ebx+12C]
004025FF 8A08 mov cl,byte ptr ds:[eax] ; 注册码第1位
00402601 80F9 50 cmp cl,50 ; 注册码第1位与0x50('P')比较
00402604 75 2A jnz short Unpacked.00402630
00402606 8078 01 59 cmp byte ptr ds:[eax+1],59 ; 注册码第2位与0x59('Y')比较
0040260A 75 24 jnz short Unpacked.00402630
0040260C 8078 02 47 cmp byte ptr ds:[eax+2],47 ; 注册码第3位与0x47('G')比较
00402610 75 1E jnz short Unpacked.00402630
00402612 8078 03 2D cmp byte ptr ds:[eax+3],2D ; 注册码第4位与0x2D('-')比较
00402616 75 18 jnz short Unpacked.00402630
00402618 C743 60 B30D2F01 mov dword ptr ds:[ebx+60],12F0DB3
0040261F 8A48 2C mov cl,byte ptr ds:[eax+2C] ; 注册码第0x2D(45)位
00402622 80F9 20 cmp cl,20 ; 注册码第45位与0x20(' ')比较
00402625 75 10 jnz short Unpacked.00402637
00402627 C743 60 DA7D720C mov dword ptr ds:[ebx+60],0C727DDA ; 相等则对ds:[esi+60]处赋值0x0C727DDA
0040262E EB 07 jmp short Unpacked.00402637
00402630 C743 60 F1CD3101 mov dword ptr ds:[ebx+60],131CDF1
00402637 55 push ebp ; 在此中断
00402638 56 push esi
00402639 8DB3 30010000 lea esi,dword ptr ds:[ebx+130]
0040263F 6A 01 push 1
00402641 8D4424 30 lea eax,dword ptr ss:[esp+30]
00402645 6A 00 push 0 ; 常数-0
00402647 50 push eax
00402648 8BCE mov ecx,esi
0040264A E8 A95B0000 call <jmp.&MFC42.#4278_CString::Mid> ; 取用户名第1位
0040264F 8BE8 mov ebp,eax
00402651 6A 01 push 1
00402653 8D4C24 2C lea ecx,dword ptr ss:[esp+2C]
00402657 6A 14 push 14 ; 常数-0x14
00402659 51 push ecx
0040265A 8BCF mov ecx,edi
0040265C C74424 44 00000000 mov dword ptr ss:[esp+44],0
00402664 E8 8F5B0000 call <jmp.&MFC42.#4278_CString::Mid> ; 取注册码第21位
00402669 8B6D 00 mov ebp,dword ptr ss:[ebp]
0040266C 8B00 mov eax,dword ptr ds:[eax]
0040266E 55 push ebp
0040266F 8B2D D8924000 mov ebp,dword ptr ds:[<&msvcrt._mbscmp>] ; 比较是否相等
00402675 50 push eax
00402676 C64424 40 01 mov byte ptr ss:[esp+40],1
0040267B FFD5 call ebp
0040267D 83C4 08 add esp,8
00402680 85C0 test eax,eax
00402682 0F85 BB000000 jnz Unpacked.00402743 ; 不等则Over
00402688 6A 01 push 1
0040268A 8D5424 20 lea edx,dword ptr ss:[esp+20]
0040268E 6A 02 push 2 ; 常数-2
00402690 52 push edx
00402691 8BCE mov ecx,esi
00402693 E8 605B0000 call <jmp.&MFC42.#4278_CString::Mid> ; 取用户名第3位
00402698 894424 14 mov dword ptr ss:[esp+14],eax
0040269C 6A 01 push 1
0040269E 8D4424 1C lea eax,dword ptr ss:[esp+1C]
004026A2 6A 19 push 19 ; 常数-0x19
004026A4 50 push eax
004026A5 8BCF mov ecx,edi
004026A7 C64424 44 02 mov byte ptr ss:[esp+44],2
004026AC E8 475B0000 call <jmp.&MFC42.#4278_CString::Mid> ; 取注册码第26位
004026B1 8B4C24 14 mov ecx,dword ptr ss:[esp+14]
004026B5 8B00 mov eax,dword ptr ds:[eax]
004026B7 8B09 mov ecx,dword ptr ds:[ecx]
004026B9 51 push ecx
004026BA 50 push eax
004026BB FFD5 call ebp ; 比较是否相等
004026BD 83C4 08 add esp,8
004026C0 8D4C24 18 lea ecx,dword ptr ss:[esp+18]
004026C4 85C0 test eax,eax
004026C6 0F944424 13 sete byte ptr ss:[esp+13]
004026CB E8 48590000 call <jmp.&MFC42.#800_CString::~CString>
004026D0 8D4C24 1C lea ecx,dword ptr ss:[esp+1C]
004026D4 C64424 38 01 mov byte ptr ss:[esp+38],1
004026D9 E8 3A590000 call <jmp.&MFC42.#800_CString::~CString>
004026DE 8A4424 13 mov al,byte ptr ss:[esp+13]
004026E2 84C0 test al,al
004026E4 74 5D je short Unpacked.00402743 ; 不等则Over
004026E6 6A 01 push 1
004026E8 8D5424 28 lea edx,dword ptr ss:[esp+28]
004026EC 6A 04 push 4 ; 常数-4
004026EE 52 push edx
004026EF 8BCE mov ecx,esi
004026F1 E8 025B0000 call <jmp.&MFC42.#4278_CString::Mid> ; 取用户名第5位
004026F6 8BF0 mov esi,eax
004026F8 6A 01 push 1
004026FA 8D4424 24 lea eax,dword ptr ss:[esp+24]
004026FE 6A 24 push 24 ; 常数-0x24
00402700 50 push eax
00402701 8BCF mov ecx,edi
00402703 C64424 44 03 mov byte ptr ss:[esp+44],3
00402708 E8 EB5A0000 call <jmp.&MFC42.#4278_CString::Mid> ; 取注册码第37位
0040270D 8B36 mov esi,dword ptr ds:[esi]
0040270F 8B00 mov eax,dword ptr ds:[eax]
00402711 56 push esi
00402712 50 push eax
00402713 FFD5 call ebp ; 比较是否相等
00402715 83C4 08 add esp,8
00402718 8D4C24 20 lea ecx,dword ptr ss:[esp+20]
0040271C 85C0 test eax,eax
0040271E 0F944424 13 sete byte ptr ss:[esp+13]
00402723 E8 F0580000 call <jmp.&MFC42.#800_CString::~CString>
00402728 8D4C24 24 lea ecx,dword ptr ss:[esp+24]
0040272C C64424 38 01 mov byte ptr ss:[esp+38],1
00402731 E8 E2580000 call <jmp.&MFC42.#800_CString::~CString>
00402736 8A4424 13 mov al,byte ptr ss:[esp+13]
0040273A C64424 13 01 mov byte ptr ss:[esp+13],1
0040273F 84C0 test al,al
00402741 75 05 jnz short Unpacked.00402748
00402743 C64424 13 00 mov byte ptr ss:[esp+13],0
00402748 8D4C24 28 lea ecx,dword ptr ss:[esp+28]
0040274C C64424 38 00 mov byte ptr ss:[esp+38],0
00402751 E8 C2580000 call <jmp.&MFC42.#800_CString::~CString>
00402756 8D4C24 2C lea ecx,dword ptr ss:[esp+2C]
0040275A C74424 38 FFFFFFFF mov dword ptr ss:[esp+38],-1
00402762 E8 B1580000 call <jmp.&MFC42.#800_CString::~CString>
00402767 8A4424 13 mov al,byte ptr ss:[esp+13]
0040276B 5E pop esi
0040276C 84C0 test al,al
0040276E 8B43 60 mov eax,dword ptr ds:[ebx+60]
00402771 5D pop ebp
00402772 74 07 je short Unpacked.0040277B ; 不等则Over
00402774 05 F1CD3101 add eax,131CDF1 ; 若相等,则EAX=EAX+0x131CDF1
00402779 EB 05 jmp short Unpacked.00402780
0040277B 05 A25D4F00 add eax,4F5DA2
00402780 8BCB mov ecx,ebx
00402782 8943 60 mov dword ptr ds:[ebx+60],eax ; 将EAX的值存入ds:[esi+60]处
00402785 E8 D6580000 call <jmp.&MFC42.#2379_CWnd::Default>
0040278A 6A 00 push 0
0040278C 8BCB mov ecx,ebx
0040278E E8 5F5A0000 call <jmp.&MFC42.#6334_CWnd::UpdateData>
00402793 8B4C24 28 mov ecx,dword ptr ss:[esp+28]
00402797 5F pop edi
00402798 5B pop ebx
00402799 64:890D 00000000 mov dword ptr fs:[0],ecx
004027A0 83C4 2C add esp,2C
004027A3 C2 0400 retn 4
通过以上代码可知:若用户名和注册码之间的关系符合以上要求,则EAX=0x0C727DDA+0x131CDF1=0x0DA44BCB,
然后将EAX的值存入ds:[esi+60]处,那么在00402586处对ds:[esi+60]的值和0x0DA44BCB比较则相等。
-----------------------------------------------------------------------------------------------
【破解总结】
1.程序不太好下断点。通过调试知道,载入程序后,Ctrl+N,
=================================================================
004091F4 UPX0 导入 MFC42.#6334_CWnd::UpdateData
=================================================================
找到后下断,输入注册信息,中断后程序会异常,堆栈提示:
=================================================================
返回到 Unpacked.004027BA 来自 <jmp.&MFC42.#6334_CWnd::UpdateData>
=================================================================
根据堆栈提示也可以找到关键点。
2.用户名必须不小于5位,注册码必须为0x2D(45)位。
3.注册码前4位必须为:"PYG-",最后一位必须为" "(空格)
注册码第21位必须=用户名第1位
注册码第26位必须=用户名第3位
注册码第37位必须=用户名第5位
4.注册码(((第7位 xor 第6位)and 0x7F)*第8位+第5位)除以0x6B,余数必须为0
注册码((第11位 and 第10位)*第12位+第9位)除以0x65,余数必须为8
注册码((第15位 * 第14位)+第16位+第13位)除以0x69,余数必须为0
注册码((第19位 or 第18位)*第20位+第17位)除以0x69,余数必须为0
一组可用注册信息:
====================================================
RegName:hrbxhui
RegCode:PYG-aAj2&m93MRcdKhPHhPzFEbXbfVyH8pTWhuTYo2Qg
====================================================
暴破更改以下位置:
004024A9 jnz Unpacked.004025AE ; jnz====>NOP
004024DF jnz Unpacked.004025AE ; jnz====>NOP
0040251D jnz Unpacked.004025AE ; jnz====>NOP
00402550 jnz short Unpacked.004025AE ; jnz====>NOP
00402581 jnz short Unpacked.004025AE ; jnz====>NOP
0040258D je short Unpacked.004025A7 ; je=====>jmp
【VB注册机源码】
'// 取得随机字符串
Public Function GetRndString(ByVal lngNum As Long) As String
If lngNum <= 0 Then Exit Function
Dim i As Long
Dim intLength As Integer
Const STRINGSOURCE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890"
intLength = Len(STRINGSOURCE) - 1
For i = 1 To lngNum
Randomize
GetRndString = GetRndString & Mid(STRINGSOURCE, Int(Rnd * intLength + 1), 1)
Next
End Function
Private Sub btnGenerate_Click(ByVal ClickReason As b2kClickReason)
Dim RegName As String
Dim RegCode As String
Dim TmpStr As String
Dim Str1 As String
Dim Str2 As String
Dim Str3 As String
Dim Str4 As String
Dim Num1 As Integer
Dim Num2 As Integer
Dim Num3 As Integer
Dim Num4 As Integer
On Error Resume Next
If Len(Text1.Text) < 5 Then
Text2.Text = "用户名长度太短!"
Else
Str1 = " "
Str2 = " "
Str3 = " "
Str4 = " "
RegName = Text1.Text
Do While (Asc(Str1) < &H21 Or Asc(Str2) < &H21 Or Asc(Str3) < &H21 Or Asc(Str4) < &H21)
TmpStr = "PYG-" & GetRndString(16) & Mid(RegName, 1, 1) & _
GetRndString(4) & Mid(RegName, 3, 1) & _
GetRndString(10) & Mid(RegName, 5, 1) & _
GetRndString(7)
Num1 = Asc(Mid(TmpStr, 6, 1))
Num2 = Asc(Mid(TmpStr, 7, 1))
Num3 = Asc(Mid(TmpStr, 8, 1))
Num4 = &H6B - ((((Num1 Xor Num2) And &H7F) * Num3) Mod &H6B)
Str1 = Chr(Num4)
Num1 = Asc(Mid(TmpStr, 10, 1))
Num2 = Asc(Mid(TmpStr, 11, 1))
Num3 = Asc(Mid(TmpStr, 12, 1))
Num4 = &H65 - (((Num1 And Num2) * Num3) Mod &H65) + 8
Str2 = Chr(Num4)
Num1 = Asc(Mid(TmpStr, 14, 1))
Num2 = Asc(Mid(TmpStr, 15, 1))
Num3 = Asc(Mid(TmpStr, 16, 1))
Num4 = &H69 - ((Num1 * Num2 + Num3) Mod &H69)
Str3 = Chr(Num4)
Num1 = Asc(Mid(TmpStr, 18, 1))
Num2 = Asc(Mid(TmpStr, 19, 1))
Num3 = Asc(Mid(TmpStr, 20, 1))
Num4 = &H69 - (((Num1 Or Num2) * Num3) Mod &H69)
Str4 = Chr(Num4)
Loop
RegCode = Mid(TmpStr, 1, 4) & Str1 & _
Mid(TmpStr, 6, 3) & Str2 & _
Mid(TmpStr, 10, 3) & Str3 & _
Mid(TmpStr, 14, 3) & Str4 & Mid(TmpStr, 18, 27) & " "
Text2 = RegCode
End If
End Sub
-----------------------------------------------------------------------------------------------
【版权声明】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
上传的附件: