FlashDemo Studio注册流程简单分析

爱必应

目标官网:http://www.flashdemo.net/

时隔多年,又想起这款软件,表哥们以前早就分析的很透彻了,下面将是我流水帐式的分析过程:
首先软件判断注册码的长度,这个应该算是第一关。不过好像是先读取注册表的信息,然后再读取输入的注册码,如果注册表中有合法注册码,应该走完流程后显示[Asm] 纯文本查看 复制代码

0042CC2 | cmp dword ptr ss:[esp+90],12 | 判断注册码长度是否为18位0042CC2 | jne flashdemostudio.42CD31 

接下来就进入到关键call
[Asm] 纯文本查看 复制代码

0042CCD | call flashdemostudio.42C9E0 | 关键call

F7跟进关键call,发现保存了一些常数,这些是变形TEA时用到的key

[Objective-C] 纯文本查看 复制代码
?0042CA1 | mov dword ptr ss:[esp+1C],55714BFA          | XTEA的key0042CA1 | mov dword ptr ss:[esp+20],5A6D0ED8          |0042CA2 | mov dword ptr ss:[esp+24],414264C1          | [esp+24]:L"3K6LFMLPCYPEPRFQML"0042CA2 | mov dword ptr ss:[esp+28],29223136          |0042CA3 | mov dword ptr ss:[esp+2C],31D52178          |0042CA3 | mov dword ptr ss:[esp+30],5920078F          |0042CA4 | mov dword ptr ss:[esp+34],83E76A0           |0042CA4 | mov dword ptr ss:[esp+38],7A4172F7          | [esp+38]:"3K6LFMLPCYPEPRFQML"
然后程序对注册码的第6位跟第17位作了互换,代码如下

[Asm] 纯文本查看 复制代码
?0042CA6 | mov al,byte ptr ss:[esp+41]                 | N6—->AL0042CA6 | mov cl,byte ptr ss:[esp+4C]                 | N17—->CL0042CA6 | mov byte ptr ss:[esp+4C],al                 | N6—>N170042CA6 | movsx eax,al                                |0042CA7 | mov byte ptr ss:[esp+41],cl                 | N17—->N6
接下来就是第二关,取注册码的第6位的ASCII码,对3取余,然后根据余数为0还是为1,交换不同的位。

[Asm] 纯文本查看 复制代码
?0042CA7 | mov ecx,3                                   | ecx:"3K6LFMLPCYPEPRFQML"0042CA7 | idiv ecx                                    | N6 MOD 3 然后判断余数0042CA7 | cmp edx,ebx                                 | 等于0就是下面的交换0042CA7 | jne flashdemostudio.42CAB1                  |0042CA8 | movzx edx,byte ptr ss:[esp+45]              | N10——>EDX0042CA8 | mov al,byte ptr ss:[esp+3C]                 | N1—>AL0042CA8 | mov cl,byte ptr ss:[esp+46]                 | N11—>CL0042CA8 | mov byte ptr ss:[esp+45],al                 | N1—>N100042CA9 | mov al,byte ptr ss:[esp+3D]                 | N2—>AL0042CA9 | mov byte ptr ss:[esp+3C],dl                 | N10—->N10042CA9 | movzx edx,byte ptr ss:[esp+44]              | N9—->EDX0042CA9 | mov byte ptr ss:[esp+46],al                 | N2—>N110042CAA | mov al,byte ptr ss:[esp+3E]                 | N3—>AL0042CAA | mov byte ptr ss:[esp+3D],cl                 | N11—>N20042CAA | mov byte ptr ss:[esp+3E],dl                 | N9—->N30042CAA | jmp flashdemostudio.42CAE4                  |0042CAB | cmp edx,1                                   | 等于1就是下面的交换0042CAB | jne flashdemostudio.42CAE8                  |0042CAB | movzx ecx,byte ptr ss:[esp+3E]              | N3—->ECX0042CAB | mov al,byte ptr ss:[esp+3C]                 | N1—->AL0042CAB | mov dl,byte ptr ss:[esp+45]                 | N10—->DL0042CAC | mov byte ptr ss:[esp+3E],al                 | N1—->N30042CAC | mov al,byte ptr ss:[esp+3D]                 | N2—->AL0042CAC | mov byte ptr ss:[esp+3C],cl                 | N3—->N10042CAC | movzx ecx,byte ptr ss:[esp+44]              | N9—->ECX0042CAD | mov byte ptr ss:[esp+45],al                 | N2—->N100042CAD | mov al,byte ptr ss:[esp+47]                 | N12—->AL0042CAD | mov byte ptr ss:[esp+3D],dl                 | N10—->N20042CAE | mov byte ptr ss:[esp+47],cl                 | N9—–>N120042CAE | mov byte ptr ss:[esp+44],al                 | N12—->N9
接下来就是第三关,注册码最后一位的校验,首先对变换后的注册码取第3到第14位的和

