【文章标题】: Source Insight 3.5的逆向分析
【下载地址】: 自己搜索下载
【使用工具】: vc2008
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教,但写c的程序员用这个的还是很多

-------------------------
离windows开发越来越远了。。。 不过标准c的开发也还好。只是看起来没那么华丽

入口容易断:
004432D9  /$  55            push    ebp
004432DA  |.  8BEC          mov     ebp, esp
004432DC  |.  83EC 20       sub     esp, 20
004432DF  |.  57            push    edi
004432E0  |.  6A 2D         push    2D
004432E2  |.  FF75 08       push    dword ptr [ebp+8]
004432E5  |.  E8 26870D00   call    0051BA10                         ;  spilte -
004432EA  |.  59            pop     ecx
004432EB  |.  59            pop     ecx
004432EC  |.  8945 F8       mov     dword ptr [ebp-8], eax
004432EF  |.  837D F8 00    cmp     dword ptr [ebp-8], 0
004432F3  |.  75 07         jnz     short 004432FC
004432F5  |.  33C0          xor     eax, eax
004432F7  |.  E9 3C010000   jmp     00443438
004432FC  |>  8B55 F8       mov     edx, dword ptr [ebp-8]
004432FF  |.  2B55 08       sub     edx, dword ptr [ebp+8]
00443302  |.  BF A8495A00   mov     edi, 005A49A8                    ;  ASCII "SI3US"
00443307  |.  83C9 FF       or      ecx, FFFFFFFF
。。。。。。。。。。。。。。。
00443420  |.  E8 CD850D00   call    0051B9F2                         ;  
00443425  |.  59            pop     ecx
00443426  |.  3945 FC       cmp     dword ptr [ebp-4], eax
00443429  |.  74 04         je      short 0044342F
0044342B  |.  33C0          xor     eax, eax
0044342D  |.  EB 09         jmp     short 00443438
0044342F  |>  8B45 E4       mov     eax, dword ptr [ebp-1C]
00443432  |.  C600 2D       mov     byte ptr [eax], 2D
00443435  |.  6A 01         push    1
00443437  |.  58            pop     eax
00443438  |>  5F            pop     edi
00443439  |.  C9            leave
0044343A  \.  C2 0400       retn    4


这里就是注册的流程。。。
注册码是xxxxx-xxxxxx-xxxxx形式给出的

注册分3部分 第一部分 是固定的 都是SI3US
004432D9  /$  55            push    ebp
004432DA  |.  8BEC          mov     ebp, esp
004432DC  |.  83EC 20       sub     esp, 20
004432DF  |.  57            push    edi
004432E0  |.  6A 2D         push    2D
004432E2  |.  FF75 08       push    dword ptr [ebp+8]
004432E5  |.  E8 26870D00   call    0051BA10                         ;  spilte -
004432EA  |.  59            pop     ecx
004432EB  |.  59            pop     ecx
004432EC  |.  8945 F8       mov     dword ptr [ebp-8], eax
004432EF  |.  837D F8 00    cmp     dword ptr [ebp-8], 0
004432F3  |.  75 07         jnz     short 004432FC
004432F5  |.  33C0          xor     eax, eax
004432F7  |.  E9 3C010000   jmp     00443438
004432FC  |>  8B55 F8       mov     edx, dword ptr [ebp-8]
004432FF  |.  2B55 08       sub     edx, dword ptr [ebp+8]
00443302  |.  BF A8495A00   mov     edi, 005A49A8                    ;  ASCII "SI3US"
00443307  |.  83C9 FF       or      ecx, FFFFFFFF
0044330A  |.  33C0          xor     eax, eax
0044330C  |.  F2:AE         repne   scas byte ptr es:[edi]
0044330E  |.  F7D1          not     ecx
00443310  |.  49            dec     ecx
00443311  |.  3BD1          cmp     edx, ecx
00443313  |.  74 07         je      short 0044331C
00443315  |.  33C0          xor     eax, eax
00443317  |.  E9 1C010000   jmp     00443438
0044331C  |>  BF A8495A00   mov     edi, 005A49A8                    ;  ASCII "SI3US"
下面是一些检查注册好代码这里有个全局数据
第一部分其实就是 SI3US
-----------------------------------------------------------------------

