某游戏密码加密算法逆向输入一位密码,通过跟timegettime 得到的时间 密码的ascii码 加密 得到一个word数,然后在用3des算法加密生成64位的字符,
每输入一次密码,在原加密基础上继续加密,当密码输入完成之后,登录游戏
64字节密码在通过3des 解密 然后跟IP地址 xor 之后发送密码,太疯狂了。
为了防止木马盗号,竟然用这样的手段加密密码。

不过想资号还是很容易的,在输入密码的地方直接hook,得到他寄存器里面的密码就可以了

_declspec(naked)  MyHooKGetPassFun()
{
        _asm
        {
                pushad
                        pushfd
                        mov     bl, byte ptr [esp+0x20]              ; 读取密码
        }
//得到密码之后当然是保存密码了,代码就不写了 
        _asm
        {
                popfd
                        popad  //下面恢复hook
                        mov     bl, byte ptr [esp+0x20] 
                        mov     eax, dword ptr [edi]
                        jmp g_GetPointReturnAddress
        }
}

写个dll在 (DLL_PROCESS_ATTACH 下面加入以下代码
CodeLen = 0x6;
OldAddress = g_BaseAddress + JMP_GETPASS_OFFSET;
g_GetPassReturnAddress = OldAddress + CodeLen;
pGetPassHook = new CInlineHook((DWORD)MyHooKGetPassFun, OldAddress, g_PatchCode, CodeLen);

下面是类
#include "StdAfx.h"
#include ".\inlinehook.h"

CInlineHook::CInlineHook(DWORD NewAddress, DWORD OldAddress, BYTE*PatchCode, int CodeLen)
{
        m_NewAddress = NewAddress;
        m_OldAddress = OldAddress;
        memcpy(m_PatchCode, PatchCode, CodeLen); 
        m_CodeLen = CodeLen;

        m_pJmpCodeOffset = (DWORD *)(m_PatchCode+1);
        m_Ishook = FALSE;

        HooK();
}

CInlineHook::~CInlineHook(void)
{
        UnHooK();
}

BOOL CInlineHook::HooK(void)
{
        *m_pJmpCodeOffset = m_NewAddress - m_OldAddress - 0x5;//跳转偏移量

        memcpy(m_OldCode, (BYTE *)m_OldAddress, m_CodeLen);   //保存原来的指令

        DWORD dwOldProtect;
        VirtualProtect((LPVOID)m_OldAddress, m_CodeLen, PAGE_READWRITE, &dwOldProtect);

        memcpy((BYTE *)m_OldAddress, m_PatchCode, m_CodeLen); //更改指令,跳向补丁代码HooKFun

        VirtualProtect((LPVOID)m_OldAddress, m_CodeLen, dwOldProtect, 0);
        m_Ishook = TRUE;

        return TRUE;
}

BOOL CInlineHook::UnHooK(void)
{
        if (m_Ishook)
        {
                DWORD dwOldProtect;
                VirtualProtect((LPVOID)m_OldAddress, m_CodeLen, PAGE_READWRITE, &dwOldProtect);

                memcpy((BYTE *)m_OldAddress, m_OldCode, m_CodeLen);  //还原,原来的指令

                VirtualProtect((LPVOID)m_OldAddress, m_CodeLen, dwOldProtect, 0);

                m_Ishook = FALSE;
                return TRUE;
        }

        return FALSE;
}



下面是具体加密分析

00583BC0    83EC 08             sub     esp, 8
00583BC3    53                  push    ebx
00583BC4    56                  push    esi
00583BC5    57                  push    edi
00583BC6    8BF9                mov     edi, ecx
00583BC8    90                  nop                                        ; 01F37457
00583BC9    E8 81125976         call    winmm.timeGetTime
00583BCE    50                  push    eax
00583BCF    E8 A6613100         call    00899D7A                           ; 没作用,纯粹为了迷惑你
00583BD4    8B7F 1C             mov     edi, dword ptr [edi+1C]            ; 加密表的指针
00583BD7    8A5C24 20           mov     bl, byte ptr [esp+20]              ; 读取密码
00583BDB    8B07                mov     eax, dword ptr [edi]
00583BDD    83C4 04             add     esp, 4
00583BE0    80C3 02             add     bl, 2                              ; 密码的16进制+2
00583BE3    33F6                xor     esi, esi
00583BE5    3BC7                cmp     eax, edi
00583BE7    74 1A               je      short 00583C03
00583BE9    8DA424 00000000     lea     esp, dword ptr [esp]
00583BF0    83FE 08             cmp     esi, 8
00583BF3    73 0E               jnb     short 00583C03
00583BF5    8A48 08             mov     cl, byte ptr [eax+8]               ; 读取加密表的数据
00583BF8    8B00                mov     eax, dword ptr [eax]
00583BFA    884C34 0C           mov     byte ptr [esp+esi+C], cl           ; 逐字节存入,共八字节
00583BFE    46                  inc     esi
00583BFF    3BC7                cmp     eax, edi
00583C01  ^ 75 ED               jnz     short 00583BF0
00583C03    E8 7F613100         call    00899D87                           ; 计算时间
00583C08    99                  cdq
00583C09    B9 07000000         mov     ecx, 7
00583C0E    F7F9                idiv    ecx
00583C10    8B7424 18           mov     esi, dword ptr [esp+18]            ; 读取密码写入指针
00583C14    8A4E 01             mov     cl, byte ptr [esi+1]               ; 读取密码第二个字节
00583C17    8AC3                mov     al, bl
00583C19    C0E0 04             shl     al, 4
00583C1C    C0E9 04             shr     cl, 4
00583C1F    0AC8                or      cl, al
00583C21    8A46 01             mov     al, byte ptr [esi+1]               ; 写入到密码
00583C24    C0EB 04             shr     bl, 4
00583C27    C0E0 04             shl     al, 4
00583C2A    0AC3                or      al, bl
00583C2C    8806                mov     byte ptr [esi], al                 ; 写入到密码
00583C2E    0FB6FA              movzx   edi, dl
00583C31    8A5C3C 0C           mov     bl, byte ptr [esp+edi+C]
00583C35    885C24 1C           mov     byte ptr [esp+1C], bl              ; 输入的字符串ascii
00583C39    32D9                xor     bl, cl
00583C3B    324424 1C           xor     al, byte ptr [esp+1C]              ; 输入的字符串ascii码
00583C3F    24 0F               and     al, 0F
00583C41    C0E2 04             shl     dl, 4
00583C44    0AC2                or      al, dl
00583C46    5F                  pop     edi
00583C47    885E 01             mov     byte ptr [esi+1], bl               ; 写入前面一位
00583C4A    8806                mov     byte ptr [esi], al                 ; 写入后一位
00583C4C    5E                  pop     esi
00583C4D    5B                  pop     ebx
00583C4E    83C4 08             add     esp, 8
00583C51    C2 0800             retn    8


00899D87    E8 C0740000         call    008A124C                           ; 又是迷惑你的代码
00899D8C    8B48 14             mov     ecx, dword ptr [eax+14]            ; 读取前面用timegettime得到的时间
00899D8F    69C9 FD430300       imul    ecx, ecx, 343FD
00899D95    81C1 C39E2600       add     ecx, 269EC3
00899D9B    8948 14             mov     dword ptr [eax+14], ecx
00899D9E    8BC1                mov     eax, ecx
00899DA0    C1E8 10             shr     eax, 10
00899DA3    25 FF7F0000         and     eax, 7FFF
00899DA8    C3                  retn




每输入一位密码得到时间,然后通过timegettime得到的时间进行计算,得到两位数的密码串
然后在通过变形3des加密得到一个64位的密码



直接内连汇编

const BYTE Pass[8] = {0xD2, 0x29, 0xB6, 0x8D, 0x0E, 0xF2, 0x78, 0xB2};
//aa:=TimeGetTime();
DWORD aa=0x01077BB0;
WORD bb=0x0000;
BYTE cc=0x61;
__asm
        {
                pushad
                mov ecx,aa
                imul ecx,ecx,0x343fd
                add ecx,0x269ec3
                mov eax,ecx
                shr eax,0x10
                and eax,0x7fff
                mov ecx,0x7
                idiv ecx
                lea esi,bb
                mov     cl, byte ptr [esi+0x1]
                mov     bl, cc
                add     bl, 2
                mov     al, bl
                shl     al, 0x4
                shr     cl, 0x4
                or      cl, al
                mov     al, byte ptr [esi+0x1]
                shr     bl, 0x4
                shl     al, 0x4
                or      al, bl
                mov     byte ptr [esi], al
                movzx   edi, dl
                lea     ebp,Pass
                mov     bl, byte ptr [ebp+edi]  //查表
                mov     byte ptr [esp+0x1C], bl
                xor     bl, cl
                xor     al, byte ptr [esp+0x1C]
                and     al, 0x0F
                shl     dl, 0x4
                or      al, dl
                mov     byte ptr [esi+0x1], bl
                mov     byte ptr [esi], al
                popad
        }
char  ss[20];
sprintf(ss,"%x",bb);



下面是3des 

3des   表生成代码
通过固定的key 
0x7E, 0x40, 0x3E, 0x6C, 0x44, 0x4F, 0x06, 0x74, 0x34, 0x94, 0xA4, 0x98, 0x06, 0x4D, 0xC2, 0x4D
生成

00583B5F    52                  push    edx
00583B60    8D5424 0C           lea     edx, dword ptr [esp+C]
00583B64    52                  push    edx
00583B65    FF10                call    dword ptr [eax]                    ; 生成表的

这里就不注释了,3des表生成代码,没经过变形
008777D0    8B4424 08           mov     eax, dword ptr [esp+8]
008777D4    33D2                xor     edx, edx
008777D6    894424 08           mov     dword ptr [esp+8], eax
008777DA    8B4424 04           mov     eax, dword ptr [esp+4]
008777DE    8A70 01             mov     dh, byte ptr [eax+1]
008777E1    8D48 01             lea     ecx, dword ptr [eax+1]
008777E4    53                  push    ebx
008777E5    55                  push    ebp
008777E6    56                  push    esi
008777E7    0FB630              movzx   esi, byte ptr [eax]
008777EA    0FB641 01           movzx   eax, byte ptr [ecx+1]
008777EE    0BF2                or      esi, edx
008777F0    41                  inc     ecx
008777F1    0FB651 01           movzx   edx, byte ptr [ecx+1]
008777F5    C1E0 10             shl     eax, 10
008777F8    0BF0                or      esi, eax
008777FA    41                  inc     ecx
008777FB    0FB641 01           movzx   eax, byte ptr [ecx+1]
008777FF    C1E2 18             shl     edx, 18
00877802    0BF2                or      esi, edx
00877804    41                  inc     ecx
00877805    41                  inc     ecx
00877806    33D2                xor     edx, edx
00877808    8A31                mov     dh, byte ptr [ecx]
0087780A    57                  push    edi
0087780B    0BC2                or      eax, edx
0087780D    41                  inc     ecx
0087780E    33D2                xor     edx, edx
00877810    8A71 01             mov     dh, byte ptr [ecx+1]
00877813    8A11                mov     dl, byte ptr [ecx]
00877815    C1E2 10             shl     edx, 10
00877818    0BC2                or      eax, edx
0087781A    8BC8                mov     ecx, eax
0087781C    C1E9 04             shr     ecx, 4
0087781F    33CE                xor     ecx, esi
00877821    81E1 0F0F0F0F       and     ecx, 0F0F0F0F
00877827    33F1                xor     esi, ecx
00877829    C1E1 04             shl     ecx, 4
0087782C    33C1                xor     eax, ecx
0087782E    8BCE                mov     ecx, esi
00877830    C1E1 12             shl     ecx, 12
00877833    33CE                xor     ecx, esi
00877835    81E1 0000CCCC       and     ecx, CCCC0000
0087783B    8BD1                mov     edx, ecx
0087783D    C1EA 12             shr     edx, 12
00877840    33D1                xor     edx, ecx
00877842    8BC8                mov     ecx, eax
00877844    C1E1 12             shl     ecx, 12
00877847    33C8                xor     ecx, eax
00877849    81E1 0000CCCC       and     ecx, CCCC0000
0087784F    33F2                xor     esi, edx
00877851    8BD1                mov     edx, ecx
00877853    C1EA 12             shr     edx, 12
00877856    33D1                xor     edx, ecx
00877858    33C2                xor     eax, edx
0087785A    8BC8                mov     ecx, eax
0087785C    D1E9                shr     ecx, 1
0087785E    33CE                xor     ecx, esi
00877860    81E1 55555555       and     ecx, 55555555
00877866    33F1                xor     esi, ecx
00877868    03C9                add     ecx, ecx
0087786A    33C1                xor     eax, ecx
0087786C    8BCE                mov     ecx, esi
0087786E    C1E9 08             shr     ecx, 8
00877871    33C8                xor     ecx, eax
00877873    81E1 FF00FF00       and     ecx, 0FF00FF
00877879    33C1                xor     eax, ecx
0087787B    C1E1 08             shl     ecx, 8
0087787E    33F1                xor     esi, ecx
00877880    8BC8                mov     ecx, eax
00877882    D1E9                shr     ecx, 1
00877884    33CE                xor     ecx, esi
00877886    81E1 55555555       and     ecx, 55555555
0087788C    8D1409              lea     edx, dword ptr [ecx+ecx]
0087788F    33C2                xor     eax, edx
00877891    33F1                xor     esi, ecx
00877893    8BE8                mov     ebp, eax
00877895    C1ED 0C             shr     ebp, 0C
00877898    8BCE                mov     ecx, esi
0087789A    81E5 F00F0000       and     ebp, 0FF0
008778A0    81E1 0F0000F0       and     ecx, F000000F
008778A6    0BE9                or      ebp, ecx
008778A8    8BD0                mov     edx, eax
008778AA    81E2 FF000000       and     edx, 0FF
008778B0    C1ED 04             shr     ebp, 4
008778B3    C1E2 10             shl     edx, 10
008778B6    0BEA                or      ebp, edx
008778B8    25 00FF0000         and     eax, 0FF00
008778BD    0BE8                or      ebp, eax
008778BF    81E6 FFFFFF0F       and     esi, 0FFFFFFF
008778C5    C74424 14 E8DE9E00  mov     dword ptr [esp+14], 009EDEE8
008778CD    8D49 00             lea     ecx, dword ptr [ecx]
008778D0    8B4424 14           mov     eax, dword ptr [esp+14]
008778D4    8338 00             cmp     dword ptr [eax], 0
008778D7    74 16               je      short 008778EF
008778D9    8BCE                mov     ecx, esi
008778DB    8BD5                mov     edx, ebp
008778DD    C1E1 1A             shl     ecx, 1A
008778E0    C1EE 02             shr     esi, 2
008778E3    C1E2 1A             shl     edx, 1A
008778E6    C1ED 02             shr     ebp, 2
008778E9    0BF1                or      esi, ecx
008778EB    0BEA                or      ebp, edx
008778ED    EB 12               jmp     short 00877901
008778EF    8BC6                mov     eax, esi
008778F1    8BCD                mov     ecx, ebp
008778F3    C1E0 1B             shl     eax, 1B
008778F6    D1EE                shr     esi, 1
008778F8    C1E1 1B             shl     ecx, 1B
008778FB    D1ED                shr     ebp, 1
008778FD    0BF0                or      esi, eax
008778FF    0BE9                or      ebp, ecx
00877901    81E6 FFFFFF0F       and     esi, 0FFFFFFF
00877907    8BC6                mov     eax, esi
00877909    D1E8                shr     eax, 1
0087790B    8BD0                mov     edx, eax
0087790D    81E2 00000007       and     edx, 7000000
00877913    8BF8                mov     edi, eax
00877915    8BCE                mov     ecx, esi
00877917    81E1 0000C000       and     ecx, 0C00000
0087791D    0BD1                or      edx, ecx
0087791F    D1EA                shr     edx, 1
00877921    25 000F0000         and     eax, 0F00
00877926    8BCE                mov     ecx, esi
00877928    81E1 00001000       and     ecx, 100000
0087792E    0BD1                or      edx, ecx
00877930    C1EA 14             shr     edx, 14
00877933    81E7 00000600       and     edi, 60000
00877939    8BCE                mov     ecx, esi
0087793B    81E1 00E00100       and     ecx, 1E000
00877941    0BCF                or      ecx, edi
00877943    8B3C95 70EC9400     mov     edi, dword ptr [edx*4+94EC70]
0087794A    C1E9 0D             shr     ecx, 0D
0087794D    8B1C8D 70EB9400     mov     ebx, dword ptr [ecx*4+94EB70]
00877954    8BD6                mov     edx, esi
00877956    81E2 C0000000       and     edx, 0C0
0087795C    0BC2                or      eax, edx
0087795E    C1E8 06             shr     eax, 6
00877961    0BFB                or      edi, ebx
00877963    8B1C85 70EA9400     mov     ebx, dword ptr [eax*4+94EA70]
0087796A    81E5 FFFFFF0F       and     ebp, 0FFFFFFF
00877970    8BC6                mov     eax, esi
00877972    83E0 3F             and     eax, 3F
00877975    8B0C85 70E99400     mov     ecx, dword ptr [eax*4+94E970]
0087797C    0BFB                or      edi, ebx
0087797E    0BF9                or      edi, ecx
00877980    8BC5                mov     eax, ebp
00877982    D1E8                shr     eax, 1
00877984    8BC8                mov     ecx, eax
00877986    81E1 001E0000       and     ecx, 1E00
0087798C    8BD5                mov     edx, ebp
0087798E    81E2 80010000       and     edx, 180
00877994    0BCA                or      ecx, edx
00877996    25 00000006         and     eax, 6000000
0087799B    8BD5                mov     edx, ebp
0087799D    81E2 0000E001       and     edx, 1E00000
008779A3    0BC2                or      eax, edx
008779A5    C1E8 15             shr     eax, 15
008779A8    8B1485 70F09400     mov     edx, dword ptr [eax*4+94F070]
008779AF    C1E9 07             shr     ecx, 7
008779B2    8B1C8D 70EE9400     mov     ebx, dword ptr [ecx*4+94EE70]
008779B9    0BDA                or      ebx, edx
008779BB    8BC5                mov     eax, ebp
008779BD    C1E8 0F             shr     eax, 0F
008779C0    83E0 3F             and     eax, 3F
008779C3    0B1C85 70EF9400     or      ebx, dword ptr [eax*4+94EF70]
008779CA    8BCD                mov     ecx, ebp
008779CC    83E1 3F             and     ecx, 3F
008779CF    0B1C8D 70ED9400     or      ebx, dword ptr [ecx*4+94ED70]
008779D6    8BD7                mov     edx, edi
008779D8    8BC3                mov     eax, ebx
008779DA    81E2 FFFF0000       and     edx, 0FFFF
008779E0    C1E0 10             shl     eax, 10
008779E3    0BD0                or      edx, eax
008779E5    6A 1E               push    1E
008779E7    52                  push    edx
008779E8    E8 8E7B0200         call    0089F57B
008779ED    8B4C24 20           mov     ecx, dword ptr [esp+20]
008779F1    C1EF 10             shr     edi, 10
008779F4    81E3 0000FFFF       and     ebx, FFFF0000
008779FA    8901                mov     dword ptr [ecx], eax
008779FC    83C1 04             add     ecx, 4
008779FF    6A 1A               push    1A
00877A01    0BFB                or      edi, ebx
00877A03    57                  push    edi
00877A04    894C24 28           mov     dword ptr [esp+28], ecx
00877A08    E8 6E7B0200         call    0089F57B
00877A0D    8B4C24 28           mov     ecx, dword ptr [esp+28]
00877A11    83C4 10             add     esp, 10
00877A14    8901                mov     dword ptr [ecx], eax
00877A16    83C1 04             add     ecx, 4
00877A19    8B4424 14           mov     eax, dword ptr [esp+14]
00877A1D    83C0 04             add     eax, 4
00877A20    3D 28DF9E00         cmp     eax, 009EDF28
00877A25    894C24 18           mov     dword ptr [esp+18], ecx
00877A29    894424 14           mov     dword ptr [esp+14], eax
00877A2D  ^ 0F8C 9DFEFFFF       jl      008778D0
00877A33    5F                  pop     edi
00877A34    5E                  pop     esi
00877A35    5D                  pop     ebp
00877A36    5B                  pop     ebx
00877A37    C3                  retn

逆向出的代码

var
  c, d, t, s, t2, i: dword;
begin
  c:= KeyB^[0] or (KeyB^[1] shl 8) or (KeyB^[2] shl 16) or (KeyB^[3] shl 24);
  d:= KeyB^[4] or (KeyB^[5] shl 8) or (KeyB^[6] shl 16) or (KeyB^[7] shl 24);
  perm_op(d,c,t,4,$0f0f0f0f);
  hperm_op(c,t,dword(-2),$cccc0000);
  hperm_op(d,t,dword(-2),$cccc0000);
  perm_op(d,c,t,1,$55555555);
  perm_op(c,d,t,8,$00ff00ff);
  perm_op(d,c,t,1,$55555555);
  d:= ((d and $ff) shl 16) or (d and $ff00) or ((d and $ff0000) shr 16) or
        ((c and $f0000000) shr 4);
  c:= c and $fffffff;
  for i:= 0 to 15 do
  begin
    if shifts2[i]<> 0 then
    begin
      c:= ((c shr 2) or (c shl 26));
      d:= ((d shr 2) or (d shl 26));
    end
    else
    begin
      c:= ((c shr 1) or (c shl 27));
      d:= ((d shr 1) or (d shl 27));
    end;
    c:= c and $fffffff;
    d:= d and $fffffff;
    s:= des_skb[0,c and $3f] or
        des_skb[1,((c shr  6) and $03) or ((c shr  7) and $3c)] or
        des_skb[2,((c shr 13) and $0f) or ((c shr 14) and $30)] or
        des_skb[3,((c shr 20) and $01) or ((c shr 21) and $06) or ((c shr 22) and $38)];
    t:= des_skb[4,d and $3f] or
        des_skb[5,((d shr  7) and $03) or ((d shr  8) and $3c)] or
        des_skb[6, (d shr 15) and $3f                         ] or
        des_skb[7,((d shr 21) and $0f) or ((d shr 22) and $30)];
    t2:= ((t shl 16) or (s and $ffff));
    KeyData^[(i shl 1)]:= ((t2 shl 2) or (t2 shr 30));
    t2:= ((s shr 16) or (t and $ffff0000));
    KeyData^[(i shl 1)+1]:= ((t2 shl 6) or (t2 shr 26));
  end;
end;

3des变形加密算法

00583B97    8B01                mov     eax, dword ptr [ecx]
00583B99    55                  push    ebp                                ; 加密/解密标识
00583B9A    8D5424 1C           lea     edx, dword ptr [esp+1C]
00583B9E    52                  push    edx                                ; key
00583B9F    56                  push    esi                                ; 需要加密的数据
00583BA0    FF50 04             call    dword ptr [eax+4]                  ; zhengtu.00876B40

00877A40    53                  push    ebx
00877A41    55                  push    ebp
00877A42    56                  push    esi
00877A43    57                  push    edi
00877A44    8B4C24 14           mov     ecx, dword ptr [esp+14]
00877A48    8B01                mov     eax, dword ptr [ecx]
00877A4A    8B71 04             mov     esi, dword ptr [ecx+4]
00877A4D    8BCE                mov     ecx, esi
00877A4F    C1E9 04             shr     ecx, 4
00877A52    33C8                xor     ecx, eax
00877A54    81E1 0F0F0F0F       and     ecx, 0F0F0F0F
00877A5A    33C1                xor     eax, ecx
00877A5C    C1E1 04             shl     ecx, 4
00877A5F    33F1                xor     esi, ecx
00877A61    8BC8                mov     ecx, eax
00877A63    C1E9 10             shr     ecx, 10
00877A66    33CE                xor     ecx, esi
00877A68    81E1 FFFF0000       and     ecx, 0FFFF
00877A6E    33F1                xor     esi, ecx
00877A70    C1E1 10             shl     ecx, 10
00877A73    33C1                xor     eax, ecx
00877A75    8BCE                mov     ecx, esi
00877A77    C1E9 02             shr     ecx, 2
00877A7A    33C8                xor     ecx, eax
00877A7C    81E1 33333333       and     ecx, 33333333
00877A82    33C1                xor     eax, ecx
00877A84    C1E1 02             shl     ecx, 2
00877A87    33F1                xor     esi, ecx
00877A89    8BC8                mov     ecx, eax
00877A8B    C1E9 08             shr     ecx, 8
00877A8E    33CE                xor     ecx, esi
00877A90    81E1 FF00FF00       and     ecx, 0FF00FF
00877A96    33F1                xor     esi, ecx
00877A98    C1E1 08             shl     ecx, 8
00877A9B    33C1                xor     eax, ecx
00877A9D    8BFE                mov     edi, esi
00877A9F    D1EF                shr     edi, 1
00877AA1    33F8                xor     edi, eax
00877AA3    81E7 55555555       and     edi, 55555555
00877AA9    8BD7                mov     edx, edi
00877AAB    33D0                xor     edx, eax
00877AAD    6A 1D               push    1D
00877AAF    52                  push    edx
00877AB0    E8 C67A0200         call    0089F57B
00877AB5    8BD8                mov     ebx, eax
00877AB7    8D043F              lea     eax, dword ptr [edi+edi]
00877ABA    33C6                xor     eax, esi
00877ABC    6A 1D               push    1D
00877ABE    50                  push    eax
00877ABF    E8 B77A0200         call    0089F57B
00877AC4    8B7424 2C           mov     esi, dword ptr [esp+2C]
00877AC8    8BF8                mov     edi, eax
00877ACA    8B4424 30           mov     eax, dword ptr [esp+30]
00877ACE    83C4 10             add     esp, 10
00877AD1    85C0                test    eax, eax
00877AD3    8B4424 18           mov     eax, dword ptr [esp+18]
00877AD7    0F84 52020000       je      00877D2F
00877ADD    83C0 08             add     eax, 8
00877AE0    894424 18           mov     dword ptr [esp+18], eax
00877AE4    C74424 20 04000000  mov     dword ptr [esp+20], 4
00877AEC    EB 04               jmp     short 00877AF2
00877AEE    8B4424 18           mov     eax, dword ptr [esp+18]
00877AF2    8B68 F8             mov     ebp, dword ptr [eax-8]
00877AF5    8B40 FC             mov     eax, dword ptr [eax-4]
00877AF8    33C3                xor     eax, ebx
00877AFA    6A 04               push    4
00877AFC    50                  push    eax
00877AFD    33EB                xor     ebp, ebx
00877AFF    E8 777A0200         call    0089F57B
00877B04    8BC8                mov     ecx, eax
00877B06    C1E9 12             shr     ecx, 12
00877B09    83E1 3F             and     ecx, 3F
00877B0C    8B8C8E 00050000     mov     ecx, dword ptr [esi+ecx*4+500]
00877B13    8BD5                mov     edx, ebp
00877B15    C1EA 12             shr     edx, 12
00877B18    83E2 3F             and     edx, 3F
00877B1B    338C96 00040000     xor     ecx, dword ptr [esi+edx*4+400]
00877B22    8BD0                mov     edx, eax
00877B24    C1EA 0A             shr     edx, 0A
00877B27    83E2 3F             and     edx, 3F
00877B2A    338C96 00030000     xor     ecx, dword ptr [esi+edx*4+300]
00877B31    8BD5                mov     edx, ebp
00877B33    C1EA 0A             shr     edx, 0A
00877B36    83E2 3F             and     edx, 3F
00877B39    338C96 00020000     xor     ecx, dword ptr [esi+edx*4+200]
00877B40    8BD0                mov     edx, eax
00877B42    C1E8 1A             shr     eax, 1A
00877B45    C1EA 02             shr     edx, 2
00877B48    83E2 3F             and     edx, 3F
00877B4B    338C96 00010000     xor     ecx, dword ptr [esi+edx*4+100]
00877B52    8B9486 00070000     mov     edx, dword ptr [esi+eax*4+700]
00877B59    8BC5                mov     eax, ebp
00877B5B    C1E8 1A             shr     eax, 1A
00877B5E    33CA                xor     ecx, edx
00877B60    8B9486 00060000     mov     edx, dword ptr [esi+eax*4+600]
00877B67    C1ED 02             shr     ebp, 2
00877B6A    83E5 3F             and     ebp, 3F
00877B6D    8B04AE              mov     eax, dword ptr [esi+ebp*4]
00877B70    33CA                xor     ecx, edx
00877B72    33C8                xor     ecx, eax
00877B74    8B4424 20           mov     eax, dword ptr [esp+20]
00877B78    8B28                mov     ebp, dword ptr [eax]
00877B7A    8B40 04             mov     eax, dword ptr [eax+4]
00877B7D    33F9                xor     edi, ecx
00877B7F    33C7                xor     eax, edi
00877B81    6A 04               push    4
00877B83    50                  push    eax
00877B84    33EF                xor     ebp, edi
00877B86    E8 F0790200         call    0089F57B
00877B8B    8BC8                mov     ecx, eax
00877B8D    C1E9 12             shr     ecx, 12
00877B90    83E1 3F             and     ecx, 3F
00877B93    8B8C8E 00050000     mov     ecx, dword ptr [esi+ecx*4+500]
00877B9A    8BD5                mov     edx, ebp
00877B9C    C1EA 12             shr     edx, 12
00877B9F    83E2 3F             and     edx, 3F
00877BA2    338C96 00040000     xor     ecx, dword ptr [esi+edx*4+400]
00877BA9    8BD0                mov     edx, eax
00877BAB    C1EA 0A             shr     edx, 0A
00877BAE    83E2 3F             and     edx, 3F
00877BB1    338C96 00030000     xor     ecx, dword ptr [esi+edx*4+300]
00877BB8    8BD5                mov     edx, ebp
00877BBA    C1EA 0A             shr     edx, 0A
00877BBD    83E2 3F             and     edx, 3F
00877BC0    338C96 00020000     xor     ecx, dword ptr [esi+edx*4+200]
00877BC7    8BD0                mov     edx, eax
00877BC9    C1EA 02             shr     edx, 2
00877BCC    C1E8 1A             shr     eax, 1A
00877BCF    83E2 3F             and     edx, 3F
00877BD2    338C96 00010000     xor     ecx, dword ptr [esi+edx*4+100]
00877BD9    8B9486 00070000     mov     edx, dword ptr [esi+eax*4+700]
00877BE0    8BC5                mov     eax, ebp
00877BE2    C1E8 1A             shr     eax, 1A
00877BE5    33CA                xor     ecx, edx
00877BE7    8B9486 00060000     mov     edx, dword ptr [esi+eax*4+600]
00877BEE    C1ED 02             shr     ebp, 2
00877BF1    83E5 3F             and     ebp, 3F
00877BF4    8B04AE              mov     eax, dword ptr [esi+ebp*4]
00877BF7    33CA                xor     ecx, edx
00877BF9    33C8                xor     ecx, eax
00877BFB    8B4424 28           mov     eax, dword ptr [esp+28]
00877BFF    8B68 08             mov     ebp, dword ptr [eax+8]
00877C02    33D9                xor     ebx, ecx
00877C04    8B40 0C             mov     eax, dword ptr [eax+C]
00877C07    33C3                xor     eax, ebx
00877C09    6A 04               push    4
00877C0B    50                  push    eax
00877C0C    33EB                xor     ebp, ebx
00877C0E    E8 68790200         call    0089F57B
00877C13    8BC8                mov     ecx, eax
00877C15    C1E9 12             shr     ecx, 12
00877C18    83E1 3F             and     ecx, 3F
00877C1B    8B8C8E 00050000     mov     ecx, dword ptr [esi+ecx*4+500]
00877C22    8BD5                mov     edx, ebp
00877C24    C1EA 12             shr     edx, 12
00877C27    83E2 3F             and     edx, 3F
00877C2A    338C96 00040000     xor     ecx, dword ptr [esi+edx*4+400]
00877C31    8BD0                mov     edx, eax
00877C33    C1EA 0A             shr     edx, 0A
00877C36    83E2 3F             and     edx, 3F
00877C39    338C96 00030000     xor     ecx, dword ptr [esi+edx*4+300]
00877C40    8BD5                mov     edx, ebp
00877C42    C1EA 0A             shr     edx, 0A
00877C45    83E2 3F             and     edx, 3F
00877C48    338C96 00020000     xor     ecx, dword ptr [esi+edx*4+200]
00877C4F    8BD0                mov     edx, eax
00877C51    C1E8 1A             shr     eax, 1A
00877C54    C1EA 02             shr     edx, 2
00877C57    83E2 3F             and     edx, 3F
00877C5A    338C96 00010000     xor     ecx, dword ptr [esi+edx*4+100]
00877C61    8B9486 00070000     mov     edx, dword ptr [esi+eax*4+700]
00877C68    8BC5                mov     eax, ebp
00877C6A    C1E8 1A             shr     eax, 1A
00877C6D    33CA                xor     ecx, edx
00877C6F    8B9486 00060000     mov     edx, dword ptr [esi+eax*4+600]
00877C76    C1ED 02             shr     ebp, 2
00877C79    83E5 3F             and     ebp, 3F
00877C7C    8B04AE              mov     eax, dword ptr [esi+ebp*4]
00877C7F    33CA                xor     ecx, edx
00877C81    33C8                xor     ecx, eax
00877C83    8B4424 30           mov     eax, dword ptr [esp+30]
00877C87    8B68 10             mov     ebp, dword ptr [eax+10]
00877C8A    8B40 14             mov     eax, dword ptr [eax+14]
00877C8D    33F9                xor     edi, ecx
00877C8F    33C7                xor     eax, edi
00877C91    6A 04               push    4
00877C93    50                  push    eax
00877C94    33EF                xor     ebp, edi
00877C96    E8 E0780200         call    0089F57B
00877C9B    8BC8                mov     ecx, eax
00877C9D    C1E9 12             shr     ecx, 12
00877CA0    83E1 3F             and     ecx, 3F
00877CA3    8B8C8E 00050000     mov     ecx, dword ptr [esi+ecx*4+500]
00877CAA    8BD5                mov     edx, ebp
00877CAC    C1EA 12             shr     edx, 12
00877CAF    83E2 3F             and     edx, 3F
00877CB2    338C96 00040000     xor     ecx, dword ptr [esi+edx*4+400]
00877CB9    8BD0                mov     edx, eax
00877CBB    C1EA 0A             shr     edx, 0A
00877CBE    83E2 3F             and     edx, 3F
00877CC1    338C96 00030000     xor     ecx, dword ptr [esi+edx*4+300]
00877CC8    8BD5                mov     edx, ebp
00877CCA    C1EA 0A             shr     edx, 0A
00877CCD    83E2 3F             and     edx, 3F
00877CD0    338C96 00020000     xor     ecx, dword ptr [esi+edx*4+200]
00877CD7    8BD0                mov     edx, eax
00877CD9    C1EA 02             shr     edx, 2
00877CDC    83E2 3F             and     edx, 3F
00877CDF    338C96 00010000     xor     ecx, dword ptr [esi+edx*4+100]
00877CE6    C1E8 1A             shr     eax, 1A
00877CE9    8B9486 00070000     mov     edx, dword ptr [esi+eax*4+700]
00877CF0    8BC5                mov     eax, ebp
00877CF2    33CA                xor     ecx, edx
00877CF4    C1E8 1A             shr     eax, 1A
00877CF7    8B9486 00060000     mov     edx, dword ptr [esi+eax*4+600]
00877CFE    C1ED 02             shr     ebp, 2
00877D01    83E5 3F             and     ebp, 3F
00877D04    8B04AE              mov     eax, dword ptr [esi+ebp*4]
00877D07    33CA                xor     ecx, edx
00877D09    33C8                xor     ecx, eax
00877D0B    33D9                xor     ebx, ecx
00877D0D    8B4C24 38           mov     ecx, dword ptr [esp+38]
00877D11    83C4 20             add     esp, 20
00877D14    83C1 20             add     ecx, 20
00877D17    8B4424 20           mov     eax, dword ptr [esp+20]
00877D1B    48                  dec     eax
00877D1C    894C24 18           mov     dword ptr [esp+18], ecx
00877D20    894424 20           mov     dword ptr [esp+20], eax
00877D24  ^ 0F85 C4FDFFFF       jnz     00877AEE
00877D2A    E9 4D020000         jmp     00877F7C
00877D2F    83C0 70             add     eax, 70
00877D32    894424 18           mov     dword ptr [esp+18], eax
00877D36    C74424 20 04000000  mov     dword ptr [esp+20], 4
00877D3E    EB 04               jmp     short 00877D44
00877D40    8B4424 18           mov     eax, dword ptr [esp+18]
00877D44    8B68 08             mov     ebp, dword ptr [eax+8]
00877D47    8B40 0C             mov     eax, dword ptr [eax+C]
00877D4A    33C3                xor     eax, ebx
00877D4C    6A 04               push    4
00877D4E    50                  push    eax
00877D4F    33EB                xor     ebp, ebx
00877D51    E8 25780200         call    0089F57B
00877D56    8BC8                mov     ecx, eax
00877D58    C1E9 12             shr     ecx, 12
00877D5B    83E1 3F             and     ecx, 3F
00877D5E    8B8C8E 00050000     mov     ecx, dword ptr [esi+ecx*4+500]
00877D65    8BD5                mov     edx, ebp
00877D67    C1EA 12             shr     edx, 12
00877D6A    83E2 3F             and     edx, 3F
00877D6D    338C96 00040000     xor     ecx, dword ptr [esi+edx*4+400]
00877D74    8BD0                mov     edx, eax
00877D76    C1EA 0A             shr     edx, 0A
00877D79    83E2 3F             and     edx, 3F
00877D7C    338C96 00030000     xor     ecx, dword ptr [esi+edx*4+300]
00877D83    8BD5                mov     edx, ebp
00877D85    C1EA 0A             shr     edx, 0A
00877D88    83E2 3F             and     edx, 3F
00877D8B    338C96 00020000     xor     ecx, dword ptr [esi+edx*4+200]
00877D92    8BD0                mov     edx, eax
00877D94    C1E8 1A             shr     eax, 1A
00877D97    C1EA 02             shr     edx, 2
00877D9A    83E2 3F             and     edx, 3F
00877D9D    338C96 00010000     xor     ecx, dword ptr [esi+edx*4+100]
00877DA4    8B9486 00070000     mov     edx, dword ptr [esi+eax*4+700]
00877DAB    8BC5                mov     eax, ebp
00877DAD    C1E8 1A             shr     eax, 1A
00877DB0    33CA                xor     ecx, edx
00877DB2    8B9486 00060000     mov     edx, dword ptr [esi+eax*4+600]
00877DB9    C1ED 02             shr     ebp, 2
00877DBC    83E5 3F             and     ebp, 3F
00877DBF    8B04AE              mov     eax, dword ptr [esi+ebp*4]
00877DC2    33CA                xor     ecx, edx
00877DC4    33C8                xor     ecx, eax
00877DC6    8B4424 20           mov     eax, dword ptr [esp+20]
00877DCA    8B28                mov     ebp, dword ptr [eax]
00877DCC    8B40 04             mov     eax, dword ptr [eax+4]
00877DCF    33F9                xor     edi, ecx
00877DD1    33C7                xor     eax, edi
00877DD3    6A 04               push    4
00877DD5    50                  push    eax
00877DD6    33EF                xor     ebp, edi
00877DD8    E8 9E770200         call    0089F57B
00877DDD    8BC8                mov     ecx, eax
00877DDF    C1E9 12             shr     ecx, 12
00877DE2    83E1 3F             and     ecx, 3F
00877DE5    8B8C8E 00050000     mov     ecx, dword ptr [esi+ecx*4+500]
00877DEC    8BD5                mov     edx, ebp
00877DEE    C1EA 12             shr     edx, 12
00877DF1    83E2 3F             and     edx, 3F
00877DF4    338C96 00040000     xor     ecx, dword ptr [esi+edx*4+400]
00877DFB    8BD0                mov     edx, eax
00877DFD    C1EA 0A             shr     edx, 0A
00877E00    83E2 3F             and     edx, 3F
00877E03    338C96 00030000     xor     ecx, dword ptr [esi+edx*4+300]
00877E0A    8BD5                mov     edx, ebp
00877E0C    C1EA 0A             shr     edx, 0A
00877E0F    83E2 3F             and     edx, 3F
00877E12    338C96 00020000     xor     ecx, dword ptr [esi+edx*4+200]
00877E19    8BD0                mov     edx, eax
00877E1B    C1EA 02             shr     edx, 2
00877E1E    C1E8 1A             shr     eax, 1A
00877E21    83E2 3F             and     edx, 3F
00877E24    338C96 00010000     xor     ecx, dword ptr [esi+edx*4+100]
00877E2B    8B9486 00070000     mov     edx, dword ptr [esi+eax*4+700]
00877E32    8BC5                mov     eax, ebp
00877E34    C1E8 1A             shr     eax, 1A
00877E37    33CA                xor     ecx, edx
00877E39    8B9486 00060000     mov     edx, dword ptr [esi+eax*4+600]
00877E40    C1ED 02             shr     ebp, 2
00877E43    83E5 3F             and     ebp, 3F
00877E46    8B04AE              mov     eax, dword ptr [esi+ebp*4]
00877E49    33CA                xor     ecx, edx
00877E4B    33C8                xor     ecx, eax
00877E4D    8B4424 28           mov     eax, dword ptr [esp+28]
00877E51    8B68 F8             mov     ebp, dword ptr [eax-8]
00877E54    33D9                xor     ebx, ecx
00877E56    8B40 FC             mov     eax, dword ptr [eax-4]
00877E59    33C3                xor     eax, ebx
00877E5B    6A 04               push    4
00877E5D    50                  push    eax
00877E5E    33EB                xor     ebp, ebx
00877E60    E8 16770200         call    0089F57B
00877E65    8BC8                mov     ecx, eax
00877E67    C1E9 12             shr     ecx, 12
00877E6A    83E1 3F             and     ecx, 3F
00877E6D    8B8C8E 00050000     mov     ecx, dword ptr [esi+ecx*4+500]
00877E74    8BD5                mov     edx, ebp
00877E76    C1EA 12             shr     edx, 12
00877E79    83E2 3F             and     edx, 3F
00877E7C    338C96 00040000     xor     ecx, dword ptr [esi+edx*4+400]
00877E83    8BD0                mov     edx, eax
00877E85    C1EA 0A             shr     edx, 0A
00877E88    83E2 3F             and     edx, 3F
00877E8B    338C96 00030000     xor     ecx, dword ptr [esi+edx*4+300]
00877E92    8BD5                mov     edx, ebp
00877E94    C1EA 0A             shr     edx, 0A
00877E97    83E2 3F             and     edx, 3F
00877E9A    338C96 00020000     xor     ecx, dword ptr [esi+edx*4+200]
00877EA1    8BD0                mov     edx, eax
00877EA3    C1E8 1A             shr     eax, 1A
00877EA6    C1EA 02             shr     edx, 2
00877EA9    83E2 3F             and     edx, 3F
00877EAC    338C96 00010000     xor     ecx, dword ptr [esi+edx*4+100]
00877EB3    8B9486 00070000     mov     edx, dword ptr [esi+eax*4+700]
00877EBA    8BC5                mov     eax, ebp
00877EBC    C1E8 1A             shr     eax, 1A
00877EBF    33CA                xor     ecx, edx
00877EC1    8B9486 00060000     mov     edx, dword ptr [esi+eax*4+600]
00877EC8    C1ED 02             shr     ebp, 2
00877ECB    83E5 3F             and     ebp, 3F
00877ECE    8B04AE              mov     eax, dword ptr [esi+ebp*4]
00877ED1    33CA                xor     ecx, edx
00877ED3    33C8                xor     ecx, eax
00877ED5    8B4424 30           mov     eax, dword ptr [esp+30]
00877ED9    8B68 F0             mov     ebp, dword ptr [eax-10]
00877EDC    8B40 F4             mov     eax, dword ptr [eax-C]
00877EDF    33F9                xor     edi, ecx
00877EE1    33C7                xor     eax, edi
00877EE3    6A 04               push    4
00877EE5    50                  push    eax
00877EE6    33EF                xor     ebp, edi
00877EE8    E8 8E760200         call    0089F57B
00877EED    8BC8                mov     ecx, eax
00877EEF    C1E9 12             shr     ecx, 12
00877EF2    83E1 3F             and     ecx, 3F
00877EF5    8B8C8E 00050000     mov     ecx, dword ptr [esi+ecx*4+500]
00877EFC    8BD5                mov     edx, ebp
00877EFE    C1EA 12             shr     edx, 12
00877F01    83E2 3F             and     edx, 3F
00877F04    338C96 00040000     xor     ecx, dword ptr [esi+edx*4+400]
00877F0B    8BD0                mov     edx, eax
00877F0D    C1EA 0A             shr     edx, 0A
00877F10    83E2 3F             and     edx, 3F
00877F13    338C96 00030000     xor     ecx, dword ptr [esi+edx*4+300]
00877F1A    8BD5                mov     edx, ebp
00877F1C    C1EA 0A             shr     edx, 0A
00877F1F    83E2 3F             and     edx, 3F
00877F22    338C96 00020000     xor     ecx, dword ptr [esi+edx*4+200]
00877F29    8BD0                mov     edx, eax
00877F2B    C1EA 02             shr     edx, 2
00877F2E    83E2 3F             and     edx, 3F
00877F31    338C96 00010000     xor     ecx, dword ptr [esi+edx*4+100]
00877F38    C1E8 1A             shr     eax, 1A
00877F3B    8B9486 00070000     mov     edx, dword ptr [esi+eax*4+700]
00877F42    8BC5                mov     eax, ebp
00877F44    33CA                xor     ecx, edx
00877F46    C1E8 1A             shr     eax, 1A
00877F49    8B9486 00060000     mov     edx, dword ptr [esi+eax*4+600]
00877F50    C1ED 02             shr     ebp, 2
00877F53    83E5 3F             and     ebp, 3F
00877F56    8B04AE              mov     eax, dword ptr [esi+ebp*4]
00877F59    33CA                xor     ecx, edx
00877F5B    33C8                xor     ecx, eax
00877F5D    33D9                xor     ebx, ecx
00877F5F    8B4C24 38           mov     ecx, dword ptr [esp+38]
00877F63    83C4 20             add     esp, 20
00877F66    83E9 20             sub     ecx, 20
00877F69    8B4424 20           mov     eax, dword ptr [esp+20]
00877F6D    48                  dec     eax
00877F6E    894C24 18           mov     dword ptr [esp+18], ecx
00877F72    894424 20           mov     dword ptr [esp+20], eax
00877F76  ^ 0F85 C4FDFFFF       jnz     00877D40
00877F7C    6A 03               push    3
00877F7E    57                  push    edi
00877F7F    E8 F7750200         call    0089F57B
00877F84    6A 03               push    3
00877F86    53                  push    ebx
00877F87    8BF0                mov     esi, eax
00877F89    E8 ED750200         call    0089F57B
00877F8E    8BC8                mov     ecx, eax
00877F90    D1E9                shr     ecx, 1
00877F92    33CE                xor     ecx, esi
00877F94    81E1 55555555       and     ecx, 55555555
00877F9A    33F1                xor     esi, ecx
00877F9C    03C9                add     ecx, ecx
00877F9E    33C1                xor     eax, ecx
00877FA0    8BCE                mov     ecx, esi
00877FA2    C1E9 08             shr     ecx, 8
00877FA5    33C8                xor     ecx, eax
00877FA7    81E1 FF00FF00       and     ecx, 0FF00FF
00877FAD    33C1                xor     eax, ecx
00877FAF    C1E1 08             shl     ecx, 8
00877FB2    33F1                xor     esi, ecx
00877FB4    8BC8                mov     ecx, eax
00877FB6    C1E9 02             shr     ecx, 2
00877FB9    33CE                xor     ecx, esi
00877FBB    81E1 33333333       and     ecx, 33333333
00877FC1    33F1                xor     esi, ecx
00877FC3    8D148D 00000000     lea     edx, dword ptr [ecx*4]
00877FCA    8BCE                mov     ecx, esi
00877FCC    C1E9 10             shr     ecx, 10
00877FCF    33C2                xor     eax, edx
00877FD1    8B5424 24           mov     edx, dword ptr [esp+24]
00877FD5    33C8                xor     ecx, eax
00877FD7    81E1 FFFF0000       and     ecx, 0FFFF
00877FDD    33C1                xor     eax, ecx
00877FDF    C1E1 10             shl     ecx, 10
00877FE2    33F1                xor     esi, ecx
00877FE4    8BC8                mov     ecx, eax
00877FE6    C1E9 04             shr     ecx, 4
00877FE9    33CE                xor     ecx, esi
00877FEB    81E1 0F0F0F0F       and     ecx, 0F0F0F0F
00877FF1    8BF9                mov     edi, ecx
00877FF3    83C4 10             add     esp, 10
00877FF6    33FE                xor     edi, esi
00877FF8    893A                mov     dword ptr [edx], edi
00877FFA    5F                  pop     edi
00877FFB    5E                  pop     esi
00877FFC    C1E1 04             shl     ecx, 4
00877FFF    33C8                xor     ecx, eax
00878001    5D                  pop     ebp
00878002    894A 04             mov     dword ptr [edx+4], ecx
00878005    5B                  pop     ebx
00878006    C3                  retn

工作量太大直接内连

procedure  __0089F57B();StdCall;
begin
        asm
                        and     dword ptr [esp+$8], $1F
                        mov     edx, dword ptr [esp+$4]
                        push    $20
                        pop     ecx
                        sub     ecx, dword ptr [esp+$8]
                        mov     eax, edx
                        shl     eax, cl
                        mov     ecx, dword ptr [esp+$8]
                        shr     edx, cl
                        or      eax, edx
                        retn
        end;
end;

procedure   __00877A40();StdCall;
begin
        asm
                        push    ebx
                        push    ebp
                        push    esi
                        push    edi
                        mov     ecx, dword ptr [esp+$14]
                        mov     eax, dword ptr [ecx]
                        mov     esi, dword ptr [ecx+$4]
                        mov     ecx, esi
                        shr     ecx, $4
                        xor     ecx, eax
                        and     ecx, $0F0F0F0F
                        xor     eax, ecx
                        shl     ecx, $4
                        xor     esi, ecx
                        mov     ecx, eax
                        shr     ecx, $10
                        xor     ecx, esi
                        and     ecx, $0FFFF
                        xor     esi, ecx
                        shl     ecx, $10
                        xor     eax, ecx
                        mov     ecx, esi
                        shr     ecx, $2
                        xor     ecx, eax
                        and     ecx, $33333333
                        xor     eax, ecx
                        shl     ecx, $2
                        xor     esi, ecx
                        mov     ecx, eax
                        shr     ecx, $8
                        xor     ecx, esi
                        and     ecx, $0FF00FF
                        xor     esi, ecx
                        shl     ecx, $8
                        xor     eax, ecx
                        mov     edi, esi
                        shr     edi, $1
                        xor     edi, eax
                        and     edi, $55555555
                        mov     edx, edi
                        xor     edx, eax
                        push    $1D
                        push    edx
                        call    __0089F57B
                        mov     ebx, eax
                        lea     eax, dword ptr [edi+edi]
                        xor     eax, esi
                        push    $1D
                        push    eax
                        call    __0089F57B
                        mov     esi, dword ptr[esp+$2c]
                        mov     edi, eax
                        mov     eax, dword ptr [esp+$30]
                        add     esp, $10
                        test    eax, eax
                        mov     eax, dword ptr [esp+$18]    //key地址
                        je @L230
                        add     eax, $8
                        mov     dword ptr [esp+$18], eax
                        mov     dword ptr [esp+$20], $4
                        jmp @L062
@L061:
                        mov     eax, dword ptr [esp+$18]
@L062:
                        mov     ebp, dword ptr [eax-$8]
                        mov     eax, dword ptr [eax-$4]
                        xor     eax, ebx
                        push    $4
                        push    eax
                        xor     ebp, ebx
                        call    __0089F57B
                        mov     ecx, eax
                        shr     ecx, $12
                        and     ecx, $3F
                        mov     ecx, dword ptr [esi+ecx*$4+$500]
                        mov     edx, ebp
                        shr     edx, $12
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$400]
                        mov     edx, eax
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$300]
                        mov     edx, ebp
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$200]
                        mov     edx, eax
                        shr     eax, $1A
                        shr     edx, $2
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$100]
                        mov     edx, dword ptr [esi+eax*$4+$700]
                        mov     eax, ebp
                        shr     eax, $1A
                        xor     ecx, edx
                        mov     edx, dword ptr [esi+eax*$4+$600]
                        shr     ebp, $2
                        and     ebp, $3F
                        mov     eax, dword ptr [esi+ebp*$4]
                        xor     ecx, edx
                        xor     ecx, eax
                        mov     eax, dword ptr [esp+$20]
                        mov     ebp, dword ptr [eax]
                        mov     eax, dword ptr [eax+$4]
                        xor     edi, ecx
                        xor     eax, edi
                        push    $4
                        push    eax
                        xor     ebp, edi
                        call    __0089F57B
                        mov     ecx, eax
                        shr     ecx, $12
                        and     ecx, $3F
                        mov     ecx, dword ptr [esi+ecx*$4+$500]
                        mov     edx, ebp
                        shr     edx, $12
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$400]
                        mov     edx, eax
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$300]
                        mov     edx, ebp
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$200]
                        mov     edx, eax
                        shr     edx, $2
                        shr     eax, $1A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$100]
                        mov     edx, dword ptr [esi+eax*$4+$700]
                        mov     eax, ebp
                        shr     eax, $1A
                        xor     ecx, edx
                        mov     edx, dword ptr [esi+eax*$4+$600]
                        shr     ebp, $2
                        and     ebp, $3F
                        mov     eax, dword ptr [esi+ebp*$4]
                        xor     ecx, edx
                        xor     ecx, eax
                        mov     eax, dword ptr [esp+$28]
                        mov     ebp, dword ptr [eax+$8]
                        xor     ebx, ecx
                        mov     eax, dword ptr [eax+$C]
                        xor     eax, ebx
                        push    $4
                        push    eax
                        xor     ebp, ebx
                        call    __0089F57B
                        mov     ecx, eax
                        shr     ecx, $12
                        and     ecx, $3F
                        mov     ecx, dword ptr [esi+ecx*$4+$500]
                        mov     edx, ebp
                        shr     edx, $12
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$400]
                        mov     edx, eax
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$300]
                        mov     edx, ebp
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$200]
                        mov     edx, eax
                        shr     eax, $1A
                        shr     edx, $2
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$100]
                        mov     edx, dword ptr [esi+eax*$4+$700]
                        mov     eax, ebp
                        shr     eax, $1A
                        xor     ecx, edx
                        mov     edx, dword ptr [esi+eax*$4+$600]
                        shr     ebp, $2
                        and     ebp, $3F
                        mov     eax, dword ptr [esi+ebp*$4]
                        xor     ecx, edx
                        xor     ecx, eax
                        mov     eax, dword ptr [esp+$30]
                        mov     ebp, dword ptr [eax+$10]
                        mov     eax, dword ptr [eax+$14]
                        xor     edi, ecx
                        xor     eax, edi
                        push    $4
                        push    eax
                        xor     ebp, edi
                        call    __0089F57B
                        mov     ecx, eax
                        shr     ecx, $12
                        and     ecx, $3F
                        mov     ecx, dword ptr [esi+ecx*$4+$500]
                        mov     edx, ebp
                        shr     edx, $12
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$400]
                        mov     edx, eax
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$300]
                        mov     edx, ebp
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$200]
                        mov     edx, eax
                        shr     edx, $2
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$100]
                        shr     eax, $1A
                        mov     edx, dword ptr [esi+eax*$4+$700]
                        mov     eax, ebp
                        xor     ecx, edx
                        shr     eax, $1A
                        mov     edx, dword ptr [esi+eax*$4+$600]
                        shr     ebp, $2
                        and     ebp, $3F
                        mov     eax, dword ptr [esi+ebp*$4]
                        xor     ecx, edx
                        xor     ecx, eax
                        xor     ebx, ecx
                        mov     ecx, dword ptr [esp+$38]
                        add     esp, $20
                        add     ecx, $20
                        mov     eax, dword ptr [esp+$20]
                        dec     eax
                        mov     dword ptr [esp+$18], ecx
                        mov     dword ptr [esp+$20], eax
                        jnz @L061
                        jmp @L402