[Asm] 纯文本查看 复制代码
?0042CAF | movsx esi,byte ptr ss:[esp+eax+3D]          | N4,N10—>ESI0042CAF | movsx edx,byte ptr ss:[esp+eax+3C]          | N3,N9—>EDI0042CAF | add edx,esi                                 |0042CAF | movsx esi,byte ptr ss:[esp+eax+41]          | N8,N14—->ESI0042CB0 | add edx,esi                                 |0042CB0 | movsx esi,byte ptr ss:[esp+eax+3E]          | N5,N11—->ESI0042CB0 | add edx,esi                                 |0042CB0 | movsx esi,byte ptr ss:[esp+eax+40]          | N7,N13—>ESI0042CB0 | add edx,esi                                 |0042CB1 | movsx esi,byte ptr ss:[esp+eax+3F]          | N6,N12—>ESI0042CB1 | add esi,ecx                                 | ecx:"3K6LFMLPCYPEPRFQML"0042CB1 | add eax,6                                   |0042CB1 | cmp eax,E                                   |0042CB1 | lea ecx,dword ptr ds:[esi+edx]              | ecx:"3K6LFMLPCYPEPRFQML"
接下来就应该是比较有意思的事情了,下面的代码看上去比较复杂,后经过IDA的F5之后,居然就是对27求余,666,IDA是怎么做到的呢?

[Asm] 纯文本查看 复制代码
?0042CB2 | mov eax,4BDA12F7                            |0042CB2 | imul ecx                                    | ecx:"3K6LFMLPCYPEPRFQML"0042CB2 | sar edx,3                                   |0042CB2 | mov eax,edx                                 |0042CB2 | shr eax,1F                                  |0042CB3 | add eax,edx                                 |0042CB3 | mov dl,byte ptr ss:[esp+4D]                 | N18—>DL0042CB3 | imul eax,eax,1B                             |0042CB3 | sub ecx,eax                                 | ecx:"3K6LFMLPCYPEPRFQML"0042CB3 | cmp dl,byte ptr ds:[ecx+5D1808]             | 判断最后一位校验码
在上面的过程中,出现了合法字符的表"ABCEFGHJKLMNPQRSTWXY3456789",根据上面求得的余数,查表得到的字符跟最后一位要一致。
上面一关过了之后,接下来就是长长的验证了,首先将注册码的最后两位用00填充

[Asm] 纯文本查看 复制代码
?0042CB5 | mov byte ptr ss:[esp+4C],bl                 |0042CB5 | mov byte ptr ss:[esp+4D],bl                 | 添加00
接下来对这16个字符分成两部分处理,每8位转换成一个dword,然后进行变形的TEA解密和32次的轮换,先取16个字符的前8位,得到第8位在合法字符表中的位号

[Asm] 纯文本查看 复制代码
?0043E2B | sub eax,flashdemostudio.5D1808              | 得到N8,16在表中的位号—->eax0043E2C | cdq                                         |0043E2C | push edi                                    |0043E2C | sub eax,edx                                 |0043E2C | mov edi,eax                                 |0043E2C | sar edi,1                                   | 位号sar 1位 然后+10043E2C | add edi,1                                   |0043E2C | jns flashdemostudio.43E2D6                  |0043E2D | cmp edi,7                                   |0043E2D | jg flashdemostudio.43E328                   |0043E2D | test edi,edi                                |0043E2D | jle flashdemostudio.43E303                  |

这个结果是几,就从这8位中取几位出来,然后查表,分别得到这几位的位号,再转成27进制

