windows下使用frida遇到的问题

就是一只无头苍蝇瞎几把撞

  • 因为要逆向分析调试APP所以必然要用到这玩意,百度安装教程有的直接让我cmd下运行pip install frida-tool,当然前提你得装了pip和python。
    结果显而易见一直卡在 Running setup.py install for frida
    百度:还需要安装frida,这是两个部分一个frida一个frida-tool。
    那就 pis install frida结果不但卡住还报错了,只能和当初下载pip一样手动下载了,这是链接,不会有人不知道要下载和本地对应的版本吧?不会吧不会吧?下完了之后把EGG文件放到python安装的资源目录类似 Python38\Lib\site-packages,当前文件夹下运行cmd使用运行 .\easy_install.py 你下载的文件全名。一闪而过后 frida应该安装完了,再运行tool应该就ok了。

  • 既然要调试APP那必然要链接手机啊,如果电脑没有安装模拟器或者Androidstudio的话还需要安装adb服务应用,随便在网上找个adb服务的安装包,解压后添加adb.exe到环境变量。然后cmd下adb version测试是否安装,如下
    在这里插入图片描述
    在这里插入图片描述

  • 我使用模拟器所以自带adb服务所以也可以不用上边的步骤
    我用的是MUMU,adb服务在MuMu\emulator\nemu\vmonitor\bin
    先看下模拟器的版本
    .\adb_server.exe shell
    getprop ro.product.cpu.abi
    在这里插入图片描述
    我的是X86,然后再从fird服务端下载对应版本的资源文件
    我就下载这个了在这里插入图片描述
    解压后使用adb命令移动到手机目录下
    adb push D:\insert\frida-server-14.2.3-android-x86 /data/local/tmp
    在这里插入图片描述
    我们先尝试直接运行
    在这里插入图片描述
    报错没权限,赋值权限 777 最高
    chmod 777 frida-server-14.2.3-android-x86
    再运行后发现没报错了,光标一直在浮动。
    再次尝试打开另一个CMD窗口运行 frida-ps -U 命令注意区分大小写,显示手机上运行的所有服务,证明frida算是配置好了。
    然后配置转发 adb forward tcp:27042 tcp:27042 你不转发的话客户端是链接不上服务端滴
    这里并没有打开模拟器的root权限,此处存疑。

  • 终于到了最头疼的编码部分了我淦
    首先我是反编译APP,这是一道逆向题
    在这里插入图片描述
    这个大体意思是获得输入的两个值,调用这个方法后返回来的值和这个字符串一样就进行下面的逻辑,姑且认为成功,而这个方法是调用第三方so库,又要用IDA进行反编译So文件
    在这里插入图片描述
    可以看到已经找到这个rowadata方法,这里有四个参数而我们java调用传参只有两个。我们选择性忽视前两个,前两个是相当于java实体类引用类什么的。a3和a4才是我们传的值。而第一个参数a3我们可以在java文件看到是传了个this,意义不大,a4才是我们的值。
    连猜带懵,查看第一个判断checksign方法==1,没用第四个参数a4而且里面逻辑看起来像是查看文件是否完整的我没看懂,所以我自动略过。
    而下面这个AES_128方法才是重头,用我们传的第四个参数和V11密钥进行加密。我们需要知道这个V11到底是什么东西,于是用到了frida

import frida
import sys

# adb connect 127.0.0.1:7555 链接模拟器
# adb forward tcp:27042 tcp:27042 转发27042端口frida服务端运行后默认占用这个端口
# adb shell 打开模拟器后端Linux系统并到本地frida路径下运行frida服务
# cmd命令运行python文件IDE里不会动态显示我不知道为什么


def on_message(message, data):
    if message['type'] == 'send':
        print(message['payload'])


jscode = """
    Java.perform(function() {
        var nativePointer = Module.findExportByName("libJNIEncrypt.so", "AES_128_ECB_PKCS5Padding_Encrypt");
        Interceptor.attach(nativePointer, {
            /* 顾名思义就是进入该函数前要执行的代码,其中args是传入的参数,一般so层函数第一个参数都是JniEnv,第二个参数是jclass
            从第三个参数开始才是我们java层传入的参数
            这个函数呢是函数中的函数所以我们直接按顺序取,不用排除前两个参数 */
            onEnter: function(args) {
                send("Hook start");
                console.log("args[0]=", Memory.readByteArray(args[0],20)); // 打印我们java层第一个传入的参数
                console.log("args[1]=", Memory.readByteArray(args[1],20)); // 打印我们java层传入的第二个参数
            },
            onLeave: function(result){ //是该函数执行结束要执行的代码,其中result参数即是返回值
                console.log("output",Memory.readByteArray(result,40))
            }
        });
    });
"""
# 得到设备并劫持进程com.example.testfrida(该开始用get_usb_device函数用来获取设备,但是一直报错找不到设备,改用get_remote_device函数即可解决这个问题)
process = frida.get_remote_device().attach("com.tencent.testvuln")
# 创建js脚本
script = process.create_script(jscode)
# 加载回调函数,也就是js中执行send函数规定要执行的python函数
script.on('message', on_message)
# 加载脚本
script.load()
sys.stdin.read()

启动之后我们运行app并输入参数
在这里插入图片描述
控制台可看到
在这里插入图片描述
打印出来到 AES_128_ECB_PKCS5Padding_Encrypt 方法的第一个参数即使我们输入的用户名+密码拼接起来的字符串,第二个参数则是那些莫名其妙的V11构成的key,现在我们知道AES的key和输出后的值,即java文件反编译的那个base64加密的代码。使用在线解密反向求出应该输入的正确的用户名和密码
在这里插入图片描述
返回来一个aimagetencent,这是两个字符串拼接起来的,结合项目名com.tencent.testvuln意识到要以tencent分割,即用户名为tencent密码为aimage,好输入之后,项目崩了,无所谓,这个题重要的是找加密方式来解密,其实做到这,这道题已经差不多完事了。但是这个题后面又经过变种,网上的writeup也很乱。感觉已经是为了坑你而坑你了。
项目崩了回到java项目中发现下一个路径是叫FileDataActivity的文件,里面同样有一个用so文件写的验证方法
在这里插入图片描述
反编译后发现方法和上面的so方法一模一样,如此再解密这个字符串 得到 Cas3_0f_A_CAK3
这个才是正确的flag。
总结一下这道题只能说让我了解了frida工具的使用,最后这个FileDataActivity操作是真的恶心人,我抄作业都恶心坏了让我真正做我心态早崩了

以下均为参考

https://blog.csdn.net/hujun5281/article/details/106516970
https://www.jianshu.com/p/c349471bdef7
https://blog.csdn.net/qq_38219875/article/details/107613804
https://www.52pojie.cn/thread-1128884-1-1.html
https://www.cnblogs.com/hongren/p/13489152.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值