frida hook解密auto.js加密后的脚本

一、环境

windows:

  • python 3.0以上 :这篇博客中并未直接使用到python编程,只是在下载frida-tools时使用到了pip命令,所以若选择下载下面的工具包,就不需要配置python环境
  • adb环境 :电脑连接手机通过命令行进行操作
  • frida命令环境 :命令行执行frida命令
  • dex2jar :将dex文件转换成jar文件
  • jd-gui :将jar文件进行反编译,得到java源码文件

安卓手机:

  • root
  • frida-server服务器

工具包(frida-tools、adb、dex2jar 、jd-gui):

  • 链接:https://pan.baidu.com/s/1KTT-cTMhW3osm7nTUw5gWQ
  • 提取码:lgll
  • 注:下载后可直接跳至步骤中的第4步,无需python环境

二、步骤

1、windows安装python环境(3.0以上,自行百度)

2、windows安装adb环境(自行百度)

3、电脑端配置frida-tools命令环境

  • 3.1 cmd中使用python命令’pip’安装frida和frida-tools
> pip install frida
> pip install frida-tools

frida hook解密auto.js加密后的脚本_第1张图片

  • 3.2 可通过执行命令来查看是否安装成功
frida --version

frida hook解密auto.js加密后的脚本_第2张图片

4、安卓端配置frida-server运行环境

  • 4.1 adb连接手机(这里采用有线连接,需要手机usb连接电脑,并开启开发者选项中的允许usb调试),cmd中输入命令(注意cmd工作目录):
adb tcpip 5555

frida hook解密auto.js加密后的脚本_第3张图片

  • 4.2 根据自己的cpu版本下载frida服务端并解压(一般下载arm就可以了,我红米note7下载的是arm64)
    可以使用adb命令查看cpu版本(AArch64下载arm64就好):
adb shell cat /proc/cpuinfo

frida hook解密auto.js加密后的脚本_第4张图片
下载链接:https://github.com/frida/frida/releases
frida hook解密auto.js加密后的脚本_第5张图片
frida hook解密auto.js加密后的脚本_第6张图片

  • 4.3 依次执行以下命令将frida-server推送到手机中
> adb root
> adb push frida-server /data/local/tmp/frida-server
> adb shell "chmod 755 /data/local/tmp/frida-server"

5、反编译分析目标脚本app,定位解密方法位置

  • 5.1 将apk文件压缩为rar文件,双击打开压缩文件,再双击打开里面的apk文件
    frida hook解密auto.js加密后的脚本_第7张图片
    frida hook解密auto.js加密后的脚本_第8张图片
  • 5.2 打开assets/project/,以下main.js等就是我们需要的脚本,但此时得到的js文件打开后是乱码,是经过加密的
    frida hook解密auto.js加密后的脚本_第9张图片
    frida hook解密auto.js加密后的脚本_第10张图片
  • 5.3 我们不采用直接解密main.js文件的方法,而是hook的方式,所以我们需要回到上一步(根目录)中,得到classes.dex文件
  • 5.4 cmd使用dex2jar将classes.dex文件转变为classes-dex2jar.jar文件(注意使用d2j-dex2jar.bat命令时的工作目录,否则会出现“d2j-dex2jar.bat不是内部或外部命令”)
d2j-dex2jar.bat classes.dex

frida hook解密auto.js加密后的脚本_第11张图片

  • 5.5 使用jd-gui打开jar文件,反编译其中的class文件,得到java文件
    frida hook解密auto.js加密后的脚本_第12张图片
  • 5.6 找到和解密有关的关键词decrypt所在位置
    frida hook解密auto.js加密后的脚本_第13张图片
  • 5.7 确定decrypt是解密脚本文件的方法,记录下方法的全路径(com.stardust.autojs.engine.encryption.ScriptEncryption.decrypt)
  • 注:可以看到上面decrypt方法中返回值其实调用了另一个类中的decrypt方法,我们也可以点进去然后使用该方法的全路径,最终效果是一样的。

6、编写frida hook脚本以获得解密后的auto.js脚本文件

  • 6.1 根据上面得到的解密方法全路径(com.stardust.autojs.engine.encryption.ScriptEncryption.decrypt)编写frida hook脚本,下面代码保存为decrypt.js文件
if(Java.available){
     
    Java.perform(function(){
     
		function bytesToString(bytes){
     
			var str="{";
			for(var i = 0; i < bytes.length; i++) {
     
				str +=bytes[i]+","  
			} 
			return str+"0}";
		}
		var scriptEncryption= Java.use("com.stardust.autojs.engine.encryption.ScriptEncryption");
        scriptEncryption.decrypt.overload('[B',"int","int").implementation=function(paramArrayOfByte,paramInt1,paramInt2){
     
			var bytes=this.decrypt(paramArrayOfByte,paramInt1,paramInt2);
			//最终得到的结果是一个十进制的byte数组
            console.log("bytes is:"+bytesToString(bytes));
			return bytes
        }
    });
}
  • 6.2 cmd启动手机端的frida-server服务器,开启成功后会一直处于等待状态(停止为Ctrl+c
adb shell '/data/local/tmp/frida-server'

若之前的adb root失败,则这里需要修改为

adb shell 'su -c /data/local/tmp/frida-server'

frida hook解密auto.js加密后的脚本_第14张图片

  • 6.3 手机端运行目标脚本app
  • 6.4 在frida所在目录中启动一个新的cmd窗口,注入编写好的decrypt.js脚本(com.nys.fridatest是目标脚本app的包名,可用auto.js悬浮窗分析得到)
frida -U -l decrypt.js com.nys.fridatest --no-pause

frida hook解密auto.js加密后的脚本_第15张图片

  • 6.5 手机端退出app后再重新启动,即可查看到目标app解密后的js脚本文件(十进制byte数组)
    frida hook解密auto.js加密后的脚本_第16张图片
    将byte数组转为utf-8的String方法就很多了,才疏学浅没能用js搞定这个问题,所以使用java解析后的结果:
public class Bytes2String {
     
	public static void main(String[] args) throws UnsupportedEncodingException {
     
		byte[] b = {
      34, 117, 105, 34, 59, 13, 10, 118...};
		System.out.println((new String(b, "utf-8")).toString());
	}
}

frida hook解密auto.js加密后的脚本_第17张图片
参考博客:
frida官方文档
一次autojs加密脚本的探秘
frida的用法–Hook Java代码篇

你可能感兴趣的:(编程技术,auto.js,frida,hook)