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,当字符串超过钥匙长度的时候未知情况。