@L230:
                        add     eax, $70
                        mov     dword ptr [esp+$18], eax
                        mov     dword ptr [esp+$20], $4
                        jmp @L235
@L234:
                        mov     eax, dword ptr [esp+$18]
@L235:
                        mov     ebp, dword ptr [eax+$8]
                        mov     eax, dword ptr [eax+$C]
                        xor     eax, ebx
                        push    $4
                        push    eax
                        xor     ebp, ebx
                        call    __0089F57B
                        mov     ecx, eax
                        shr     ecx, $12
                        and     ecx, $3F
                        mov     ecx, dword ptr [esi+ecx*$4+$500]
                        mov     edx, ebp
                        shr     edx, $12
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$400]
                        mov     edx, eax
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$300]
                        mov     edx, ebp
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$200]
                        mov     edx, eax
                        shr     eax, $1A
                        shr     edx, $2
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$100]
                        mov     edx, dword ptr [esi+eax*$4+$700]
                        mov     eax, ebp
                        shr     eax, $1A
                        xor     ecx, edx
                        mov     edx, dword ptr [esi+eax*$4+$600]
                        shr     ebp, $2
                        and     ebp, $3F
                        mov     eax, dword ptr [esi+ebp*$4]
                        xor     ecx, edx
                        xor     ecx, eax
                        mov     eax, dword ptr [esp+$20]
                        mov     ebp, dword ptr [eax]
                        mov     eax, dword ptr [eax+$4]
                        xor     edi, ecx
                        xor     eax, edi
                        push    $4
                        push    eax
                        xor     ebp, edi
                        call    __0089F57B
                        mov     ecx, eax
                        shr     ecx, $12
                        and     ecx, $3F
                        mov     ecx, dword ptr [esi+ecx*$4+$500]
                        mov     edx, ebp
                        shr     edx, $12
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$400]
                        mov     edx, eax
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$300]
                        mov     edx, ebp
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$200]
                        mov     edx, eax
                        shr     edx, $2
                        shr     eax, $1A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$100]
                        mov     edx, dword ptr [esi+eax*$4+$700]
                        mov     eax, ebp
                        shr     eax, $1A
                        xor     ecx, edx
                        mov     edx, dword ptr [esi+eax*$4+$600]
                        shr     ebp, $2
                        and     ebp, $3F
                        mov     eax, dword ptr [esi+ebp*$4]
                        xor     ecx, edx
                        xor     ecx, eax
                        mov     eax, dword ptr [esp+$28]
                        mov     ebp, dword ptr [eax-$8]
                        xor     ebx, ecx
                        mov     eax, dword ptr [eax-$4]
                        xor     eax, ebx
                        push    $4
                        push    eax
                        xor     ebp, ebx
                        call    __0089F57B
                        mov     ecx, eax
                        shr     ecx, $12
                        and     ecx, $3F
                        mov     ecx, dword ptr [esi+ecx*$4+$500]
                        mov     edx, ebp
                        shr     edx, $12
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$400]
                        mov     edx, eax
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$300]
                        mov     edx, ebp
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$200]
                        mov     edx, eax
                        shr     eax, $1A
                        shr     edx, $2
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$100]
                        mov     edx, dword ptr [esi+eax*$4+$700]
                        mov     eax, ebp
                        shr     eax, $1A
                        xor     ecx, edx
                        mov     edx, dword ptr [esi+eax*$4+$600]
                        shr     ebp, $2
                        and     ebp, $3F
                        mov     eax, dword ptr [esi+ebp*$4]
                        xor     ecx, edx
                        xor     ecx, eax
                        mov     eax, dword ptr [esp+$30]
                        mov     ebp, dword ptr [eax-$10]
                        mov     eax, dword ptr [eax-$C]
                        xor     edi, ecx
                        xor     eax, edi
                        push    $4
                        push    eax
                        xor     ebp, edi
                        call    __0089F57B
                        mov     ecx, eax
                        shr     ecx, $12
                        and     ecx, $3F
                        mov     ecx, dword ptr [esi+ecx*$4+$500]
                        mov     edx, ebp
                        shr     edx, $12
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$400]
                        mov     edx, eax
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$300]
                        mov     edx, ebp
                        shr     edx, $0A
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$200]
                        mov     edx, eax
                        shr     edx, $2
                        and     edx, $3F
                        xor     ecx, dword ptr [esi+edx*$4+$100]
                        shr     eax, $1A
                        mov     edx, dword ptr [esi+eax*$4+$700]
                        mov     eax, ebp
                        xor     ecx, edx
                        shr     eax, $1A
                        mov     edx, dword ptr [esi+eax*$4+$600]
                        shr     ebp, $2
                        and     ebp, $3F
                        mov     eax, dword ptr [esi+ebp*$4]
                        xor     ecx, edx
                        xor     ecx, eax
                        xor     ebx, ecx
                        mov     ecx, dword ptr [esp+$38]
                        add     esp, $20
                        sub     ecx, $20
                        mov     eax, dword ptr [esp+$20]
                        dec     eax
                        mov     dword ptr [esp+$18], ecx
                        mov     dword ptr [esp+$20], eax
                        jnz @L234
