首页
论坛
专栏
课程

[原创]Syser Debugger v1.92破解过程

2007-7-29 21:15 23364

[原创]Syser Debugger v1.92破解过程

2007-7-29 21:15
23364
看了这个软件的介绍,感觉挺不错的,我从v1.6版开始接触的,断断续续试过几次,偶尔有点时间就捣鼓一下,
这次能够破解它注册码的算法,完全是靠运气,呵呵^_^

       由于写的比较烂,大家凑合着看吧,其实我自已都看不懂了。

    开始以为它是有应该程序SyserApp.exe中进行注册算法的,于是用od跟了进去,
.text:004025E9                 mov     [ecx], al
.text:004025EB                 jnz     short loc_4025E0
.text:004025ED
.text:004025ED loc_4025ED:                             ; CODE XREF: sub_402580+5Bj
.text:004025ED                 push    0               ; int
.text:004025EF                 push    1               ; dwType
.text:004025F1                 lea     eax, [esp+114h+Data]
.text:004025F5                 push    eax             ; lpData
.text:004025F6                 push    offset aHklmSystemCu_2 ; "HKLM\\SYSTEM\\CurrentControlSet\\Services\\"...// 这里是把注册名写入注册表
.text:004025FB                 call    sub_43F4F0
.text:00402600                 mov     WideCharStr, 0
.text:00402609                 mov     esi, [edi+4B4h]
.text:0040260F                 add     esp, 10h
.text:00402612                 test    esi, esi
.text:00402614                 jnz     short loc_40261B
.text:00402616                 mov     esi, offset WideCharStr
.text:0040261B
.text:0040261B loc_40261B:                             ; CODE XREF: sub_402580+94j
.text:0040261B                 mov     al, [esi]
.text:0040261D                 test    al, al
.text:0040261F                 mov     edx, esi
.text:00402621                 lea     ecx, [esp+10Ch+Data]
.text:00402625                 mov     [esp+10Ch+Data], al
.text:00402629                 pop     esi
.text:0040262A                 jz      short loc_40263D
.text:0040262C                 lea     esp, [esp+0]
.text:00402630
.text:00402630 loc_402630:                             ; CODE XREF: sub_402580+BBj
.text:00402630                 mov     al, [edx+2]
.text:00402633                 add     edx, 2
.text:00402636                 inc     ecx
.text:00402637                 test    al, al
.text:00402639                 mov     [ecx], al
.text:0040263B                 jnz     short loc_402630
.text:0040263D
.text:0040263D loc_40263D:                             ; CODE XREF: sub_402580+AAj
.text:0040263D                 push    0               ; int
.text:0040263F                 push    1               ; dwType
.text:00402641                 lea     ecx, [esp+110h+Data]
.text:00402645                 push    ecx             ; lpData
.text:00402646                 push    offset aHklmSystemCu_3 ; "HKLM\\SYSTEM\\CurrentControlSet\\Services\\"...
//这里把注册码写入注册表,而且注册码的长度必须为16个字节
.text:0040264B                 call    sub_43F4F0
.text:00402650                 mov     ecx, [edi+4]
.text:00402653                 add     esp, 10h
.text:00402656                 push    0
.text:00402658                 push    1
.text:0040265A                 push    offset aNotify  ; "Notify"
.text:0040265F                 push    offset aYouMayNeedToRe ; "You may need to restart syser debugger "...
.text:00402664                 call    sub_425D50//提示重启程序验证。
.text:00402669
.text:00402669 loc_402669:                             ; CODE XREF: sub_402580+2Ej
.text:00402669                 mov     ecx, [esp+108h+var_4]
.text:00402670                 mov     al, 1

  重启后,根本就断不下来,而且也没有找到进行注册校验的地方,于是怀疑在驱动里面做注册码的校验,以前一直在用Ring3级的调试器,驱动从没有调试过,听说softice很强悍,刚好我这边一个同事有一本最早看雪写的一本加密与解密---软件保护技术及完解决方案。刚好上面有softice的用法,于是在虚拟机中安装了,第一次,感觉真的很别扭,之所以我想用syser debugger,是因为它比softice的界面更直观,一开始我也没有要求得到syser的注册码,只想去这个时间限制,网上找了点资料,驱动里面时间查询用的是KeQuerySystemTime这个函数,首先用IDA反汇编syser.sys这个驱动文件,找到了 KeQuerySystemTime所处的代码t
