答案:
Name: 123456
Serial: 32303130333021303276347854301476301254103478
Name: 55555
Serial: 32303130333021303285210345876301430125476301258
分析:
序列号由两部分组成,第一部分为矩阵,第二部分为推箱子
第一部分
对应矩阵为3×3的矩阵,分析如下:
100015B8 0FBED3 movsx edx, bl
100015BB 83EA 57 sub edx, 57
100015BE 66:0F6ECA movd mm1, edx
100015C2 0F5B ??? ; cvtdq2ps xmm1, xmm1
100015C4 C9 leave
100015C5 3B8D 3CFFFFFF cmp ecx, dword ptr [ebp-C4]
100015CB 74 0A je short 100015D7
100015CD 0F57C0 xorps xmm0, xmm0 ; 1 = -1
100015D0 F3:0F5CC1 subss xmm0, xmm1
100015D4 0F28C8 movaps xmm1, xmm0
100015D7 8B8D 64FFFFFF mov ecx, dword ptr [ebp-9C]
100015DD 3B8D 58FFFFFF cmp ecx, dword ptr [ebp-A8]
100015E3 0F8D 79030000 jge 10001962
代码分析:
将对应的序列号[323031303330213032]转换为单精度矩阵,设该矩阵为B,也就是待求矩阵。注意,第一字节为偶数时 第二字节转换后为负数。
100017EA 8D8D 40FFFFFF lea ecx, dword ptr [ebp-C0]
100017F0 8BD8 mov ebx, eax
100017F2 8D85 4CFFFFFF lea eax, dword ptr [ebp-B4]
100017F8 899D 28FFFFFF mov dword ptr [ebp-D8], ebx
100017FE 50 push eax
100017FF 8D85 58FFFFFF lea eax, dword ptr [ebp-A8]
10001805 50 push eax
10001806 E8 F5F8FFFF call <tmul>
1000180B 83F8 FF cmp eax, -1
1000180E 0F84 4E010000 je 10001962
代码分析:
调用矩阵乘法,该矩阵设为A,其值为:
1 0 1
0 2 0
-1 0 1
矩阵A与矩阵B相乘,结果为矩阵C
10001814 8D85 14FFFFFF lea eax, dword ptr [ebp-EC]
1000181A 50 push eax
1000181B 8D85 2CFFFFFF lea eax, dword ptr [ebp-D4]
10001821 50 push eax
10001822 8D8D 4CFFFFFF lea ecx, dword ptr [ebp-B4]
10001828 E8 03F8FFFF call <tadd>
1000182D 83F8 FF cmp eax, -1
10001830 0F84 2C010000 je 10001962
代码分析:
矩阵C与矩阵D相加,矩阵D的值为
1 0 0
0 1 0
0 0 1
单位矩阵,其结果为矩阵D
10001836 8D85 4CFFFFFF lea eax, dword ptr [ebp-B4]
1000183C 50 push eax
1000183D 8D85 40FFFFFF lea eax, dword ptr [ebp-C0]
10001843 50 push eax
10001844 8BC8 mov ecx, eax
10001846 E8 B5F8FFFF call <tmul>
1000184B 83F8 FF cmp eax, -1
1000184E 0F84 0E010000 je 10001962
代码分析:
矩阵A乘矩阵A,A的值上文已列出,设结果为矩阵Ci
10001861 8D85 20FFFFFF lea eax, dword ptr [ebp-E0]
10001867 50 push eax
10001868 8D85 58FFFFFF lea eax, dword ptr [ebp-A8]
1000186E 50 push eax
1000186F 8D8D 4CFFFFFF lea ecx, dword ptr [ebp-B4]
10001875 E8 B6F7FFFF call <tadd>
1000187A 83F8 FF cmp eax, -1
1000187D 0F84 DF000000 je 10001962
代码分析:
矩阵B与Ci相加,设结果为矩阵F
1000189B 83F9 03 cmp ecx, 3
1000189E 0F8D BE000000 jge 10001962
100018A4 8D1431 lea edx, dword ptr [ecx+esi]
100018A7 F3:0F100C97 movss xmm1, dword ptr [edi+edx*4]
100018AC 0F2ECA ucomiss xmm1, xmm2
100018AF 9F lahf
100018B0 F6C4 44 test ah, 44
100018B3 0F8B A9000000 jpo 10001962
100018B9 F3:0F100493 movss xmm0, dword ptr [ebx+edx*4]
100018BE 0F2EC2 ucomiss xmm0, xmm2
100018C1 9F lahf
100018C2 F6C4 44 test ah, 44
100018C5 0F8B 97000000 jpo 10001962
100018CB 0F2EC8 ucomiss xmm1, xmm0
100018CE 9F lahf
100018CF F6C4 44 test ah, 44
100018D2 0F8A 8A000000 jpe 10001962
100018D8 41 inc ecx
100018D9 83F9 03 cmp ecx, 3
100018DC ^ 7C B4 jl short 10001892
100018DE 83C6 03 add esi, 3
100018E1 83FE 09 cmp esi, 9
100018E4 ^ 7C AA jl short 10001890
代码分析:
比较矩阵E和F,不一致则退出。
至此可得出完整公式如下:
A*B+D = A*A+B
B为所求矩阵,A和D为已知矩阵,整理公式如下:
B = (A*A-D)*(A-1)~1 注:(A-1)的逆
求得B值如下:
2 0 1
0 3 0
-1 0 2
转换为序列号 323031303330213032,第一部分完成。
第二部分为推箱子
推箱子大小为3×3,数字为 0 -- 8
100018E6 8D75 B4 lea esi, dword ptr [ebp-4C]
100018E9 8D56 01 lea edx, dword ptr [esi+1]
100018EC 8D6424 00 lea esp, dword ptr [esp]
100018F0 8A06 mov al, byte ptr [esi]
100018F2 46 inc esi
100018F3 84C0 test al, al
100018F5 ^ 75 F9 jnz short 100018F0
100018F7 8B8D 38FFFFFF mov ecx, dword ptr [ebp-C8]
100018FD 2BF2 sub esi, edx
100018FF E8 0CFAFFFF call 10001310
10001904 32DB xor bl, bl
10001906 85F6 test esi, esi
10001908 74 25 je short 1000192F
代码分析:
用户名用于初始化箱子位置,
10001910 0FBE4C05 B4 movsx ecx, byte ptr [ebp+eax-4C]
10001915 8D41 D0 lea eax, dword ptr [ecx-30]
10001918 83F8 08 cmp eax, 8
1000191B 77 08 ja short 10001925
1000191D 83C1 D0 add ecx, -30
10001920 E8 9BFAFFFF call 100013C0
10001925 80C3 01 add bl, 1
10001928 0FB6C3 movzx eax, bl
1000192B 3BC6 cmp eax, esi
1000192D ^ 72 E1 jb short 10001910
代码分析:
剩余序列号用于推箱子,
1000192F B2 01 mov dl, 1
10001931 0FB6CA movzx ecx, dl
10001934 8A81 103F0110 mov al, byte ptr [ecx+10013F10]
1000193A 3A81 0F3F0110 cmp al, byte ptr [ecx+10013F0F]
10001940 7C 07 jl short 10001949
10001942 FEC2 inc dl
10001944 80FA 08 cmp dl, 8
10001947 ^ 72 E8 jb short 10001931
10001949 5E pop esi
1000194A 80FA 08 cmp dl, 8
1000194D 5F pop edi
1000194E 0F94C0 sete al
10001951 5B pop ebx
代码分析:
最后为1--8 0 顺序排列,否则注册失败。
起初看似在排序,经试验后发现有规律。
推箱子走法:
3×3的阵列中0为当前位置,0只能与相邻单元进行交互,最后一步必定为8,所以写了个程序进行穷举,代码如下:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)