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):

二、步骤

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

pip install frida-tools

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

frida --version

4、安卓端配置frida-server运行环境
  • 4.1 adb连接手机(这里采用有线连接,需要手机usb连接电脑,并开启开发者选项中的允许usb调试),cmd中输入命令(注意cmd工作目录):
adb tcpip 5555

在这里插入图片描述

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

在这里插入图片描述
下载链接:https://github.com/frida/frida/releases
frida-server
frida-server

  • 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文件
    在这里插入图片描述
    在这里插入图片描述
  • 5.2 打开assets/project/,以下main.js等就是我们需要的脚本,但此时得到的js文件打开后是乱码,是经过加密的
    在这里插入图片描述
    在这里插入图片描述
  • 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

在这里插入图片描述

  • 5.5 使用jd-gui打开jar文件,反编译其中的class文件,得到java文件
    在这里插入图片描述
  • 5.6 找到和解密有关的关键词decrypt所在位置
    在这里插入图片描述
  • 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'

在这里插入图片描述

  • 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

在这里插入图片描述

  • 6.5 手机端退出app后再重新启动,即可查看到目标app解密后的js脚本文件(十进制byte数组)
    在这里插入图片描述
    将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官方文档
一次autojs加密脚本的探秘
frida的用法–Hook Java代码篇

  • 4
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值