:0001BC59 loc_1BC59:                              ; CODE XREF: sub_1BB28+117j
.text:0001BC59                 push    edi
.text:0001BC5A                 lea     eax, [esi+0C00h]
.text:0001BC60                 push    ebx             ; Handle
.text:0001BC61                 mov     [eax], ebx
.text:0001BC63                 mov     [eax+4], ebx
.text:0001BC66                 push    eax             ; int
.text:0001BC67                 lea     edi, [esi+0BF8h]
.text:0001BC6D                 lea     eax, [ebp+SourceString]
.text:0001BC73                 mov     [edi], ebx
.text:0001BC75                 mov     [edi+4], ebx
.text:0001BC78                 mov     ecx, P
.text:0001BC7E                 push    eax             ; SourceString
.text:0001BC7F                 call    sub_33EDA
.text:0001BC84                 push    edi             ; CurrentTime
.text:0001BC85                 call    ds:KeQuerySystemTime //这里就是了
.text:0001BC8B                 mov     ecx, esi
.text:0001BC8D                 call    sub_1B8EC
.text:0001BC92                 mov     [esi+0C08h], al
.text:0001BC98                 push    offset aWfsuzqf ; "WfsUzqf"//这里的字符减一就是所对应的"verType",注册表中的一个键值
.text:0001BC9D                 lea     eax, [ebp+SourceString]
.text:0001BCA3                 push    eax
.text:0001BCA4                 call    sub_12EEE

好了,开始用softice加载syser.sys驱动了,
bpload syser.sys
让它在加载syser.sys时,断下来
在syser.sys的加载地址加上0x300再加上0x738处下断点,因为这儿就是算注册码的地方。