[Asm] 纯文本查看 复制代码
?0043E31 | imul eax,eax,1B                             | 转成27进制0043E31 | add eax,dword ptr ss:[esp+ecx*4+8]          |0043E31 | sub ecx,1                                   |0043E31 | test ecx,ecx                                |0043E31 | ja flashdemostudio.43E310                   |
同样对后面8位做处理,也转成27进制,最后生成了两个dword,接下来对这两个dword进行变形的TEA解密

[Asm] 纯文本查看 复制代码
?0042CB8 | lea edi,dword ptr ss:[esp+10]               | 明文—–>EDI0042CB8 | lea esi,dword ptr ss:[esp+30]               | XTEA_KEY—->ESI0042CB8 | mov dword ptr ss:[esp+14],eax               | 保存上面的计算结果—–>[esp+14]0042CB9 | call flashdemostudio.43E220                 | XTEA_DE  解密
F7跟进去后,会看到一些熟悉的影子

[Asm] 纯文本查看 复制代码
?0043E22 | mov edx,dword ptr ds:[edi]                  | edx:"KLMNPQRSTWXY3456789"0043E22 | mov ecx,dword ptr ds:[edi+4]                |0043E22 | push ebx                                    | ebx:"CYPEPRFQ"0043E22 | mov eax,C6EF3720                            |0043E22 | push ebp                                    |0043E22 | lea esp,dword ptr ss:[esp]                  |0043E23 | mov ebx,edx                                 | ebx:"CYPEPRFQ", edx:"KLMNPQRSTWXY3456789"0043E23 | shr ebx,5                                   | ebx:"CYPEPRFQ"0043E23 | mov ebp,edx                                 |
接下来就对解密后的结果进行一个32次的轮换

[Asm] 纯文本查看 复制代码
?0042CBA | call flashdemostudio.43D8F0                 | 32次轮换
F7跟进会看到具体的过程

[Asm] 纯文本查看 复制代码
?0043D8F | lea esp,dword ptr ss:[esp]                  | [esp]:"3K6LFMLPCYPEPRFQML"0043D90 | mov eax,dword ptr ds:[ebx]                  |0043D90 | mov ecx,dword ptr ss:[esp+C]                |0043D90 | mov ecx,dword ptr ds:[ecx+eax*4]            | 取key0043D90 | add ecx,dword ptr ds:[edi]                  | 相加0043D90 | call flashdemostudio.43D850                 | 变换
跟进这个变换的函数,会看到8个表,应该也是16进制的变形

0043D91 | xor dword ptr ds:[esi],eax                  | 跟后面的异或0043D91 | mov edx,dword ptr ds:[edi]                  |0043D91 | mov eax,dword ptr ds:[esi]                  |0043D91 | sub ebx,4                                   |0043D91 | sub ebp,1                                   |0043D91 | mov dword ptr ds:[esi],edx                  | 交换位置0043D91 | mov dword ptr ds:[edi],eax                  |0043D92 | jne flashdemostudio.43D900                  |
实在是的点长,对上面的结果计算完了后,又对结果进行了一次变形的TEA解密和32次的轮换,这一次变形TEA的key跟前面的略有不同

[Asm] 纯文本查看 复制代码
?0042CBA | call flashdemostudio.43E220                 | XTEA_DE 解密0042CBA | mov ecx,esi                                 |0042CBB | push ecx                                    |0042CBB | lea esi,dword ptr ss:[esp+1C]               |0042CBB | call flashdemostudio.43D8F0                 | 32次轮换

搞的这么长真的好么,太尴尬了,然后对最终结果的特定位进行判断,如果相同,就注册成功

[Asm] 纯文本查看 复制代码
?0042CCE | je flashdemostudio.42CD23                   |0042CCE | cmp byte ptr ss:[esp+48],58                 | 58:’X’0042CCE | jne flashdemostudio.42CD23                  |0042CCE | cmp byte ptr ss:[esp+4B],46                 | 46:’F’0042CCE | jne flashdemostudio.42CD23                  |0042CCF | cmp byte ptr ss:[esp+4C],64                 | 64:’d’0042CCF | jne flashdemostudio.42CD23                  |0042CCF | cmp byte ptr ss:[esp+4F],4D                 | 4D:’M’0042CCF | jne flashdemostudio.42CD23                  |
那么问题来了,如何写出注册机呢?

声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。

原文链接:,转发请注明来源!

发表评论