记录一次android逆向工程经历

2,090 阅读1分钟

1. 反编译

  • dex2jar生成jar文件然后通过jd-gui查看class文件
  • apktool解压apk

2. 查找相关关键字

  • apktool解压出的项目中查找如购买等关键字,发现其定义在string.xml文件中,并可以追溯到public.xml中其对应的 id。
  • 再对id进行搜索找到相关文件,然后回到jd-gui中查看相关逻辑(其中部分方法并未转成java代码而是字节码,可能是有相关的防范措施?)
  • 修改apktool解压的smali代码(类似汇编)改变逻辑,然后apktool打包生成apk文件并进行签名(安装后发现并未全部破解,部分文案仍然显示不全)

3. 数据库解密

  • 发现数据是从apk中所带的sqlite数据库中查出来的,在项目的res/raw文件夹下找到相关db文件
  • 然后数据库文件被sqlcipher加密过,在继续返回代码中查找xxx.db关键字,并找到获取数据库密码字符串方法
  protected String a() {
    char[] arrayOfChar = (new String(Base64.decode("w6PDl8OKw4fCtMK2w5rCssO0w6rDj8KzwrjCtMOk", 1))).toCharArray();
    for (byte b1 = 0; b1 < arrayOfChar.length; b1++)
      arrayOfChar[b1] = (char)(arrayOfChar[b1] ^ 0x80); 
    return (new StringBuilder(String.valueOf(arrayOfChar))).reverse().toString();
  }

对数据库解密后,查看数据库中内容,发现数据库内并未存储完整的内容,应该是需要从服务器下载更新

4. 从服务器获取内容

待续...