qifeon 发表于 2008-8-15 21:52:57

2nd Speech Center3.30 算法分析

【文章标题】: 2nd Speech Center3.30 算法分析
【文章作者】: qifeon
【软件名称】: 2nd Speech Center
【下载地址】: http://www.onlinedown.net/soft/25446.htm
【加壳方式】: ASPack
【保护方式】: 壳+注册码
【编写语言】: English
【使用工具】: od,peid
【软件介绍】: 将任何文本转换成声音或MP3/WAVE音频文件的工具。2n
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
一、调试分析过程

peid查壳为ASPack 2.12 -> Alexey Solodovnikov,懒得脱了,带壳调试。od载入,输入“qifeon,123456”,出现错误提示。F12暂停。观察调用堆栈

************************************************************************************************************************************************************

调用堆栈:   主线程
地址       堆栈       函数过程 / 参数                     调用来自                      结构
0012F614   77D19418   包含ntdll.KiFastSystemCallRet         user32.77D19416               0012F648
0012F618   77D2DBA8   user32.WaitMessage                  user32.77D2DBA3               0012F648
0012F64C   77D2593F   user32.77D2DA19                     user32.77D2593A               0012F648
0012F674   77D3A91E   user32.77D25889                     user32.77D3A919               0012F670
0012F934   77D3A284   user32.SoftModalMessageBox            user32.77D3A27F               0012F930
0012FA84   77D661D3   user32.77D3A10F                     user32.77D661CE               0012FA80
0012FADC   77D66278   user32.MessageBoxTimeoutW             user32.77D66273               0012FAD8
0012FB10   77D50617   ? user32.MessageBoxTimeoutA         user32.77D50612               0012FB0C
0012FB30   77D505CF   ? user32.MessageBoxExA                user32.77D505CA               0012FB2C
0012FB34   000A0340   hOwner = 000A0340 ('2nd Speech Cen
0012FB38   00601E3C   Text = "Registered Code Error!"
0012FB3C   010963A8   Title = "iisc"
0012FB40   00000010   Style = MB_OK|MB_ICONHAND|MB_APPLM
0012FB44   00000000   LanguageID = 0 (LANG_NEUTRAL)
0012FB4C   004A5F0F   ? iisc.00408048                     iisc.004A5F0A               0012FB48
0012FB50   000A0340   hOwner = 000A0340 ('2nd Speech Cen
0012FB54   00601E3C   Text = "Registered Code Error!"
0012FB58   010963A8   Title = "iisc"
0012FB5C   00000010   Style = MB_OK|MB_ICONHAND|MB_APPLM
0012FB7C   004A5F3E   ? iisc.004A5EC0                     iisc.004A5F39               0012FB78
0012FB80   00601D3B   iisc.004A5F34                         iisc.00601D36               0012FBB0

*********************************************************************************************************************************************************************

双击 iisc.00601D36返回后向上找到段首

**********************************************************************************************************************************************************************

00601C69    55            push    ebp                            段首
00601C6A    68 6B1D6000   push    00601D6B
00601C6F    64:FF30         push    dword ptr fs:
00601C72    64:8920         mov   dword ptr fs:, esp
00601C75    8D55 F4         lea   edx, dword ptr
00601C78    8B83 1C030000   mov   eax, dword ptr
00601C7E    E8 3940EFFF   call    004F5CBC
00601C83    8B45 F4         mov   eax, dword ptr
00601C86    8D55 FC         lea   edx, dword ptr
00601C89    E8 1E7DE0FF   call    004099AC
00601C8E    8D55 F0         lea   edx, dword ptr
00601C91    8B83 20030000   mov   eax, dword ptr
00601C97    E8 2040EFFF   call    004F5CBC
00601C9C    8B45 F0         mov   eax, dword ptr           ; 试炼码
00601C9F    8D55 F8         lea   edx, dword ptr
00601CA2    E8 057DE0FF   call    004099AC
00601CA7    837D FC 00      cmp   dword ptr , 0             ; 用户名是否为空?
00601CAB    0F84 80000000   je      00601D31
00601CB1    837D F8 00      cmp   dword ptr , 0             ; 试炼码是否为空?
00601CB5    74 7A         je      short 00601D31
00601CB7    8D45 EC         lea   eax, dword ptr
00601CBA    50            push    eax
00601CBB    B9 801D6000   mov   ecx, 00601D80
00601CC0    BA 8C1D6000   mov   edx, 00601D8C                  ; ASCII "2nd Speech Center"
00601CC5    8B45 FC         mov   eax, dword ptr
00601CC8    E8 4BFAFFFF   call    00601718                         ; 算法CALL,待会进入
00601CCD    8B55 EC         mov   edx, dword ptr           ; 真正注册码
00601CD0    8B45 F8         mov   eax, dword ptr          ; 试炼码
00601CD3    E8 E033E0FF   call    004050B8                         ; 比较
00601CD8    75 57         jnz   short 00601D31                   ; 关键跳转
00601CDA    C605 40BD6100 0>mov   byte ptr , 1
00601CE1    8B4D FC         mov   ecx, dword ptr
00601CE4    BA A81D6000   mov   edx, 00601DA8                  ; ASCII "RegName"
00601CE9    B8 B81D6000   mov   eax, 00601DB8                  ; ASCII "\Software\Microsoft\02k\JJTD4"
00601CEE    E8 5946EAFF   call    004A634C
00601CF3    8B45 FC         mov   eax, dword ptr
00601CF6    8945 E4         mov   dword ptr , eax
00601CF9    C645 E8 0B      mov   byte ptr , 0B
00601CFD    8D55 E4         lea   edx, dword ptr
00601D00    33C9            xor   ecx, ecx
00601D02    B8 E01D6000   mov   eax, 00601DE0                  ; ASCII "Congratulations! ",CR,LF,"This software is licensed to %s.",CR,LF,"Thanks for your supporting."
00601D07    E8 5841EAFF   call    004A5E64
00601D0C    8BC3            mov   eax, ebx
00601D0E    E8 81DBE8FF   call    0048F894
00601D13    A1 8C866100   mov   eax, dword ptr
00601D18    8338 00         cmp   dword ptr , 0
00601D1B    74 1E         je      short 00601D3B
00601D1D    A1 8C866100   mov   eax, dword ptr
00601D22    8B00            mov   eax, dword ptr
00601D24    8A15 40BD6100   mov   dl, byte ptr
00601D2A    E8 C1A20000   call    0060BFF0
00601D2F    EB 0A         jmp   short 00601D3B
00601D31    B8 3C1E6000   mov   eax, 00601E3C                  ; ASCII "Registered Code Error!"
00601D36    E8 F941EAFF   call    004A5F34                              返回处

***************************************************************************************************************************************************************************

段首下硬件断点,重载,输入试炼码,断下后单步进入算法call    00601718

****************************************************************************************************************************************************************************

00601718    55            push    ebp
00601719    8BEC            mov   ebp, esp
0060171B    51            push    ecx
0060171C    B9 06000000   mov   ecx, 6
00601721    6A 00         push    0
00601723    6A 00         push    0
00601725    49            dec   ecx
00601726^ 75 F9         jnz   short 00601721
00601728    874D FC         xchg    dword ptr , ecx
0060172B    53            push    ebx
0060172C    56            push    esi
0060172D    57            push    edi
0060172E    894D F4         mov   dword ptr , ecx
00601731    8955 F8         mov   dword ptr , edx
00601734    8945 FC         mov   dword ptr , eax
00601737    8B45 FC         mov   eax, dword ptr
0060173A    E8 1D3AE0FF   call    0040515C
0060173F    8B45 F8         mov   eax, dword ptr
00601742    E8 153AE0FF   call    0040515C
00601747    8B45 F4         mov   eax, dword ptr
0060174A    E8 0D3AE0FF   call    0040515C
0060174F    33C0            xor   eax, eax
00601751    55            push    ebp
00601752    68 8E186000   push    0060188E
00601757    64:FF30         push    dword ptr fs:
0060175A    64:8920         mov   dword ptr fs:, esp
0060175D    33C0            xor   eax, eax
0060175F    55            push    ebp
00601760    68 37186000   push    00601837
00601765    64:FF30         push    dword ptr fs:
00601768    64:8920         mov   dword ptr fs:, esp
0060176B    8D55 E8         lea   edx, dword ptr
0060176E    8B45 F8         mov   eax, dword ptr
00601771    E8 3682E0FF   call    004099AC
00601776    8B45 E8         mov   eax, dword ptr           ; 程序名字符串地址
00601779    B1 01         mov   cl, 1                            ; cl=1
0060177B    BA 6E740300   mov   edx, 3746E                     ; edx=0x3746E
00601780    E8 87FEFFFF   call    0060160C                         ; 算法,待会进入
00601785    8BD8            mov   ebx, eax                         ; 程序名字符串sn1计算取得值
00601787    8D55 E4         lea   edx, dword ptr
0060178A    8B45 F4         mov   eax, dword ptr
0060178D    E8 1A82E0FF   call    004099AC
00601792    8B45 E4         mov   eax, dword ptr           ; 固定字符'3"(猜测是版本?)的地址
00601795    33C9            xor   ecx, ecx                         ; 使cl=0
00601797    BA 01EB0B00   mov   edx, 0BEB01                      ; 参与计算数0xBEB01
0060179C    E8 6BFEFFFF   call    0060160C                         ; 算法
006017A1    8BF0            mov   esi, eax                         ; "3"运算后的值设为sn2
006017A3    8D55 E0         lea   edx, dword ptr
006017A6    8B45 FC         mov   eax, dword ptr
006017A9    E8 FE81E0FF   call    004099AC
006017AE    8B45 E0         mov   eax, dword ptr           ; 用户名地址
006017B1    B1 01         mov   cl, 1                            ; cl=1
006017B3    8BD3            mov   edx, ebx                         ; sn1参与计算
006017B5    E8 52FEFFFF   call    0060160C                         ; 关键
006017BA    8BD8            mov   ebx, eax                         ; 取得值sn3
006017BC    8D55 DC         lea   edx, dword ptr
006017BF    8B45 FC         mov   eax, dword ptr
006017C2    E8 E581E0FF   call    004099AC
006017C7    8B45 DC         mov   eax, dword ptr           ; 用户名地址
006017CA    33C9            xor   ecx, ecx                         ; cl=0
006017CC    8BD6            mov   edx, esi                         ; sn2参与计算
006017CE    E8 39FEFFFF   call    0060160C                         ; 关键
006017D3    8BF0            mov   esi, eax                         ; 取得值sn4
006017D5    8D45 F0         lea   eax, dword ptr
006017D8    50            push    eax
006017D9    8D55 D8         lea   edx, dword ptr
006017DC    8BC3            mov   eax, ebx
006017DE    E8 2586E0FF   call    00409E08
006017E3    8B45 D8         mov   eax, dword ptr           ; sn3由整数转化为字符串reg
006017E6    B9 05000000   mov   ecx, 5
006017EB    BA 01000000   mov   edx, 1
006017F0    E8 D739E0FF   call    004051CC                         ; 取reg前5位后得到字符串reg1
006017F5    8D45 EC         lea   eax, dword ptr
006017F8    50            push    eax
006017F9    8D55 D4         lea   edx, dword ptr
006017FC    8BC6            mov   eax, esi
006017FE    E8 0586E0FF   call    00409E08
00601803    8B45 D4         mov   eax, dword ptr           ; sn4由整数转化为字符串code
00601806    B9 05000000   mov   ecx, 5
0060180B    BA 02000000   mov   edx, 2
00601810    E8 B739E0FF   call    004051CC
00601815    FF75 EC         push    dword ptr                ; 取字符串code后5位得到字符串code1
00601818    68 A8186000   push    006018A8
0060181D    FF75 F0         push    dword ptr
00601820    8B45 08         mov   eax, dword ptr
00601823    BA 03000000   mov   edx, 3
00601828    E8 FF37E0FF   call    0040502C
0060182D    33C0            xor   eax, eax
0060182F    5A            pop   edx
00601830    59            pop   ecx
00601831    59            pop   ecx
00601832    64:8910         mov   dword ptr fs:, edx
00601835    EB 3C         jmp   short 00601873
00601837^ E9 C82AE0FF   jmp   00404304
0060183C    8D55 D0         lea   edx, dword ptr
0060183F    B8 6E740300   mov   eax, 3746E
00601844    E8 BF85E0FF   call    00409E08
00601849    FF75 D0         push    dword ptr
0060184C    68 A8186000   push    006018A8
00601851    8D55 CC         lea   edx, dword ptr
00601854    B8 01EB0B00   mov   eax, 0BEB01
00601859    E8 AA85E0FF   call    00409E08
0060185E    FF75 CC         push    dword ptr
00601861    8B45 08         mov   eax, dword ptr
00601864    BA 03000000   mov   edx, 3
00601869    E8 BE37E0FF   call    0040502C
0060186E    E8 F92DE0FF   call    0040466C
00601873    33C0            xor   eax, eax
00601875    5A            pop   edx
00601876    59            pop   ecx
00601877    59            pop   ecx
00601878    64:8910         mov   dword ptr fs:, edx
0060187B    68 95186000   push    00601895
00601880    8D45 CC         lea   eax, dword ptr
00601883    BA 0D000000   mov   edx, 0D
00601888    E8 3334E0FF   call    00404CC0                         ; "-"连接字符串code1和reg1


*******************************************************************************************************************************************************

   00601780   处进入算法   call    0060160C

*******************************************************************************************************************************************************

0060160C    55            push    ebp
0060160D    8BEC            mov   ebp, esp
0060160F    83C4 F4         add   esp, -0C
00601612    53            push    ebx
00601613    56            push    esi
00601614    57            push    edi
00601615    884D F7         mov   byte ptr , cl             ; cl值赋予 ebp-9
00601618    8955 F8         mov   dword ptr , edx         ; 参与计算数保存于ebp-8
0060161B    8945 FC         mov   dword ptr , eax         ; 程序名字符串地址保存于ebp-4
0060161E    8B45 FC         mov   eax, dword ptr
00601621    E8 363BE0FF   call    0040515C
00601626    33C0            xor   eax, eax
00601628    55            push    ebp
00601629    68 08176000   push    00601708
0060162E    64:FF30         push    dword ptr fs:
00601631    64:8920         mov   dword ptr fs:, esp
00601634    33C0            xor   eax, eax
00601636    55            push    ebp
00601637    68 D6166000   push    006016D6
0060163C    64:FF30         push    dword ptr fs:
0060163F    64:8920         mov   dword ptr fs:, esp
00601642    33DB            xor   ebx, ebx
00601644    837D FC 00      cmp   dword ptr , 0
00601648    74 70         je      short 006016BA
0060164A    8B45 FC         mov   eax, dword ptr
0060164D    E8 1A39E0FF   call    00404F6C
00601652    8BF0            mov   esi, eax                         ; 字符串长度
00601654    85F6            test    esi, esi
00601656    7E 3B         jle   short 00601693
00601658    B9 01000000   mov   ecx, 1
0060165D    807D F7 00      cmp   byte ptr , 0            ; 这里由,即cl是否为0,进入2种不同算法saunfa1和suanfa2
00601661    74 15         je      short 00601678                      第一种算法suanfa1开始
00601663    8BC1            mov   eax, ecx
00601665    F7E8            imul    eax                              ; eax自乘
00601667    03C0            add   eax, eax                         ; eax自加
00601669    40            inc   eax                              ; eax增1
0060166A    8B55 FC         mov   edx, dword ptr          ; 字符串地址送入edx
0060166D    0FB6540A FF   movzx   edx, byte ptr       ; 字符串逐位扩展送入edx
00601672    F7EA            imul    edx                              ; eax=eax*edx
00601674    03D8            add   ebx, eax                         ; ebx=ebx+eax,循环之和sum保存于ebx
00601676    EB 17         jmp   short 0060168F
00601678    8B45 FC         mov   eax, dword ptr          ; 第二种算法saunfa2开始
0060167B    0FB64408 FF   movzx   eax, byte ptr       ; 字符串逐位扩展送入eax
00601680    F7E8            imul    eax                              ; eax自乘
00601682    0FBFC0          movsx   eax, ax
00601685    BF A0860100   mov   edi, 186A0                     ; edi=186A0h
0060168A    99            cdq
0060168B    F7FF            idiv    edi                              ; eax/edi
0060168D    03DA            add   ebx, edx                            循环之和sum保存于ebx
0060168F    41            inc   ecx                              ; ecx增1,控制取字符串字符的位置
00601690    4E            dec   esi                              ; esi减1,控制循环次数
00601691^ 75 CA         jnz   short 0060165D
00601693    8BC3            mov   eax, ebx                         ; 字符串逐位计算后的值sum,送入eax
00601695    B9 10270000   mov   ecx, 2710                        ; ecx=2710h
0060169A    99            cdq                                    ; edx清零
0060169B    F7F9            idiv    ecx                              ; eax/ecx,商保存于eax,余数保存在edx
0060169D    8BC2            mov   eax, edx                         ; 余数送入eax
0060169F    F7E8            imul    eax                              ; eax自乘
006016A1    0345 F8         add   eax, dword ptr          ; eax=eax+
006016A4    8BD8            mov   ebx, eax
006016A6    8BC3            mov   eax, ebx
006016A8    B9 A0860100   mov   ecx, 186A0                     ; ecx=186A0h
006016AD    99            cdq                                    ; edx清零
006016AE    F7F9            idiv    ecx                              ; eax/ecx
006016B0    81C2 A0860100   add   edx, 186A0                     ; edx=余数+186A0h
006016B6    8BDA            mov   ebx, edx                         ; 上面计算值sn送入ebx
006016B8    EB 12         jmp   short 006016CC
006016BA    807D F7 00      cmp   byte ptr , 0
006016BE    74 07         je      short 006016C7
006016C0    BB 6E740300   mov   ebx, 3746E
006016C5    EB 05         jmp   short 006016CC
006016C7    BB 01EB0B00   mov   ebx, 0BEB01
006016CC    33C0            xor   eax, eax
006016CE    5A            pop   edx
006016CF    59            pop   ecx
006016D0    59            pop   ecx
006016D1    64:8910         mov   dword ptr fs:, edx
006016D4    EB 1C         jmp   short 006016F2
006016D6^ E9 292CE0FF   jmp   00404304
006016DB    807D F7 00      cmp   byte ptr , 0
006016DF    74 07         je      short 006016E8
006016E1    BB 6E740300   mov   ebx, 3746E
006016E6    EB 05         jmp   short 006016ED
006016E8    BB 01EB0B00   mov   ebx, 0BEB01
006016ED    E8 7A2FE0FF   call    0040466C
006016F2    33C0            xor   eax, eax
006016F4    5A            pop   edx
006016F5    59            pop   ecx
006016F6    59            pop   ecx
006016F7    64:8910         mov   dword ptr fs:, edx
006016FA    68 0F176000   push    0060170F
006016FF    8D45 FC         lea   eax, dword ptr
00601702    E8 9535E0FF   call    00404C9C
00601707    C3            retn
00601708^ E9 AB2EE0FF   jmp   004045B8
0060170D^ EB F0         jmp   short 006016FF
0060170F    8BC3            mov   eax, ebx                         ; sn又传入eax
00601711    5F            pop   edi
00601712    5E            pop   esi
00601713    5B            pop   ebx
00601714    8BE5            mov   esp, ebp
00601716    5D            pop   ebp
00601717    C3            retn

***********************************************************************************************************************************************************

二、算法总结

注册码由2部分连接而成,每一部分经过2次运算而成。4次运算调用同一个算法CALL(call    0060160C ),这个算法CALL内部由传入参数cl值的不同,又分为2种算法,suanfa1和suanfa2

——————————————————————————————————
————————————————————————————------------
1、注册码第1部分

a、固定字符"3"由suanfa2运算后的值设为sn2(cl=0,参与计算数0xBEB01);

b、用户名name,由算法2suanfa2计算得到sn4( cl=0,参与计算数sn2);

c、 sn4转化为字符串code;

d、取code后5位后得到字符串code1,即注册码第2部分;
———————————————————————————————————

2、注册码第2部分

——————————————————————————————————
a、程序名“2nd Speech Cente'由suanfa1计算得到sn1(cl=1,参与计算数为0x3746E);

b、用户名name,由算法1suanfa1计算得到sn3( cl=1,参与计算数为sn1);

c、sn3转化为字符串reg;

d、取reg前5位后得到字符串reg1,即注册码第2部分;
——————————————————————————————————————

3、第1和第2部分由”-“连接得到对应用户名的注册码。


为缩短篇幅suanfa1和suanfa2可以参照注释和下面注册机部分。


三、c 语言注册机源代码

#include "stdio.h"
#include "string.h"
int suanfa1(string, c )
char string;
{int a,b,sn,sum=0,len,i;
        len=strlen(string);
        for (i=0;i<len;i++)
        {   
                a=(i+1)*(i+1)*2+1;
                sum=sum+a*(*(string+i));
                b=(sum % 10000)*(sum % 10000 )+c;
                sn=(b % 100000)+100000;
                               
                }
       
        return(sn);
}

int suanfa2(string, c )
char string;
{
        int a,b,sn,sum=0,len,i;
        len=strlen(string);
       for (i=0;i<len;i++)
       {
               a=(*(string+i))*(*(string+i));
               sum=sum+a % 100000;
               b=(sum % 10000)*(sum % 10000 )+c;
                sn=(b % 100000)+100000;
                             
       }
       
        return(sn);       
       
        }

void main()
{
        int sn1,sn2,sn3,sn4,constant,dd;
        char chengxu="2nd Speech Center";
        char gd="3";
        char name;
        char reg="\0";
        char code="\0";
        char reg1="\0";
        char code1="\0";
        printf("请输入用户名:");
        scanf("%s",name);
        constant=226414;
        dd=781057;
        sn1= suanfa1( chengxu,constant);
        sn2=suanfa2(gd,dd);
        sn3= suanfa1( name,sn1);
        sn4=suanfa2( name,sn2);
        itoa(sn4, code, 10);
        itoa(sn3, reg, 10);
      strncpy(reg1,reg,5);
      strncpy(code1,code+1,5);
      strcat(code1,"-");
      strcat(code1,reg1);
        printf("注册码是:");
        printf("%s",code1);
        system("PAUSE");
       
      
}


--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2008年08月15日 21:59:20

[ 本帖最后由 qifeon 于 2008-8-15 21:59 编辑 ]
页: [1]
查看完整版本: 2nd Speech Center3.30 算法分析