@L402:
                        push    $3
                        push    edi
                        call    __0089F57B
                        push    $3
                        push    ebx
                        mov     esi, eax
                        call    __0089F57B
                        mov     ecx, eax
                        shr     ecx, $1
                        xor     ecx, esi
                        and     ecx, $55555555
                        xor     esi, ecx
                        add     ecx, ecx
                        xor     eax, ecx
                        mov     ecx, esi
                        shr     ecx, $8
                        xor     ecx, eax
                        and     ecx, $0FF00FF
                        xor     eax, ecx
                        shl     ecx, $8
                        xor     esi, ecx
                        mov     ecx, eax
                        shr     ecx, $2
                        xor     ecx, esi
                        and     ecx, $33333333
                        xor     esi, ecx
                        lea     edx, dword ptr [ecx*$4]
                        mov     ecx, esi
                        shr     ecx, $10
                        xor     eax, edx
                        mov     edx, dword ptr [esp+$24]
                        xor     ecx, eax
                        and     ecx, $0FFFF
                        xor     eax, ecx
                        shl     ecx, $10
                        xor     esi, ecx
                        mov     ecx, eax
                        shr     ecx, $4
                        xor     ecx, esi
                        and     ecx, $0F0F0F0F
                        mov     edi, ecx
                        add     esp, $10
                        xor     edi, esi
                        mov     dword ptr [edx], edi
                        pop     edi
                        pop     esi
                        shl     ecx, $4
                        xor     ecx, eax
                        pop     ebp
                        mov     dword ptr [edx+$4], ecx
                        pop     ebx
                        retn

  end;
