目标官网: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 |
那么问题来了,如何写出注册机呢?声明:本站所有资源均由网友分享,如有侵权内容,请在文章下方留言,本站会立即处理。