• objection 基础案例 一


    案例说明:Hook 某个APP里面的计算器功能进行减法Hook的出结果,并且做成主动HOOK结合python的RPC

    截图说明:

    一:示例 APP junior

    二: APP 主页面 (简单计算器)

     三:简单计算器主页面

     第一步:找到目标APP的唯一包名。

    两个方法:

    1、用jadx直接反编译查看androidmanifest.xml文件里面的

     2、就是载没打开的这个APP的情况下查看正在运行的程序列表frida-ps -U,然后在打开APP在查看运动的APP列表坐下差大概判断下。

    第二步:HOOK APP开始

    objection -g com.example.junior explore

    第三步:objection 遍历APP所有activity(活动)

     第四步:测试这个活动是不是 计算器 的活动,那就是启动这个活动

    第五步:启动了说明找对了,用jadx找到 CalculatorActivity.java 类,然后看到一堆的点击事件

     第六步:接下来就hook这个类CalculatorActivity下面的所有方法,定位到 caculate() 这个方法

     第七步:定位到 caculate() 这个方法,hook 这个方法

     

    第八步:jadx 找到这个方法 HOOK 到减法类 Arith下的sub方法,测试下

     

     第九步:确定了方法定位后 编写hook脚本

    1. Java.perform(function(){
    2. var Arith = Java.use('com.example.junior.util.Arith')
    3. Arith.sub.overload('java.lang.String', 'java.lang.String').implementation = function(str1, str2){
    4. var result = this.sub(str1, "123")
    5. console.log('str1,str2,result => ', str1, str2, result)
    6. //通过JAVA中获取调用栈的方式进行打印
    7. console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()))
    8. return result
    9. }
    10. })

    第十步:主动调用 编写hook脚本

    1. function callSub(){
    2. Java.perform(function(){
    3. var Arith = Java.use('com.example.junior.util.Arith')
    4. var JavaString = Java.use('java.lang.String')
    5. var result = Arith.sub(JavaString.$new('123'), JavaString.$new('122'))
    6. console.log("123 - 122 = ", result)
    7. })
    8. }

    第十一步:rpc js脚本结合 py代码

    js脚本

    1. function CallSub(a, b){
    2. Java.perform(function() {
    3. var Arith = Java.use('com.example.junior.util.Arith')
    4. var JavaString = Java.use('java.lang.String')
    5. var result = Arith.sub(JavaString.$new(a), JavaString.$new(b))
    6. console.log("a - b = ", result)
    7. })
    8. }
    9. rpc.exports = {
    10. sub: CallSub,
    11. };

    py脚本

    1. #!/usr/bin/python
    2. # -*- coding:utf-8 -*-
    3. import sys
    4. import frida
    5. def on_message(message, data):
    6. if message['type'] == 'send':
    7. print("[*] {0}".format(message['payload']))
    8. else:
    9. print(message)
    10. devices = frida.get_usb_device()
    11. process = devices.attach('junior')
    12. with open('junior_sub_attach_rpc.js') as f:
    13. jscode = f.read()
    14. script = process.create_script(jscode)
    15. script.on('message', on_message)
    16. script.load()
    17. for i in range(20, 30):
    18. for j in range(0, 10):
    19. script.exports.sub(str(i), str(j))

  • 相关阅读:
    跨域的十种解决方案详解(总结)
    C++启航跟沸羊羊有关系吗?
    阿里云专利缴费小程序丨如何在一分钟为多项专利缴费?
    期货开户应该了解的行内知识
    CSS 布局
    全面解读 SQL 优化 - 统计信息
    Windows与网络基础-23-传输介质-双绞线
    下载huggingface预训练模型到本地并调用
    2022年千元半入耳式蓝牙耳机,高性价比蓝牙耳机推荐
    微服务绕不过的坎-服务雪崩
  • 原文地址:https://blog.csdn.net/zhaoxiaoba123/article/details/127608337