hrbx 发表于 2007-6-13 13:36:33

KeyGenMe2007_C简单算法分析+VB注册机源码

【破文标题】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:,bl                   ; 内存访问后中断在这里
77D3216B   8B4D 08            mov ecx,dword ptr ss:
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:,al
004024A5   8378 F8 2D         cmp dword ptr ds:,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:
004024BB   0000               add byte ptr ds:,al                   ; 依次取注册码特定位置的字符运算
004024BD   8A41 06            mov al,byte ptr ds:               ; 第7位
004024C0   8A51 05            mov dl,byte ptr ds:               ; 第6位
004024C3   33C2               xor eax,edx                              ; 第7位 xor 第6位
004024C5   0FBE51 07          movsx edx,byte ptr ds:            ; 第8位
004024C9   83E0 7F            and eax,7F                                 ; (第7位 xor 第6位)and 0x7F
004024CC   0FBE49 04          movsx ecx,byte ptr ds:            ; 第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:,eax
004024F9   0000               add byte ptr ds:,al
004024FB   0FBE41 0A          movsx eax,byte ptr ds:            ; 第11位
004024FF   0FBE51 09          movsx edx,byte ptr ds:            ; 第10位
00402503   23C2               and eax,edx                              ; 第11位 and 第10位
00402505   0FBE51 0B          movsx edx,byte ptr ds:            ; 第12位
00402509   0FBE49 08          movsx ecx,byte ptr ds:            ; 第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:,eax
0040252D   0000               add byte ptr ds:,al
0040252F   0FBE41 0E          movsx eax,byte ptr ds:            ; 第15位
00402533   0FBE51 0D          movsx edx,byte ptr ds:            ; 第14位
00402537   0FAFC2             imul eax,edx                               ; 第15位 * 第14位
0040253A   0FBE51 0F          movsx edx,byte ptr ds:            ; 第16位
0040253E   0FBE49 0C          movsx ecx,byte ptr ds:            ; 第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:
0040255E   0000               add byte ptr ds:,al
00402560   0FBE41 12          movsx eax,byte ptr ds:             ; 第19位
00402564   0FBE51 11          movsx edx,byte ptr ds:             ; 第18位
00402568   0BC2               or eax,edx                                 ; 第19位 or 第18位
0040256A   0FBE51 13          movsx edx,byte ptr ds:             ; 第20位
0040256E   0FBE49 10          movsx ecx,byte ptr ds:             ; 第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:,eax
0040258B   A4               movs byte ptr es:,byte ptr ds:
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:
0040259A   00EB               add bl,ch
0040259C   0185 8BCEE80B      add dword ptr ss:,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:
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:,0DA44BCB         ; 比较ds:处的值与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:处赋值的。
修改上面几处暴破点的跳转,来到00402586处,观察窗口提示:

==================================
堆栈 ds:=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:             ; 用户名
004027C0   8378 F8 05         cmp dword ptr ds:,5               ; 用户名长度与5比较
004027C4   7C 1E            jl short Unpacked.004027E4               ; 小于则跳至004027E4
004027C6   8B8E 2C010000      mov ecx,dword ptr ds:             ; 注册码
004027CC   8379 F8 2D         cmp dword ptr ds:,2D                ; 注册码长度与0x2D(45)比较
004027D0   75 12            jnz short Unpacked.004027E4                ; 不相等则跳至004027E4
004027D2   8B56 20            mov edx,dword ptr ds:
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:,1E240            ; 对ds:处赋值0x1E240
004027EB   5E               pop esi                                    ; 下硬件访问断点后在此中断
004027EC   C3               retn

由以上代码可知,用户名必须不小于5位,注册码必须为0x2D(45)位,否则对对ds:处赋值0x1E240。

确定0012fe20处的"硬件访问断点"没有删除,继续F9运行程序,来到:

00402637   55               push ebp                                 ; 继续F9运行程序后在此中断
00402638   56               push esi
00402639   8DB3 30010000      lea esi,dword ptr ds:
0040263F   6A 01            push 1

向上查找,来到004025D0处F2下断,继续F9运行,中断:

004025D0   64:A1 00000000   mov eax,dword ptr fs:                   ; F2在此下断
004025D6   6A FF            push -1
004025D8   68 00874000      push Unpacked.00408700
004025DD   50               push eax
004025DE   64:8925 00000000   mov dword ptr fs:,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:             ; 注册码
004025F9   8DBB 2C010000      lea edi,dword ptr ds:
004025FF   8A08               mov cl,byte ptr ds:                   ; 注册码第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:,59               ; 注册码第2位与0x59('Y')比较
0040260A   75 24            jnz short Unpacked.00402630
0040260C   8078 02 47         cmp byte ptr ds:,47               ; 注册码第3位与0x47('G')比较
00402610   75 1E            jnz short Unpacked.00402630
00402612   8078 03 2D         cmp byte ptr ds:,2D               ; 注册码第4位与0x2D('-')比较
00402616   75 18            jnz short Unpacked.00402630
00402618   C743 60 B30D2F01   mov dword ptr ds:,12F0DB3
0040261F   8A48 2C            mov cl,byte ptr ds:                ; 注册码第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:,0C727DDA         ; 相等则对ds:处赋值0x0C727DDA
0040262E   EB 07            jmp short Unpacked.00402637
00402630   C743 60 F1CD3101   mov dword ptr ds:,131CDF1
00402637   55               push ebp                                 ; 在此中断
00402638   56               push esi
00402639   8DB3 30010000      lea esi,dword ptr ds:
0040263F   6A 01            push 1                                    
00402641   8D4424 30          lea eax,dword ptr ss:
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:
00402657   6A 14            push 14                                    ; 常数-0x14
00402659   51               push ecx
0040265A   8BCF               mov ecx,edi
0040265C   C74424 44 00000000 mov dword ptr ss:,0
00402664   E8 8F5B0000      call <jmp.&MFC42.#4278_CString::Mid>       ; 取注册码第21位
00402669   8B6D 00            mov ebp,dword ptr ss:
0040266C   8B00               mov eax,dword ptr ds:
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:,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:
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:,eax
0040269C   6A 01            push 1
0040269E   8D4424 1C          lea eax,dword ptr ss:
004026A2   6A 19            push 19                                    ; 常数-0x19
004026A4   50               push eax
004026A5   8BCF               mov ecx,edi
004026A7   C64424 44 02       mov byte ptr ss:,2
004026AC   E8 475B0000      call <jmp.&MFC42.#4278_CString::Mid>       ; 取注册码第26位
004026B1   8B4C24 14          mov ecx,dword ptr ss:
004026B5   8B00               mov eax,dword ptr ds:
004026B7   8B09               mov ecx,dword ptr ds:
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:
004026C4   85C0               test eax,eax
004026C6   0F944424 13      sete byte ptr ss:
004026CB   E8 48590000      call <jmp.&MFC42.#800_CString::~CString>
004026D0   8D4C24 1C          lea ecx,dword ptr ss:
004026D4   C64424 38 01       mov byte ptr ss:,1
004026D9   E8 3A590000      call <jmp.&MFC42.#800_CString::~CString>
004026DE   8A4424 13          mov al,byte ptr ss:
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:
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:
004026FE   6A 24            push 24                                    ; 常数-0x24
00402700   50               push eax
00402701   8BCF               mov ecx,edi
00402703   C64424 44 03       mov byte ptr ss:,3
00402708   E8 EB5A0000      call <jmp.&MFC42.#4278_CString::Mid>       ; 取注册码第37位
0040270D   8B36               mov esi,dword ptr ds:
0040270F   8B00               mov eax,dword ptr ds:
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:
0040271C   85C0               test eax,eax
0040271E   0F944424 13      sete byte ptr ss:
00402723   E8 F0580000      call <jmp.&MFC42.#800_CString::~CString>
00402728   8D4C24 24          lea ecx,dword ptr ss:
0040272C   C64424 38 01       mov byte ptr ss:,1
00402731   E8 E2580000      call <jmp.&MFC42.#800_CString::~CString>
00402736   8A4424 13          mov al,byte ptr ss:
0040273A   C64424 13 01       mov byte ptr ss:,1
0040273F   84C0               test al,al
00402741   75 05            jnz short Unpacked.00402748
00402743   C64424 13 00       mov byte ptr ss:,0
00402748   8D4C24 28          lea ecx,dword ptr ss:
0040274C   C64424 38 00       mov byte ptr ss:,0
00402751   E8 C2580000      call <jmp.&MFC42.#800_CString::~CString>
00402756   8D4C24 2C          lea ecx,dword ptr ss:
0040275A   C74424 38 FFFFFFFF mov dword ptr ss:,-1
00402762   E8 B1580000      call <jmp.&MFC42.#800_CString::~CString>
00402767   8A4424 13          mov al,byte ptr ss:
0040276B   5E               pop esi
0040276C   84C0               test al,al
0040276E   8B43 60            mov eax,dword ptr ds:
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:,eax            ; 将EAX的值存入ds:处
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:
00402797   5F               pop edi
00402798   5B               pop ebx
00402799   64:890D 00000000   mov dword ptr fs:,ecx
004027A0   83C4 2C            add esp,2C
004027A3   C2 0400            retn 4

通过以上代码可知:若用户名和注册码之间的关系符合以上要求,则EAX=0x0C727DDA+0x131CDF1=0x0DA44BCB,
然后将EAX的值存入ds:处,那么在00402586处对ds:的值和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 编辑 ]

wan 发表于 2007-6-13 13:42:40

精彩~学习了!

hrbx 发表于 2007-6-13 13:46:26

RegName:hrbxhui
RegCode:PYG-3sQ4m8DhcQJfP3SvhmhvGbXxitMGorUrhy8vXiig

glts 发表于 2007-6-13 13:49:33

分析得很地道啊!注册机也做得好倩!

飘云 发表于 2007-6-13 13:59:58

Good Job!

playboyjin 发表于 2007-6-13 15:52:57

看来真得和飘云老大说的一样,,考验耐心、、算法分析比较麻烦/:08   


注册机比较好看的。。学习楼主的破文了,。。

网际座山雕 发表于 2007-6-13 22:30:33

这里说一下,我似乎记得idiv :商保存在AX里,余数保存在DX里

楼主在上面说
004024DB   F7F9               idiv ecx                                 ; EAX/ECX
004024DD   85D2               test edx,edx                               ; EDX=商

不知道是不是我记错了.

hrbx 发表于 2007-6-13 23:23:07

原帖由 网际座山雕 于 2007-6-13 22:30 发表 https://www.chinapyg.com/images/common/back.gif
这里说一下,我似乎记得idiv :商保存在AX里,余数保存在DX里

楼主在上面说
004024DB   F7F9               idiv ecx                                 ; EAX/ECX
004024DD   85D2               test...


谢谢 网际座山雕 指出,已更正,谢谢!

bhcjl 发表于 2007-6-14 14:45:36

收藏了,今晚来研究一下

caterpilla 发表于 2007-6-15 09:24:10

强人,高手,学习!
页: [1] 2
查看完整版本: KeyGenMe2007_C简单算法分析+VB注册机源码