end;


procedure __008777D0();StdCall;
begin
        asm
                        mov     eax, dword ptr [esp+$08]
                        xor     edx, edx
                        mov     dword ptr [esp+$08], eax
                        mov     eax, dword ptr [esp+$04]
                        mov     dh, byte ptr [eax+$01]
                        lea     ecx, dword ptr [eax+$01]
                        push    ebx
                        push    ebp
                        push    esi
                        movzx   esi, byte ptr [eax]
                        movzx   eax, byte ptr [ecx+$01]
                        or      esi, edx
                        inc     ecx
                        movzx   edx, byte ptr [ecx+$01]
                        shl     eax, $10
                        or      esi, eax
                        inc     ecx
                        movzx   eax, byte ptr [ecx+$01]
                        shl     edx, $18
                        or      esi, edx
                        inc     ecx
                        inc     ecx
                        xor     edx, edx
                        mov     dh, byte ptr [ecx]
                        push    edi
                        or      eax, edx
                        inc     ecx
                        xor     edx, edx
                        mov     dh, byte ptr [ecx+$01]
                        mov     dl, byte ptr [ecx]
                        shl     edx, $10
                        or      eax, edx
                        mov     ecx, eax
                        shr     ecx, $04
                        xor     ecx, esi
                        and     ecx, $0F0F0F0F
                        xor     esi, ecx
                        shl     ecx, $04
                        xor     eax, ecx
                        mov     ecx, esi
                        shl     ecx, $12
                        xor     ecx, esi
                        and     ecx, $CCCC0000
                        mov     edx, ecx
                        shr     edx, $12
                        xor     edx, ecx
                        mov     ecx, eax
                        shl     ecx, $12
                        xor     ecx, eax
                        and     ecx, $CCCC0000
                        xor     esi, edx
                        mov     edx, ecx
                        shr     edx, $12
                        xor     edx, ecx
                        xor     eax, edx
                        mov     ecx, eax
                        shr     ecx, $01
                        xor     ecx, esi
                        and     ecx, $55555555
                        xor     esi, ecx
                        add     ecx, ecx
                        xor     eax, ecx
                        mov     ecx, esi
                        shr     ecx, $08
                        xor     ecx, eax
                        and     ecx, $0FF00FF
                        xor     eax, ecx
                        shl     ecx, $08
                        xor     esi, ecx
                        mov     ecx, eax
                        shr     ecx, $01
                        xor     ecx, esi
                        and     ecx, $55555555
                        lea     edx, dword ptr [ecx+ecx]
                        xor     eax, edx
                        xor     esi, ecx
                        mov     ebp, eax
                        shr     ebp, $0C
                        mov     ecx, esi
                        and     ebp, $0FF0
                        and     ecx, $F000000F
                        or      ebp, ecx
                        mov     edx, eax
                        and     edx, $0FF
                        shr     ebp, $04
                        shl     edx, $10
                        or      ebp, edx
                        and     eax, $0FF00
                        or      ebp, eax
                        and     esi, $0FFFFFFF
                        push        ecx
                        lea                ecx,TABLE__009EDEE8
                        mov     dword ptr [esp+$18], ecx
                        pop                ecx
                        lea     ecx, dword ptr [ecx]
