锐速ServerCheck序列号生成原理

来源:互联网 发布:c语音判断质数的算法 编辑:程序博客网 时间:2024/06/01 08:42

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">下载   http://my.serverspeeder.com/d/ls/serverCheck.tar.gz ,解压后发现只有一个 ServerCheck.sh 脚本</span>

文件末端有乱码,看脚本发现,后部分是个压缩包,通过脚本本身提取出自身的文件执行整个ServerCheck的流程。

这边可以直接 

binwalk -e ServerCheck.sh
提取出apxbins这个压缩包,其中有sysid-32,sysid-64和apxinstall.sh

阅读apxinstall.sh 知道在64位机器上调用sysid-64计算序列号。

file sysid-64

发现是个静态链接libc,并且Strip了符号信息。


把该文件扔进ida,找到start函数最后的call之前的传参就是主函数。 [我是通过笨办法自己写了helloworld,并编译后,对比strip后版本和strip前版本得到的特征]



main的主流程




几个系统调用通过查表(http://blog.rchapman.org/post/36801038863/linux-system-call-table-for-x86-64)知道 



例如 16 -> ioctl 41->socket 系统调用的传参方式查看man syscall 就可知道


以上流程为 


如果传了命令行参数(例如wlan0),就会替换默认参数eth0,然后尝试打开socket,最后获取指定interface的HWADDR即mac地址。

ifreq.ifru_hwaddr.sa_data 共16字节,而mac只占6字节,其余补0。

之后的加密就是对这16字节的数组进行混淆。


用python写如下,先是第i位的值等于 第i%6的值+i , 之后就是第i位和第i+8位值相加,然后取低16位(2字节)。

arr = [MAC_ADDR] +[0x00]*10for i in range(16):    arr[i] = arr[i%6] + ifor i in range(8):    print hex((arr[i]+arr[i+8])%256),

整体上来说没什么难度,但是也看了我很久,还动用了remote linux debugger。果然有时候动态调试比静态逆向更能突破问题。


之后就是提交序列号,下了一个安装包。


接下来的研究就锐速是如何验证收费版和免费版。



0 0
原创粉丝点击