:bpload syser.sys
:x
NTICE: Load32 START=00400000  SIZE=75000  KPEB=817345E0  MOD=SyserApp
NTICE: Load32 START=77F80000  SIZE=7B000  KPEB=817345E0  MOD=NTDLL
NTICE: Load32 START=72760000  SIZE=46000  KPEB=817345E0  MOD=ddraw
NTICE: Load32 START=78000000  SIZE=46000  KPEB=817345E0  MOD=msvcrt
NTICE: Load32 START=77E60000  SIZE=D5000  KPEB=817345E0  MOD=KERNEL32
NTICE: Load32 START=77DF0000  SIZE=65000  KPEB=817345E0  MOD=USER32
NTICE: Load32 START=77F40000  SIZE=3C000  KPEB=817345E0  MOD=GDI32
NTICE: Load32 START=72800000  SIZE=6000  KPEB=817345E0  MOD=dciman32
NTICE: Load32 START=77D90000  SIZE=5D000  KPEB=817345E0  MOD=ADVAPI32
NTICE: Load32 START=786F0000  SIZE=71000  KPEB=817345E0  MOD=rpcrt4
NTICE: Load32 START=76BC0000  SIZE=73000  KPEB=817345E0  MOD=wininet
NTICE: Load32 START=77C50000  SIZE=4A000  KPEB=817345E0  MOD=shlwapi
NTICE: Load32 START=74FB0000  SIZE=13000  KPEB=817345E0  MOD=ws2_32
NTICE: Load32 START=74FA0000  SIZE=8000  KPEB=817345E0  MOD=ws2help
NTICE: Load32 START=76AF0000  SIZE=3D000  KPEB=817345E0  MOD=COMDLG32
NTICE: Load32 START=77B30000  SIZE=89000  KPEB=817345E0  MOD=COMCTL32
NTICE: Load32 START=78F90000  SIZE=246000  KPEB=817345E0  MOD=SHELL32
NTICE: Load32 START=75E00000  SIZE=1A000  KPEB=817345E0  MOD=imm32
NTICE: Load32 START=6DD30000  SIZE=6000  KPEB=817345E0  MOD=indicdll
NTICE: Load32 START=F801B000  SIZE=116300  KPEB=819E60C0  MOD=SYSER
Break due to BP 00: BPLOAD "syser" L
:bpx f801b300+7c936
:bpx f801b300+7c938
:bl
00)  BPLOAD "syser" L
01)  BPX 0008:F8097C36
02)  BPX 0008:F8097C38
:bc 1
:u f8097c38
:u f8097c38 l 20
0008:F8097C38  CALL     F8097AD0
0008:F8097C3D  MOVZX     ECX,AL
0008:F8097C40  TEST      ECX,ECX
0008:F8097C42  JNZ      F8097C5E
0008:F8097C44  MOV       BYTE PTR [EBP-0092],00
0008:F8097C4B  LEA       ECX,[EBP-0090]
0008:F8097C51  CALL     F801D9E6
0008:F8097C56  MOV       AL,[EBP-0092]
:x
Syser : CPU Numbers = 1
Syser : Host machine is VMWare!
Syser : OSVersion Major 5 Minor 0 Build 2195
Syser : Find SyserBoot DevEx = 819BDD98
Syser : Find SysLang DevEx = 819BDAB8
Syser : Start Init
Syser : Init FileIO!
Syser : Load API 2791 records
Syser : Init Wisp GUI!
Syser : Create Frame Window!
Break due to BP 02: BPX 0008:F8097C38 (ET=1.14 seconds)
//
:u f8097b16 l 100
0008:F8097B16  XOR       ECX,ECX
0008:F8097B18  TEST      ECX,ECX
0008:F8097B1A  JNZ      F8097B0F
0008:F8097B1C  MOV       DWORD PTR [EBP-1C],00000000
0008:F8097B23  JMP      F8097B2E
0008:F8097B25  MOV       EDX,[EBP-1C]//
0008:F8097B28  ADD       EDX,01
0008:F8097B2B  MOV       [EBP-1C],EDX
0008:F8097B2E  LEA       ECX,[EBP-18]
0008:F8097B31  CALL     F801DD00
0008:F8097B36  CMP       [EBP-1C],EAX
0008:F8097B39  JGE      F8097BA1
0008:F8097B3B  MOV       DWORD PTR [EBP-20],00000000
0008:F8097B42  JMP      F8097B4D
0008:F8097B44  MOV       EAX,[EBP-20]
0008:F8097B47  ADD       EAX,01
0008:F8097B4A  MOV       [EBP-20],EAX
0008:F8097B4D  CMP       DWORD PTR [EBP-20],08
0008:F8097B51  JGE      F8097B9F
0008:F8097B53  MOV       ECX,[EBP-1C]
0008:F8097B56  PUSH      ECX
0008:F8097B57  LEA       ECX,[EBP-18]
0008:F8097B5A  CALL     F8097CE0
0008:F8097B5F  MOVSX     EDX,BYTE PTR [EAX]//
0008:F8097B62  MOV       EAX,[EBP-20]//
0008:F8097B65  MOVZX     ECX,BYTE PTR [EAX+EBP-08]//
0008:F8097B6A  XOR       ECX,EDX
0008:F8097B6C  MOV       EDX,[EBP-20]
0008:F8097B6F  MOV       [EDX+EBP-08],CL
0008:F8097B73  MOV       ESI,00000007
0008:F8097B78  SUB       ESI,[EBP-20]
0008:F8097B7B  MOV       EAX,[EBP-1C]
0008:F8097B7E  PUSH      EAX
0008:F8097B7F  LEA       ECX,[EBP-18]
0008:F8097B82  CALL     F8097CE0
0008:F8097B87  MOVSX     ECX,BYTE PTR [EAX]
0008:F8097B8A  MOVZX     EDX,BYTE PTR [ESI+EBP-08]
0008:F8097B8F  ADD       EDX,ECX
0008:F8097B91  MOV       EAX,00000007
0008:F8097B96  SUB       EAX,[EBP-20]
0008:F8097B99  MOV       [EAX+EBP-08],DL
0008:F8097B9D  JMP      F8097B44
0008:F8097B9F  JMP      F8097B25

我把上面的代码简单的说一下,我真的不知道怎么写注释,太乱了,
先是8个字节的固定值
67   2E   F3   C1   CD   A8   45   9B
用注册名的每一个字节与每个数据进行异操作,存入里面,还是用这个注册名与数据另一端的数据相加。也就是注册名的每个字节都要进行8次计算,完了以后这数组中的8个字节转化为16个字节的字符串,这就是注册码了。
算法如下
for(j=0;j<length;j++)
{
      for(i=0;i<8;i++)
      {
          key[i]=key[i]^lic[j];
          key[7-i]=key[7-i]+lic[j];
      }
}

表达的不好意思,请见谅,最后附上注册机完整的源代码。

#include <stdio.h>
#include <string.h>

unsigned char map[]={'0','1','2','3',
                     '4','5','6','7',
                     '8','9','a','b',
                     'c','d','e','f'};
char *hextostring(const char* in,char *out);

main()
{
unsigned char key[]={0x67,0x2e,0xf3,0xc1,0xcd,0xa8,0x45,0x9b};
unsigned char lic[]="vessial";
unsigned char genkey[17]={'\0'};
int i,j;

int length=strlen(lic);
for(j=0;j<length;j++)
{
      for(i=0;i<8;i++)
      {
          key[i]=key[i]^lic[j];
          key[7-i]=key[7-i]+lic[j];
      }
}

   hextostring(key,genkey);
   printf("the key is : %s\n",genkey);
   return 0;
}

