-
-
[原创]老家伙玩时尚-某APP订阅音频文件解密
-
发表于: 2016-12-21 15:15 3290
-
问题 :某APP下载的音频文件不能在电脑上播放
工具 : apktool ,jd-gui ,eclipse
内容 :闲来无事,将订阅的luojisiwei栏目音频拷贝到电脑上,发现不能播放,于是逆性大发,研究半天终于搞定。
1)首先将该APP拷贝出来,用apktool弄出jar文件,用jd-gui 打开 找到 AESTool 类 ,在这之前找到 localAESTool 变量,能够由此搜到AES加密的password,我在这里也不说,自己找吧,毕竟我是付费订阅的。
2)主要的问题是getRawKey返回不对的问题,因此需要使用老版的程序来生成正确的key解密MP3文件,这是要命的函数,key就是password:
public static byte[] getRawKey(byte key[]) throws Exception
{
KeyGenerator keygenerator = KeyGenerator.getInstance("AES");
SecureRandom securerandom = new SecureRandom(new mycrypto.SHA1PRNG_SecureRandomImpl(),
null);//SecureRandom.getInstance("SHA1PRNG", "Crypto"); 注1
securerandom.setSeed(key);
keygenerator.init(128, securerandom);
return keygenerator.generateKey().getEncoded();
}
注1:原程序是这样,会异常,参见http://blog.sina.com.cn/s/blog_7d1c5c8601017fkh.html
不过新问题是SecureRandom 的构造函数不可见(其实是pretect),因此需要将java运行时的SecureRandom.java程序中的构造函数改为public,具体怎么修改我也不细说,度娘有好多的。
3)这里需要老版本的Crypto,因此下载 android-4.0-ics-src 找到
android-4.0-ics-src\org\apache\harmony\security\provider\crypto 目录
在eclipse下新建工程,将该目录如下文件加入(具体操作我就不说了)package mycrypto;
SHA1_Data.java
RandomBitsSupplier.java
CryptoProvider.java
SHA1Impl.java
SHA1PRNG_SecureRandomImpl.java
仿照APP的函数AESCipher(String s, String s1, String s)写一个解密函数,再把手机中的audio文件夹下的所有MP3拷贝出来,遍历文件夹调用AESCipher进行解密即可:
public static boolean AESCipher(String s, String s1, String s2) throws Exception
{
try {
boolean flag = false;
byte abyte0[] = getRawKey( s2.getBytes() );
Cipher cipher = Cipher.getInstance("AES/CFB/NoPadding");
File file = new File(s);
File file1 = new File(s1);
RandomAccessFile rfile1 = new RandomAccessFile(file, "r");
RandomAccessFile rfile2 = new RandomAccessFile(file1, "rw");
FileChannel filechannel1 = rfile1.getChannel();
FileChannel filechannel = rfile2.getChannel();
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(abyte0, "AES"), new IvParameterSpec(new byte[cipher.getBlockSize()]));
for (ByteBuffer bytebuffer = ByteBuffer.allocate(10240); filechannel1.read(bytebuffer) != -1; bytebuffer.clear())
{
bytebuffer.flip();
byte abyte1[] = new byte[bytebuffer.remaining()];
bytebuffer.get(abyte1, 0, abyte1.length);
filechannel.write(ByteBuffer.wrap(cipher.doFinal(abyte1)));
}
filechannel1.close();
filechannel.close();
rfile1.close();
rfile2.close();
return flag;
}
catch (Exception e)
{
// TODO Auto-generated catch block
e.printStackTrace();
return false;
}
}
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
赞赏
- [原创]老家伙玩时尚-某APP订阅音频文件解密 3291
- [原创]Molebox 4.5462 脱壳及VFS分析 16530
- [原创]彩虹狗无狗脱,入口点及Key搜索 10421
- [原创]TheXenocodeSolution .NET源代码 14276
- [原创]爆破一个注册表修复工具 9013