首页
社区
课程
招聘
[原创]老家伙玩时尚-某APP订阅音频文件解密
发表于: 2016-12-21 15:15 3309

[原创]老家伙玩时尚-某APP订阅音频文件解密

2016-12-21 15:15
3309

问题 :某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;
    }
  }


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//