char *hextostring(const char* in,char *out)
{
    char *p=in;
    int i;
    for (i=0;i<8;i++)
    {
       if (p!=NULL)
       {
        out[2*i]=map[((*p)>>4)&0x0f];
        out[2*i+1]=map[(*p)&0x0f];
        p++;
       }
   }
}

省掉了很多查找的细节,还望大家见谅,我刚开始用softice调试驱动,没什么经验。
ps: syser debugger 的驱动有点问题,softice调试时经常会蓝屏。

2020安全开发者峰会(2020 SDC)议题征集 中国.北京 7月!

最新回复 (41)
风间仁 19 2007-7-29 21:25
2
0
先顶一个,回头试试。。
vessial(xee) 10 2007-7-30 15:26
3
0
自已顶起
jiyunyan 2007-7-30 15:49
4
0
1.93都出来了! LZ更新一下喔!
vessial(xee) 10 2007-7-30 18:00
5
0
同样适用v 1.93,我试过的。
MIC 2007-7-30 20:30
6
0
网站有1.93的更新说明, 但是下载的文件还是1.92.
壹群老虎 2007-7-30 20:36
7
0
很好的工具。
LZ的厉害!
壹群老虎 2007-7-31 04:29
8
0
注册成功。

楼主厉害!

楼主该不是马甲吧?
vessial(xee) 10 2007-7-31 08:54
9
0
                        马甲,早就注册了这个号,很少在这儿发帖,因为太菜,不好意思发?
fly 85 2007-7-31 09:21
10
0
很不错
谢谢
fonge 5 2007-7-31 09:59
11
0
很早的马甲
frrwp 2007-7-31 11:12
12
0
对俺很有帮助
谢过
罗曼蒂克 2007-7-31 11:20
13
0
这个是只有慢慢的看了!
vessial(xee) 10 2007-7-31 11:47
14
0
要向你学习,呵呵,

对了,我好像就是用的你的flydbg,强啊
xPLK 3 2007-7-31 12:37
15
0
楼主太强大了

佩服佩服。

十分不错哈。
rooky2000 2007-7-31 12:41
16
0
1.93不能注册,刚从网站下的
海风月影 17 2007-7-31 14:13
17
0
果然厉害~~期待syser debug在稳定和注册上都有所提高
太挨球了 2007-7-31 14:15
18
0
你的注册名中是否有大写字母?
rooky2000 2007-7-31 15:00
19
0
有大写字母,难道不成?
太挨球了 2007-7-31 15:05
20
0
因为LZ的注册机有问题,至于怎么解决你也跟跟看
vessial(xee) 10 2007-7-31 15:57
21
0
v1.93确实不支持了,时下跟一下
vessial(xee) 10 2007-7-31 16:01
22
0
绝对不是马甲,欢迎讨论,QQ:35366605

没有别的意思,纯技术角度研究。
壹群老虎 2007-7-31 16:12
23
0
昨天下的 1.93.1900.0840 ,默认的注册名注册成功。

也许作者看到了lz的强文,临时改了算法?
zhiweixp 2007-7-31 16:17
24
0
不错的东西,支持
vessial(xee) 10 2007-7-31 17:28
25
0
较v1.92算法没有变化,变化的是种子数
#include <stdio.h>
#include <string.h>

unsigned char map[]={'0','1','2','3',
                     '4','5','6','7',
                                         '8','9','a','b',
                                         'c','d','e','f'};
char *hextostring(const char* in,char *out);

main()
{
unsigned char key192[]={0x67,0x2e,0xf3,0xc1,0xcd,0xa8,0x45,0x9b};//这里是v1.92的种子
unsigned char key193[]={0x17,0x2e,0x23,0xe1,0xc1,0x98,0x45,0x3a}; //这里是v1.93的种子
unsigned char lic[]="xee";
unsigned char genkey[17]={'\0'};
int i,j;

int length=strlen(lic);
for(j=0;j<length;j++)
{
      for(i=0;i<8;i++)
          {
             key193[i]=key193[i]^lic[j];
             key193[7-i]=key193[7-i]+lic[j];
          }
}

   hextostring(key193,genkey);
   printf("the v1.93 key is : %s\n",genkey);//生成v1.93的注册码
   return 0;
}

