初步使用frida

Frida配置

1、下载frida-server解压push到手机、增加可执行权限

adb push frida-server /data/local/tmp/
adb shell
#管理员权限
su
cd /data/local/tmp
chmod 777 frida-server
#加&表示后台运行,也可以不加
./frida-server&

2、电脑安装frida

pip install frida
pip install frida-tools

可以直接安装frida-tools,系统默认会跟你安装对应的frida版本

3、测试安装

frida-ps -U

windows运行,端口转发到PC
adb forward tcp:27043 tcp:27043
adb forward tcp:27042 tcp:27042

frida使用

1、代码模板

`

点击查看代码
Java.perform(
  function(){
  //hook代码  
  }
)
`

2、hook方式

两种启动hook方式:
1、attach 进程名: APP启动后在hook,不能hook app启动阶段

2、spawn: 重启APP,适合hook app启动阶段

3、hook类

```
1、访问成员变量写法:
  this.变量名.value
2、hook匿名类写法:
  Java.use('类$类') smali文件中找
3、从匿名类/内部类访问外部类的属性写法:
  this.this$0.value.外部类的属性名.value
4、新建一个对象写法 new
  类.方法名.$new(参数)
 例如: StringBuffer stringBuffer = new StringBuffer();
 hook: var stringbuffer = Java.use('java.lang.StringBuffer').$new()

5、重载方法
  类.方法名.overload(参数1、参数2...).implementation
6、hook 构造方法
  类.$init()。implementation
```

详解一下:

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

test = """
Java.perform(
    function(){
        var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity')
        MainActivity.onClick.implementation = function(v){
            this.onClick(v)
            console.log('mmm:'+this.m.value)
            console.log('nnn:'+this.n.value)

        }

        var TT = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity$1')
        // 匿名类的调用
        TT.run.implementation = function(){
            //匿名类调用外部的变量
            this.this$0.value.m.value = 1
            this.this$0.value.n.value = 2
            this.run()
        }
    }
)
"""

# 两种启动方式

# 启动方式1
process = frida.get_usb_device(-1).attach('com.example.seccon2015.rock_paper_scissors')
script = process.create_script(test)
script.on('message', on_message)
script.load()
sys.stdin.read()

# 启动方式2 spawn 重启APP 可以hook APP启动阶段
# device = frida.get_usb_device(-1)
# pid = device.spawn(['com.example.seccon2015.rock_paper_scissors'])
# process = device.attach(pid)

# script = process.create_script(test)
# script.on('message', on_message)
# print('[*] Running')
# script.load()

# device.resume(pid)

# sys.stdin.read()

查找程序包名的方法

1、找到开始文件中的package中的名称

2、进程中查找,过滤进程

pa-A | grep com.xxx

posted @ 2021-11-08 00:34  是四不是十  阅读(521)  评论(0编辑  收藏  举报