@L092:
                        mov     eax, dword ptr [esp+$14]
                        cmp     dword ptr [eax], 0
                        je @L104
                        mov     ecx, esi
                        mov     edx, ebp
                        shl     ecx, $1A
                        shr     esi, $02
                        shl     edx, $1A
                        shr     ebp, $02
                        or      esi, ecx
                        or      ebp, edx
                        jmp @L112
@L104:
                        mov     eax, esi
                        mov     ecx, ebp
                        shl     eax, $1B
                        shr     esi, $01
                        shl     ecx, $1B
                        shr     ebp, $01
                        or      esi, eax
                        or      ebp, ecx
@L112:
                        and     esi, $0FFFFFFF
                        mov     eax, esi
                        shr     eax, $01
                        mov     edx, eax
                        and     edx, $7000000
                        mov     edi, eax
                        mov     ecx, esi
                        and     ecx, $0C00000
                        or      edx, ecx
                        shr     edx, $01
                        and     eax, $0F00
                        mov     ecx, esi
                        and     ecx, $100000
                        or      edx, ecx
                        shr     edx, $14
                        and     edi, $60000
                        mov     ecx, esi
                        and     ecx, $1E000
                        or      ecx, edi
                        mov     edi, dword ptr [edx*4+TABLE__0094EC70]
                        shr     ecx, $0D
                        mov     ebx, dword ptr [ecx*4+TABLE__0094EB70]
                        mov     edx, esi
                        and     edx, $0C0
                        or      eax, edx
                        shr     eax, $06
                        or      edi, ebx
                        mov     ebx, dword ptr [eax*4+TABLE__0094EA70]
                        and     ebp, $0FFFFFFF
                        mov     eax, esi
                        and     eax, $3F
                        mov     ecx, dword ptr [eax*4+TABLE__0094E970]
                        or      edi, ebx
                        or      edi, ecx
                        mov     eax, ebp
                        shr     eax, $01
                        mov     ecx, eax
                        and     ecx, $1E00
                        mov     edx, ebp
                        and     edx, $180
                        or      ecx, edx
                        and     eax, $6000000
                        mov     edx, ebp
                        and     edx, $1E00000
                        or      eax, edx
                        shr     eax, $15
                        mov     edx, dword ptr [eax*4+TABLE__0094F070]
                        shr     ecx, $7
                        mov     ebx, dword ptr [ecx*4+TABLE__0094EE70]
                        or      ebx, edx
                        mov     eax, ebp
                        shr     eax, $0F
                        and     eax, $3F
                        or      ebx, dword ptr [eax*4+TABLE__0094EF70]
                        mov     ecx, ebp
                        and     ecx, $3F
                        or      ebx, dword ptr [ecx*4+TABLE__0094ED70]
                        mov     edx, edi
                        mov     eax, ebx
                        and     edx, $0FFFF
                        shl     eax, $10
                        or      edx, eax
                        push    $1E
                        push    edx
                        call    __0089F57B
                        mov     ecx, dword ptr [esp+$20]
                        shr     edi, $10
                        and     ebx, $FFFF0000
                        mov     dword ptr [ecx], eax
                        add     ecx, $04
                        push    $1A
                        or      edi, ebx
                        push    edi
                        mov     dword ptr [esp+$28], ecx
                        call    __0089F57B
                        mov     ecx, dword ptr [esp+$28]
                        add     esp, $10
                        mov     dword ptr [ecx], eax
                        add     ecx, $04
                        mov     eax, dword ptr [esp+$14]
                        add     eax, $04
                        push        ecx
                        lea                ecx,TABLE__009EDEE8
                        add                ecx,$40
                        cmp     eax,ecx
                        pop                ecx
                        mov     dword ptr [esp+$18], ecx
                        mov     dword ptr [esp+$14], eax
                        jl @L092
                        pop     edi
                        pop     esi
                        pop     ebp
                        pop     ebx
                        retn
        end;
end;