解密石器时代8.0 客户端与服务器call sa_8001s.0048CD60 分析,石器时代发布网,石器技术交流站!
解密石器时代8.0 客户端与服务器call sa_8001s.0048CD60 分析
0048D322  |.  E8 39FAFFFF   call sa_8001s.0048CD60 分析                  


0048CD65  |.  33DB          xor ebx,ebx
0048CD85  |.  8B6C24 20     mov ebp,dword ptr ss:[esp+0x20]            ;  把钥匙指针传递

0048CDBB  |>  8B4424 24     /mov eax,dword ptr ss:[esp+0x24]         ;  载入循环数,循环首
0048CDBF  |.  B9 03000000   |mov ecx,0x3                                      ;  循环常量3
0048CDC4  |.  99            |cdq
0048CDC5  |.  F7F9          |idiv ecx                                                 ;  eax求余3
0048CDC7  |.  8B4424 18     |mov eax,dword ptr ss:[esp+0x18]           ;  载入[0018F84C]的指针
0048CDCB  |.  8B4C24 24     |mov ecx,dword ptr ss:[esp+0x24]           ;  载入循环数
0048CDCF  |.  8A0401        |mov al,byte ptr ds:[ecx+eax]                   ;  取[0018F84C]中数据
0048CDD2  |.  25 FF000000   |and eax,0xFF                                        ;  留下8位
0048CDD7  |.  8D0C12        |lea ecx,dword ptr ds:[edx+edx]                ;
0048CDDA  |.  D3E0          |shl eax,cl                                               ;  左移 余数双倍
0048CDDC  |.  8A0C2F        |mov cl,byte ptr ds:[edi+ebp]                    ;  取钥匙         ID+网址
0048CDDF  |.  0BF0          |or esi,eax                                                 ;  或一下
0048CDE1  |.  8BC6          |mov eax,esi                                            ;  用或结果来做参数
0048CDE3  |.  2BC1          |sub eax,ecx                                            ;  参数加上钥匙顺位
0048CDE5  |.  8B4C24 20     |mov ecx,dword ptr ss:[esp+0x20]             ;  传递加密ascii指针[004d70e4]
0048CDE9  |.  83E0 3F       |and eax,0x3F                                         ;  保留6位
0048CDEC  |.  43            |inc ebx                                                    ;  写入位序数
0048CDED  |.  47            |inc edi                                                    ;  钥匙序数
0048CDEE  |.  8A0C08        |mov cl,byte ptr ds:[eax+ecx]                    ;  偏移 加密ascii
0048CDF1  |.  8B4424 14     |mov eax,dword ptr ss:[esp+0x14]            ;  传递写入位置指针[0017B300]
0048CDF5  |.  884C03 FF     |mov byte ptr ds:[ebx+eax-0x1],cl             ;  写入[0017b300+?]

0048CE02  |>  C1EE 06       |shr esi,0x6                                           ;  右移6位
0048CE05  |.  83FA 02       |cmp edx,0x2                                          ;  第0次及每个第1,3次循环跳转
0048CE08  |.  75 20         |jnz short sa_8001s.0048CE2A

0048CE0A  |.  8A142F        |mov dl,byte ptr ds:[edi+ebp]                    ;  取钥匙位
0048CE0D  |.  8B4C24 20     |mov ecx,dword ptr ss:[esp+0x20]            ;  传递加密ascii指针[004d70e4]
0048CE11  |.  2BF2          |sub esi,edx                                             ;  加上余数
0048CE13  |.  83E6 3F       |and esi,0x3F                                          ;  保留6位
0048CE16  |.  43            |inc ebx                                                   ;  写入位序数
0048CE17  |.  47            |inc edi                                                    ;  钥匙位序数
0048CE18  |.  8A140E        |mov dl,byte ptr ds:[esi+ecx]                    ;  偏移 加密ascii
0048CE1B  |.  885403 FF     |mov byte ptr ds:[ebx+eax-0x1],dl            ;  写入[0017b300+?]
0048CE1F  |.  8A042F        |mov al,byte ptr ds:[edi+ebp]
0048CE26  |.  33FF          |xor edi,edi
0048CE28  |>  33F6          |xor esi,esi

每个第1,3次循环跳转位
0048CE2A  |>  8B4424 24     |mov eax,dword ptr ss:[esp+0x24]          ;  取循环数
0048CE2E  |.  8B4C24 1C     |mov ecx,dword ptr ss:[esp+0x1C]           ;  取总循环数
0048CE32  |.  40            |inc eax                                 ;  
0048CE33  |.  3BC1          |cmp eax,ecx                             ;  
0048CE35  |.  894424 24     |mov dword ptr ss:[esp+0x24],eax            ;  记录循环数
0048CE39  |.^ 7C 80         \jl short sa_8001s.0048CDBB                    ;  循环尾

0048CE3B  |.  85F6          test esi,esi
0048CE3D  |.  74 18         je short sa_8001s.0048CE57                       ;  这里好像是判定是不是满足4位
0048CE3F  |.  8A042F        mov al,byte ptr ds:[edi+ebp]                      ;
0048CE42  |.  8B4C24 20     mov ecx,dword ptr ss:[esp+0x20]               ;  
0048CE46  |.  2BF0          sub esi,eax                                                 ;
0048CE48  |.  8B4424 14     mov eax,dword ptr ss:[esp+0x14]                ;
0048CE4C  |.  83E6 3F       and esi,0x3F                                             ;
0048CE4F  |.  43            inc ebx                                                       ;
0048CE50  |.  8A140E        mov dl,byte ptr ds:[esi+ecx]                          ;
0048CE53  |.  885403 FF     mov byte ptr ds:[ebx+eax-0x1],dl                  ;

满足4位跳转
0048CE57  |>  8B4C24 14     mov ecx,dword ptr ss:[esp+0x14]            ;   传递写入位置指针[0017B300]

0048CE5D  |.  8BC3          mov eax,ebx
0048CE5F  |.  C6040B 00     mov byte ptr ds:[ebx+ecx],0x0                 ;  末尾写0

运行前关键栈内容:
0018F84C  |00327C50

0017B300   00000000

运行后关键栈内容:
0018F84C  |00327C50
0017B300   5A63475A
0017B304   00000000

钥匙
maqianhe1

ascii 加密码 长度 0x3f(所以总是 与0x3f)
004D70E4  30 31 32 33 34 35 36 37 38 39 41 42 43 44 45 46  0123456789ABCDEF
004D70F4  47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56  GHIJKLMNOPQRSTUV
004D7104  57 58 59 5A 61 62 63 64 65 66 67 68 69 6A 6B 6C  WXYZabcdefghijkl
004D7114  6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7D  mnopqrstuvwxyz{}

全部的素材在这里了。
红色地方是没有经过分析的,可能是输入的字符串不足4个的时候强制再加一个,

目前已知的情况
字符串只用到钥匙加密,钥匙又是本身id+一个网址,所以真是很囧。

钥匙长度 0x19,当字符串超过钥匙长度的时候未知情况。

上一篇;石器时代当年4种外挂各自的用途回忆
下一篇;《石器时代官方手游》公测场面火爆石器手游《石器时代(官方正版)》