第2部分 主要部分 前面的检查路过
004433F5  |> \8B45 E4       mov     eax, dword ptr [ebp-1C]
004433F8  |.  40            inc     eax
004433F9  |.  8945 F4       mov     dword ptr [ebp-C], eax
004433FC  |.  8B7D F4       mov     edi, dword ptr [ebp-C]
004433FF  |.  83C9 FF       or      ecx, FFFFFFFF
00443402  |.  33C0          xor     eax, eax
00443404  |.  F2:AE         repne   scas byte ptr es:[edi]
00443406  |.  F7D1          not     ecx
00443408  |.  49            dec     ecx
00443409  |.  83F9 05       cmp     ecx, 5
0044340C  |.  74 04         je      short 00443412
0044340E  |.  33C0          xor     eax, eax
00443410  |.  EB 26         jmp     short 00443438
00443412  |>  FF75 F0       push    dword ptr [ebp-10]
00443415  |.  E8 CB1B0B00   call    004F4FE5    // 这个函数进去

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

004F4FE5  /$  55            push    ebp
004F4FE6  |.  8BEC          mov     ebp, esp
004F4FE8  |.  83EC 10       sub     esp, 10
004F4FEB  |.  FF75 08       push    dword ptr [ebp+8]
004F4FEE  |.  E8 FF690200   call    0051B9F2   // 这个函数进去见下面
004F4FF3  |.  59            pop     ecx
004F4FF4  |.  8945 F0       mov     dword ptr [ebp-10], eax
004F4FF7  |.  8B45 F0       mov     eax, dword ptr [ebp-10]
004F4FFA  |.  8945 FC       mov     dword ptr [ebp-4], eax
004F4FFD  |.  8365 F4 00    and     dword ptr [ebp-C], 0
004F5001  |.  8B45 08       mov     eax, dword ptr [ebp+8]
004F5004  |.  8945 F8       mov     dword ptr [ebp-8], eax
004F5007  |.  EB 07         jmp     short 004F5010
004F5009  |>  8B45 F8       /mov     eax, dword ptr [ebp-8]
004F500C  |.  40            |inc     eax
004F500D  |.  8945 F8       |mov     dword ptr [ebp-8], eax
004F5010  |>  8B45 F8        mov     eax, dword ptr [ebp-8]
004F5013  |.  0FB600        |movzx   eax, byte ptr [eax]
004F5016  |.  85C0          |test    eax, eax
004F5018  |.  74 2C         |je      short 004F5046
004F501A  |.  8B45 F8       |mov     eax, dword ptr [ebp-8]
004F501D  |.  0FB600        |movzx   eax, byte ptr [eax]
004F5020  |.  8B4D F4       |mov     ecx, dword ptr [ebp-C]
004F5023  |.  33048D B0495A>|xor     eax, dword ptr [ecx*4+5A49B0]
004F502A  |.  8B4D FC       |mov     ecx, dword ptr [ebp-4]
004F502D  |.  8D0488        |lea     eax, dword ptr [eax+ecx*4]
004F5030  |.  8945 FC       |mov     dword ptr [ebp-4], eax
004F5033  |.  8B45 F4       |mov     eax, dword ptr [ebp-C]
004F5036  |.  40            |inc     eax
004F5037  |.  8945 F4       |mov     dword ptr [ebp-C], eax
004F503A  |.  837D F4 0A    |cmp     dword ptr [ebp-C], 0A
004F503E  |.  75 04         |jnz     short 004F5044
004F5040  |.  8365 F4 00    |and     dword ptr [ebp-C], 0
004F5044  |>^ EB C3         \jmp     short 004F5009
004F5046  |>  8B45 FC       mov     eax, dword ptr [ebp-4]
004F5049  |.  33D2          xor     edx, edx
004F504B  |.  B9 A0860100   mov     ecx, 186A0
004F5050  |.  F7F1          div     ecx
004F5052  |.  8BC2          mov     eax, edx
004F5054  |.  C9            leave
004F5055  \.  C2 0400       retn    4