char *hextostring(const char* in,char *out)
{
        char *p=in;
        int i;
        for (i=0;i<8;i++)
        {
           if (p!=NULL)
           {
                out[2*i]=map[((*p)>>4)&0x0f];
                out[2*i+1]=map[(*p)&0x0f];
                p++;
           }
   }
}
vessial(xee) 10 2007-7-31 17:31
26
0
ps:还是EnterPrise version的
壹群老虎 2007-7-31 17:31
27
0
支持新鲜的  出炉
太挨球了 2007-7-31 17:54
28
0
随便倒一下先
injoin 2007-7-31 20:19
29
0
怪了~ 重新启动后 还是说是 evaluation version
反而用俄国人的 key generator 是可以的
太挨球了 2007-7-31 20:37
30
0
你的注册名中是否也有大写字母?你可对比下这个生成的的sn和俄国人的keygen生成的是否一致
风间仁 19 2007-7-31 23:33
31
0
学习了,呼呼~
bzhkl 5 2007-8-16 17:24
32
0
SYSER 加一个买VMP就好了 我写的东西都++这个东西
xss 4 2007-8-16 19:32
33
0
找不到keygen,楼主的也不错了
shenhaiyu 3 2007-8-31 17:51
34
0
哈哈,谢谢楼主分享。在下菜鸟一个,就会点编程,看到楼主的注册机实在太简单了,而且在VC++下无法编译,就做了点修改,就算帮楼主完善一下吧,不要见怪哦!
把下面的代码复制到新建的 VC++ Consol 工程中便可直接编译:(呃,删除了附件中编译好的注册机,支持作者 )

//======================================================
#include <conio.h>
#include <stdio.h>
#include <string.h>

unsigned char map[]={'0','1','2','3',
                                         '4','5','6','7',
                                         '8','9','a','b',
                                         'c','d','e','f'};
void hextostring(const char* in,char *out);

void main()
{
        unsigned char key192[]={0x67,0x2e,0xf3,0xc1,0xcd,0xa8,0x45,0x9b};//这里是v1.92的种子
        unsigned char key193[]={0x17,0x2e,0x23,0xe1,0xc1,0x98,0x45,0x3a};//这里是v1.93的种子
        unsigned char lic[8];
        unsigned char genkey[17]={'\0'};

        printf("  Syser Debugger V1.92/V1.93 注册机 by xee.\n\n");
        printf("请输入注册名(注意-只能使用数字与小写字母,且不得超过8位):\n");
        scanf("%8s",lic);//输入用户名
        printf("\n\n");

        int i,j;
        int length=strlen((const char*)lic);
        for(j=0;j<length;j++)
        {
                for(i=0;i<8;i++)
                {
                        key192[i]=key192[i]^lic[j];//计算V1.92的注册码
                        key192[7-i]=key192[7-i]+lic[j];
                        key193[i]=key193[i]^lic[j];//计算V1.93的注册码
                        key193[7-i]=key193[7-i]+lic[j];
                }
        }

        printf("输入的用户名为: %s\n",lic);
        hextostring((char*)key192,(char*)genkey);
        printf("1.92版本注册码: %s\n",genkey);//生成V1.93的注册码
        hextostring((char*)key193,(char*)genkey);
        printf("1.93版本注册码: %s\n\n",genkey);//生成V1.93的注册码
        getch();
}

void hextostring(const char* in,char *out)
{
        const char *p=in;
        int i;
        for (i=0;i<8;i++)
        {
                if (p!=NULL)
                {
                        out[2*i]=map[((*p)>>4)&0x0f];
                        out[2*i+1]=map[(*p)&0x0f];
                        p++;
                }
        }
}
//======================================================
backboy 2007-9-1 00:15
35
0
楼主历害,好贴别沉了!
zlq112000 2007-9-5 19:18
36
0
谢谢,我也下了syser了,有人会用它下消息断点吗?里面有个bug,看PE结构时的下拉菜单看不完,.......
ufospace 2007-9-15 14:38
37
0
多谢xee
刚下载的Version 1.93.1900.0840  Build Date Jul 28 2007!注册成功了。
hejg 2007-9-15 17:12
38
0
很不错
谢谢
yijun8354 12 2007-9-15 18:06
39
0
不错,支持哈~~~
为你钟情 2008-2-22 10:23
40
0
我靠太夸张了
我怎么连在哪注册都找不到
windtrace 2008-2-22 20:32
41
0
一看到softice就头疼,从没用过
kcynic 2008-2-23 09:17
42
0
学习中,
只是SoftICE一直都没能用上
游客
登录 | 注册 方可回帖
返回