根据这段数据,结合上面的语句可以看出,只有当eax的值为0x30-0x39,0x41-0x46或0x61-0x66时,[ecx+eax*2] and 0x80的值才不为0,否则会跳转至显示错误信息语句。其实,这就意味着SN的组成必须是数字0-9,及字母A-F或字母a-f。如果敏感一点儿,就应该感觉到SN是一个16进制的数字。
到这里,可能应该看出一些端倪,0x10001,这是很熟悉的东西,RSA算法中常用的公钥。再考虑到的上面的几条语句把edx即SN作为参数,然后把[0040C044]处很长的一串字符作为参数,把"10001"作为参数,调用的都是同一个函数004039A0,因此推测这里是对SN、[0040C044]对应的长字符和"10001"进行了初始化。[0040C044]对应的长字符其实就是RSA算法中的两个大质数之积n。并且,根据SN、n及0x10001最终计算出一个值V,V = (SN^0x10001) mod n 。
上面是最后的判断,[esp+D8]及ecx是由SN,n,和0x10001计算出来的值 V 所对应的一串字符,[esp+1A0]及edx则是Name,当两者相等时,则判断Name和SN是正确的。或者,换一个说法,就是Name的每个字符都使用16进制ASCII值表示,并联接在一起成为一个16进制数字,该数字与 (SN^0x10001) mod n 相等。