。。。。。。。。。。。。。。。。。。
0051B9F2  /$  FF7424 04     push    dword ptr [esp+4]
0051B9F6  |.  E8 6CFFFFFF   call    0051B967  //进去
0051B9FB  |.  59            pop     ecx
0051B9FC  \.  C3            retn
。。。。。。。。。。。。。。。。。。。。。。。。。。。
0051B967  /$  53            push    ebx
0051B968  |.  55            push    ebp
0051B969  |.  56            push    esi
0051B96A  |.  57            push    edi
0051B96B  |.  8B7C24 14     mov     edi, dword ptr [esp+14]
0051B96F  |>  833D 9C9C5B00>/cmp     dword ptr [5B9C9C], 1
0051B976  |.  7E 0F         |jle     short 0051B987
0051B978  |.  0FB607        |movzx   eax, byte ptr [edi]
0051B97B  |.  6A 08         |push    8
0051B97D  |.  50            |push    eax
0051B97E  |.  E8 DB090000   |call    0051C35E
0051B983  |.  59            |pop     ecx
0051B984  |.  59            |pop     ecx
0051B985  |.  EB 0F         |jmp     short 0051B996
0051B987  |>  0FB607        |movzx   eax, byte ptr [edi]
0051B98A  |.  8B0D 909A5B00 |mov     ecx, dword ptr [5B9A90]         ;  Insight3.005B9A9A
0051B990  |.  8A0441        |mov     al, byte ptr [ecx+eax*2]
0051B993  |.  83E0 08       |and     eax, 8
0051B996  |>  85C0          |test    eax, eax
0051B998  |.  74 03         |je      short 0051B99D
0051B99A  |.  47            |inc     edi
0051B99B  |.^ EB D2         \jmp     short 0051B96F
0051B99D  |>  0FB637        movzx   esi, byte ptr [edi]
0051B9A0  |.  47            inc     edi
0051B9A1  |.  83FE 2D       cmp     esi, 2D
0051B9A4  |.  8BEE          mov     ebp, esi
0051B9A6  |.  74 05         je      short 0051B9AD
0051B9A8  |.  83FE 2B       cmp     esi, 2B
0051B9AB  |.  75 04         jnz     short 0051B9B1
0051B9AD  |>  0FB637        movzx   esi, byte ptr [edi]
0051B9B0  |.  47            inc     edi
0051B9B1  |>  33DB          xor     ebx, ebx
0051B9B3  |>  833D 9C9C5B00>/cmp     dword ptr [5B9C9C], 1
0051B9BA  |.  7E 0C         |jle     short 0051B9C8
0051B9BC  |.  6A 04         |push    4
0051B9BE  |.  56            |push    esi
0051B9BF  |.  E8 9A090000   |call    0051C35E // 这里进去看看
0051B9C4  |.  59            |pop     ecx
0051B9C5  |.  59            |pop     ecx
0051B9C6  |.  EB 0B         |jmp     short 0051B9D3
0051B9C8  |>  A1 909A5B00   |mov     eax, dword ptr [5B9A90]
0051B9CD  |.  8A0470        |mov     al, byte ptr [eax+esi*2]
0051B9D0  |.  83E0 04       |and     eax, 4
0051B9D3  |>  85C0          |test    eax, eax
0051B9D5  |.  74 0D         |je      short 0051B9E4
0051B9D7  |.  8D049B        |lea     eax, dword ptr [ebx+ebx*4]
0051B9DA  |.  8D5C46 D0     |lea     ebx, dword ptr [esi+eax*2-30]
0051B9DE  |.  0FB637        |movzx   esi, byte ptr [edi]
0051B9E1  |.  47            |inc     edi
0051B9E2  |.^ EB CF         \jmp     short 0051B9B3
0051B9E4  |>  83FD 2D       cmp     ebp, 2D
0051B9E7  |.  8BC3          mov     eax, ebx
0051B9E9  |.  75 02         jnz     short 0051B9ED
0051B9EB  |.  F7D8          neg     eax
0051B9ED  |>  5F            pop     edi
0051B9EE  |.  5E            pop     esi
0051B9EF  |.  5D            pop     ebp
0051B9F0  |.  5B            pop     ebx
0051B9F1  \.  C3            retn

