- UID
- 346
注册时间2005-3-21
阅读权限30
最后登录1970-1-1
龙战于野
TA的每日心情 | 奋斗 2016-10-21 20:30 |
---|
签到天数: 1 天 [LV.1]初来乍到
|
【破文标题】KeyGenMe2007_C简单算法分析+VB注册机源码
【破解作者】hrbx
【作者主页】hrbx.ys168.com
【作者邮箱】[email protected]
【破解平台】WinXP
【使用工具】flyOD1.10、Peid
【破解日期】2007-06-13
【软件名称】KeyGenMe2007_C
【软件大小】67KB
【下载地址】https://www.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
- -----------------------------------------------------------------------------------------------
- 【版权声明】本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!
复制代码
[ 本帖最后由 hrbx 于 2007-6-13 23:22 编辑 ] |
|