【Frida】【Android】03_RPC

🛫 系列文章导航

▒ 目录 ▒

    • [🛫 系列文章导航](#🛫 系列文章导航)
    • [🛫 导读](#🛫 导读)
    • [1️⃣ Android App解释](#1️⃣ Android App解释)
    • [2️⃣ 注入的js代码](#2️⃣ 注入的js代码)
    • [3️⃣ python控制端](#3️⃣ python控制端)
    • [4️⃣ 效果](#4️⃣ 效果)
    • [🛬 文章小结](#🛬 文章小结)
    • [📖 参考资料](#📖 参考资料)

🛫 导读

开发环境

版本号 描述
文章日期 2024-03-24
操作系统 Win11 - 22H2 22621.2715
node -v v20.10.0
npm -v 10.2.3
夜神模拟器 7.0.5.8
Android 9
python 3.9.9
frida 16.2.1
frida-tools 12.3.0
objection 1.11.0

1️⃣ Android App解释

过Frida存在两种操作模式,其中第一种命令行模式在之前的章节中一直使用,在这一节中,将介绍一些关于RPC模式以及使用RPC完成自动化的相关知识。

在Frida中,可以使用Python完成JavaScript脚本对进程的注入以及相应的Hook。

Java示例代码

参考《【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446》,我们需要通过python代码完成下面两个任务:

  • 每次调用secret()函数对字符串进行扩展。
  • 获取total这个实例变量的值。

2️⃣ 注入的js代码

注意事项:

  • 整体逻辑,不用通过Java.perform(rpc测试)执行,该函数是通过对rpc.exports赋值,实现rpc的功能导出。
  • 由于目标不是静态变量,我们需要对实例进行操作,所以,需要使用Java.choose动态获取。
  • 导出的对象中,必须使用全小写作为key,否则python访问不到。
js 复制代码
function rpc测试() {
  function CallSecretFunc(){
    Java.perform(function(){
      // 动态函数主动调用
      Java.choose('com.yemao.demo.MainActivity',{
        onMatch: function(instance){
          instance.secret()
        },
        onComplete: function(){
        }
      })
    })
  }
  function getTotalValue(){
    Java.perform(function(){
      // var MainAcitivity = Java.use('com.yemao.demo.MainActivity')
      // 动态函数主动调用
      Java.choose('com.yemao.demo.MainActivity',{
        onMatch: function(instance){
          //  console.log('instance found',instance)
          // instance.secret()
          console.log('total value = ',instance.total.value)
          // console.log('secret func exec success')
        },
        onComplete: function(){
          console.log('search Complete')
        }
      })
    })
  }
  rpc.exports = {
    gettotalvalue: getTotalValue,
    callfunc: CallSecretFunc,
    CallSecretFunc: CallSecretFunc
  }
}

rpc测试()

3️⃣ python控制端

  • 由于我们使用的是模拟器,需要使用frida.get_remote_device()获取设备对象device。对于真机,使用frida.get_usb_device()
  • 附加目标进程,使用的是device.attach,传参需要注意,一开始使用的是com.yemao.demo,没有效果。
    通过执行device.enumerate_processes(),打印所有进程,看到名称为demo,传递给device.attach才正常运行。
  • 读取js时,需要指定编码encoding='utf-8',否则会报错的。
python 复制代码
import frida

def on_message(message, data):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)


def main():
  # device = frida.get_usb_device()
  # device = frida.get_device_manager().add_remote_device('127.0.0.1:62025')
  device = frida.get_remote_device()
  print(device, device.enumerate_processes())
  # return

  # process = device.attach('com.yemao.demo')
  process = device.attach('demo')
  # process = device.attach('com.android.settings.intelligence')

  with open('./build/02.js', encoding='utf-8') as f:
      jscode = f.read()
  script = process.create_script(jscode)

  script.on('message', on_message)
  script.load()

  while True:
    command = input ("\nEnter command:\nl: Exit\n2: Call secret function\n3: Get Total Value\nchoice:")
    if command == "1":
      print('script.exports_sync = ', dir(script.exports_sync))
      break
    elif command== "2":#在这里调用
      script.exports_sync.callfunc()
    elif command == "3":
      script.exports_sync.gettotalvalue()
    elif command == "4":
      script.exports_sync.CallSecretFunc()

main()

4️⃣ 效果

测试流程:

  • 执行一次3: Get Total Value,获取修改前的total
  • 执行一次Call secret function,修改total
  • 再执行一次3: Get Total Value,获取修改后的total

    从图中可以看到,满足我们的预期,测试通过!!!

🛬 文章小结

  • 通过dir(script.exports_sync)可以打印所有的exports_sync内容['CallSecretFunc', 'callfunc', 'gettotalvalue'],这里面就是我们导出的三个函数。
    我们可以看到,其中是有区分大小写的方法CallSecretFunc的,但是如果通过rpc进行调用,又会报如下错误:

    所以,命名上,我们只可以写小写的rpc函数

📖 参考资料

相关推荐
怪兽20145 小时前
Android View, SurfaceView, GLSurfaceView 的区别
android·面试
龚礼鹏6 小时前
android 图像显示框架二——流程分析
android
消失的旧时光-19436 小时前
kmp需要技能
android·设计模式·kotlin
帅得不敢出门6 小时前
Linux服务器编译android报no space left on device导致失败的定位解决
android·linux·服务器
雨白7 小时前
协程间的通信管道 —— Kotlin Channel 详解
android·kotlin
TimeFine9 小时前
kotlin协程 容易被忽视的CompletableDeferred
android
czhc114007566310 小时前
Linux1023 mysql 修改密码等
android·mysql·adb
GOATLong11 小时前
MySQL内置函数
android·数据库·c++·vscode·mysql
onthewaying12 小时前
Android SurfaceTexture 深度解析
android·opengl
茄子凉心12 小时前
Android Bluetooth 蓝牙通信
android·蓝牙通信·bluetooth通信