这里
0051B9B3  |>  833D 9C9C5B00>/cmp     dword ptr [5B9C9C], 1
0051B9BA  |.  7E 0C         |jle     short 0051B9C8
0051B9BC  |.  6A 04         |push    4
0051B9BE  |.  56            |push    esi
0051B9BF  |.  E8 9A090000   |call    0051C35E // 这里

0x5B9C9C的数据一出来就被初始化为 1,而我下了内存访问断点也一直没有改变所有。这里的函数0051C35E就不会被跑到
但是这个函数的功能是支持unicode的注册。里面也是自己处理把unicode转化为多字节码。不过我们没有到时候就空了
。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
第2部分的主要过程。
1)0051B9F2 函数是asctohex 。
2)然后在004F4FE5 里做运算
3)生成一个5为数 和 第3部分把字符变成16进制 数据 做比较
注意里面的几个内存数据 是我们要运算用到的
1)0051B9F2里面
004F5020  |.  8B4D F4       |mov     ecx, dword ptr [ebp-C]
004F5023  |.  33048D B0495A>|xor     eax, dword ptr [ecx*4+5A49B0]
2)004F4FE5
0051B9C8  |>  A1 909A5B00   |mov     eax, dword ptr [5B9A90]
0051B9CD  |.  8A0470        |mov     al, byte ptr [eax+esi*2]
3)还有一个是在字符检查里面 
004433E3  |.  8B4D E8       |mov     ecx, dword ptr [ebp-18]
004433E6  |.  3B0C85 488C53>|cmp     ecx, dword ptr [eax*4+538C48]
------------------------------------------------------------
over


代码 
主要是对它的函数的封装 使用了mfc 主要是为了支持剪切板功能


#include "stdafx.h"
#include "string.h"
#include "stdio.h"
#include <stdlib.h>

DWORD D_5B9C9C = 1;

unsigned char S_5A49B0[]  =   
"\x96\x00\x00\x00\x95\x00\x00\x00\x10\x00\x00\x00\x23\x00\x00\x00\
\x07\x00\x00\x00\x15\x00\x00\x00\x08\x00\x00\x00\x03\x00\x00\x00\
\x10\x00\x00\x00\x11\x00\x00\x00\x63\x3A\x5C\x76\x33\x35\x5C\x73\
\x65\x72\x69\x61\x6C\x2E\x63\x00\x63\x3A\x5C\x76\x33\x35\x5C\x73";

DWORD S_538C48[]=
{
  0x00003039,0x0001E240,0x00039447,0x0005464E,
  0x0600F855,0x0008AA52,0x000A5BF5,0x000980D0,
  0x0B00ADD0,0x000980D0,0x00030448,0x00030379,
  0x0800AF93,0x00030379,0x000007B9,0x000F2F90,
  0x0900FF66,0x0008AA52,0x0000F3A0,0x00030379,
  0x0800AA52,0x000062AF,0x000002AD,0x765C3A63,
  0x5C743533,0x626C6F6F,0x505C786F,0x4978656C,
  0x5C50786F,0x4978656C,0x00632E4C,0x765C3A63,
  0x5C743533,0x626C6F6F,0x505C786F,0x4978656C,
  0x63002E4C,0x765C3A63,0x745C3533,0x626C6F6F,
  0x5C55786F,0x496C6974,0x00632E4C,0x765C3A63,
  0x5C743533,0x626C6F6F,0x555C786F,0x496C6974,
  0x63002E4C,0x765C3A63,0x745C3533,0x626C6F6F,
  0x5C55786F,0x496C6974,0x00632E4C,0x765C3A63,
  0x5C743533,0x626C6F6F,0x535C786F,0x495F6C6C,
  0x63002E4C,0x765C3A63,0x745C3533,0x626C6F6F
};

