首先要感谢我的师哥 SIsIa同学 逆向的算法。
ps. 貌似俺俩还没师傅,此师哥是源于一次我让S大当师傅,他也非要拜师!然后就变成我师弟了,结果S大一直没出现!尴尬
【起因】装系统后,装一些必备的软件(eg。输入法, 音乐播放器,视频播放器,下载工具等等)时,干脆就全套安装了腾讯公司的那一整套,之前用的音乐播放器是千千静听,换成QQ音乐后,发现他的音乐文件是被加密过的。本人虽然水平菜,但是共享的精神却一点不比大牛们差!简单看了一下他是每8字节作为一个单元来加密的,如果文件最后剩下不到8字节就不加密了,所以他处理过的音乐文件的大小是不会发生变化的。用OD跟了一下,无果!(本人的逆向水平=0)还好师弟帮忙跟出了算法,于是就写了这个工具来恢复他们加密过的音乐文件。
很容易发现
0000 0000 0000 0000 加密后是 9844 06EB F036 6D19 (16进制)
AAAA AAAA AAAA AAAA 加密后是 ED9F 1EC8 2036 9FAE (16进制)
ps. 他加密过的音乐文件是存放在 ..\\cache\\加密后的文件名, cache是一个隐藏文件夹,加密过的音乐文件是数字命名,而且没有扩展名。
下面是师弟逆向的加密算法,我看了看加密算法 马上就弄出解密算法了,因为在R大的板块刚看了这个TEA算法,太巧!
这是Delphi语言,甚至我转化成C后 还以为是javascript,
代码:
{ pData 待加密的数据 pEncData 加密后的数据 } Function EncMusic(pData:PByte;pEncData:PChar;nLen:Integer=8):Integer; const Key1= $45AD9059; FKey1= $F03E934F; FKey2= $27BDB886; LKey1= $D0AAE945; LKey2= $993BA3AE; var FirstData,LastData,Count,Key:DWORD; begin Count:=32; Key:=0; FirstData:=PDWORD(pData)^; LastData:=PDWORD(DWORD(pData)+$4)^; if nLen>=8 then begin repeat Key:= Key+Key1; FirstData:=FirstData+ ((FKey2+LastData shl 4) xor (FKey1+ LastData shr 5) xor (Key+LastData)); LastData:=LastData+((LKey2 +FirstData shl 4) xor (LKey1+ FirstData shr 5) xor (Key+FirstData)); Dec(Count); until (Count=0); end; PDWORD(pEncData)^:= FirstData; PDWORD(DWORD(pEncData)+$4)^:= LastData; end;
代码:
void EncMusic(PDWORD pData, PDWORD pEncData) { DWORD Key1= 0x45AD9059; DWORD FKey1= 0xF03E934F; DWORD FKey2= 0x27BDB886; DWORD LKey1= 0xD0AAE945; DWORD LKey2= 0x993BA3AE; DWORD FirstData,LastData,Count,Key; Count=32; Key=0; FirstData = *pData; LastData = *(pData+1); do { Key= Key+Key1; FirstData=FirstData+ ((FKey2+(LastData<<4)) ^ (FKey1+ (LastData>>5)) ^ (Key+LastData)); LastData=LastData+((LKey2 +(FirstData<<4)) ^ (LKey1+ (FirstData>>5)) ^ (Key+FirstData)); Count--; }while(Count!=0); *pEncData = FirstData; *(pEncData+1) = LastData; }
是不是到这里就完了呢,当然可以说是完了,因为解密后的文件能正常播放了,但是我们发现一个很不好地方,那就是你转化完的音乐文件的名字乱七八糟的,想要不乱怎么办?那就解析音乐文件,直接读出他的音乐名。
mp3的文件格式 在附件里有一个说明,wma格式我今天才才查的,就找到附件里的那个txt,然后我们就可以解析文件名了!
ps:询问师弟怎样跟出算法(加解密算法在一个dll里面)的,他说好像是断 recv函数,我让他再跟一遍,他跟了好几次都失败了,我很伤心! 谁要是跟出算法了,麻烦贴一下学习学习。
再ps:师弟非常想找师傅!