char* S_5B9A90   = 
"\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\
\x20\x00\x28\x00\x28\x00\x28\x00\x28\x00\x28\x00\x20\x00\x20\x00\
\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\
\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\x20\x00\
\x48\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\
\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\
\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\x84\x00\
\x84\x00\x84\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\
\x10\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x81\x00\x01\x00\
\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\
\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\
\x01\x00\x01\x00\x01\x00\x10\x00\x10\x00\x10\x00\x10\x00\x10\x00\
\x10\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x82\x00\x02\x00\
\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\
\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\x02\x00\
\x02\x00\x02\x00\x02\x00\x10\x00\x10\x00\x10\x00\x10\x00\x20\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00";

char serial[256]={0};

void Get_FirstSerial();
int  Get_004F4FE5(char * serial);
void Check_0051B9F2(char* serial);
int AscToHex_0051B9F2(char* serial);
void ATOH_0051B967(char*);
void G_0051C35E(int ,char*);
int Check(int key);
void Convert_Str(char*);
using namespace std;
int _tmain()
{
  char temp[256] = {0};
  printf("输 入 长 度 6 位 的 字 符 和 数 字 !\n");
  while(gets(temp))
  {
    if(strlen(temp) == 6)  
      break;
  }
  
  Convert_Str(temp);
  Get_FirstSerial();
  int hexkey=AscToHex_0051B9F2(temp);
  if(!Check(hexkey))
  {
    printf(".................\n");
    system("pause");
    return 0;
  }
  int len =strlen(serial);
  sprintf(&serial[len],"%s%s","-",temp);
  int key2 = Get_004F4FE5(temp);
  itoa(key2,temp,10);
  len =strlen(serial);
  sprintf(&serial[len],"%s%s","-",temp);
  printf("%s\n",serial);
  //copy to clipboard
  if(OpenClipboard(NULL))
  {
    HANDLE hClip;
    char *pBuff;
    EmptyClipboard();
    hClip = GlobalAlloc(GMEM_MOVEABLE,strlen(serial) + 1);
    pBuff = (char*)GlobalLock(hClip);
    strcpy(pBuff,serial);
    GlobalUnlock(hClip);
    SetClipboardData(CF_TEXT,hClip);
    CloseClipboard();
  }
  printf("序列号已经复制到剪切板, 按ctrl + v 粘贴!\n");
  system("pause");
  return 0;
}
  void Get_FirstSerial()
  {
    strcpy(serial,"SI3US");
  }
  int Get_004F4FE5(char * serial)
  {
    _asm
    {
        push    dword ptr [ebp+0x8]
        call    AscToHex_0051B9F2
        pop     ecx
        mov     dword ptr [ebp-0x10], eax
        mov     eax, dword ptr [ebp-0x10]
        mov     dword ptr [ebp-0x4], eax
        and     dword ptr [ebp-0xC], 0
        mov     eax, dword ptr [ebp+0x8]
        mov     dword ptr [ebp-0x8], eax
        jmp     short L004F5010
L004F5009:    mov     eax, dword ptr [ebp-0x8]       
        inc     eax                          
        mov     dword ptr [ebp-0x8], eax       
L004F5010:      mov     eax, dword ptr [ebp-0x8]       
        movzx   eax, byte ptr [eax]          
        test    eax, eax                     
        je      short L004F5046               
        mov     eax, dword ptr [ebp-0x8]       
        movzx   eax, byte ptr [eax]          
        mov     ecx, dword ptr [ebp-0xC]       
        xor     eax, dword ptr [S_5A49B0+ecx*4]
        mov     ecx, dword ptr [ebp-0x4]       
        lea     eax, dword ptr [eax+ecx*4]
        mov     dword ptr [ebp-4], eax       
        mov     eax, dword ptr [ebp-0xC]       
        inc     eax                          
        mov     dword ptr [ebp-0xC], eax       
        cmp     dword ptr [ebp-0xC], 0xA        
        jnz     short L004F5044               
        and     dword ptr [ebp-0xC], 0         
L004F5044:      jmp     short L004F5009               
L004F5046:      mov     eax, dword ptr [ebp-0x4]
          xor     edx, edx
        mov     ecx, 0x186A0
        div     ecx
        mov     eax, edx
    }
  }

  int AscToHex_0051B9F2(char* key)
  {
    _asm
    {
      push    dword ptr [ebp+0x8] 
      call    ATOH_0051B967          
      pop     ecx               

    }
  }

  void ATOH_0051B967(char * str)
  {
    _asm
    {
        push    ebx                                                    
        push    ebp                                                    
        push    esi                                                    
        push    edi                                                                                   
        mov     edi, dword ptr [ebp+0x8]                                
L0051B96F:    cmp    D_5B9C9C, 1          
        jle     short L0051B987                 
        movzx   eax, byte ptr [edi]            
        push    0x8                              
        push    eax                            
L0051B97E:    call    G_0051C35E                       
        pop     ecx                            
        pop     ecx                            
        jmp     short L0051B996                 
L0051B987:    movzx   eax, byte ptr [edi]            
        mov     ecx, S_5B9A90        
        mov     al, byte ptr [ecx+eax*2]       
        and     eax, 0x8                         
L0051B996:    test    eax, eax                       
        je      short L0051B99D                 
        inc     edi                            
        jmp     short L0051B96F                 
L0051B99D:      movzx   esi, byte ptr [edi]                                    
        inc     edi                                                    
        cmp     esi, 0x2D                                                
        mov     ebp, esi                                               
        je      short L0051B9AD                                         
        cmp     esi, 0x2B                                                
        jnz     short L0051B9B1                                         
L0051B9AD:    movzx   esi, byte ptr [edi]                                    
        inc     edi                                                    
L0051B9B1:    xor     ebx, ebx                                               
L0051B9B3:    cmp     D_5B9C9C, 1                                 
        jle     short L0051B9C8                                 
        push    4                                              
        push    esi                                            
L0051B9BF:    call    G_0051C35E                                       
        pop     ecx                                            
        pop     ecx                                            
        jmp     short L0051B9D3                                 
L0051B9C8:    mov     eax, S_5B9A90                       
        mov     al, byte ptr [eax+esi*2]                       
        and     eax, 4                                         
L0051B9D3:    test    eax, eax                                       
        je      short L0051B9E4                                 
        lea     eax, dword ptr [ebx+ebx*4]                     
        lea     ebx, dword ptr [esi+eax*2-0x30]                  
        movzx   esi, byte ptr [edi]                            
        inc     edi                                            
        jmp     short L0051B9B3                                 
L0051B9E4:    cmp     ebp, 0x2D                                                
        mov     eax, ebx                                               
        jnz     short L0051B9ED                                         
        neg     eax                                                    
L0051B9ED:    pop     edi                                                    
        pop     esi                                                    
        pop     ebp                                                    
        pop     ebx                                                    
    }
  }

  int Check(int key)
  {
    _asm
    {
      mov     eax ,dword ptr [ebp+0x8]
      mov     dword ptr [ebp-0x18], eax
      and     dword ptr [ebp-0x14], 0
      jmp     short L004433DA                          
L004433D3:  mov     eax, dword ptr [ebp-0x14]
      inc     eax                                     
      mov     dword ptr [ebp-0x14], eax                 
L004433DA:  cmp     dword ptr [ebp-0x14], 0x17   
        jnb     short L004433F5                          
        mov     eax, dword ptr [ebp-0x14]                 
      mov     ecx, dword ptr [ebp-0x18]                 
      cmp     ecx, dword ptr [eax*4+S_538C48] 
      jnz     short L004433F3                          
      xor     eax, eax                                
      jmp     short L00443438  
L004433F3:  jmp     short L004433D3
L004433F5:
L00443438: 

    }
  }
  void G_0051C35E(int ,char*)
  {

  }

  void Convert_Str(char * str)
  {
    char *cp;    
    for ( cp = str ; *cp ; ++cp )
      if ( ('a' <= *cp) && (*cp <= 'z') )
        *cp -= 'a' - 'A';
  }
  
  -------------------------------------------
  谢谢各位大侠路过。。。。。。。。。