案例说明: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脚本
- Java.perform(function(){
-
- var Arith = Java.use('com.example.junior.util.Arith')
-
- Arith.sub.overload('java.lang.String', 'java.lang.String').implementation = function(str1, str2){
-
- var result = this.sub(str1, "123")
-
- console.log('str1,str2,result => ', str1, str2, result)
-
- //通过JAVA中获取调用栈的方式进行打印
-
- console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()))
-
- return result
-
- }
-
- })
第十步:主动调用 编写hook脚本
- function callSub(){
-
- Java.perform(function(){
-
- var Arith = Java.use('com.example.junior.util.Arith')
-
- var JavaString = Java.use('java.lang.String')
-
- var result = Arith.sub(JavaString.$new('123'), JavaString.$new('122'))
-
- console.log("123 - 122 = ", result)
-
- })
-
- }
第十一步:rpc js脚本结合 py代码
js脚本
- function CallSub(a, b){
-
- Java.perform(function() {
-
- var Arith = Java.use('com.example.junior.util.Arith')
-
- var JavaString = Java.use('java.lang.String')
-
- var result = Arith.sub(JavaString.$new(a), JavaString.$new(b))
-
- console.log("a - b = ", result)
-
- })
-
- }
-
-
-
- rpc.exports = {
-
- sub: CallSub,
-
- };
py脚本
- #!/usr/bin/python
-
- # -*- coding:utf-8 -*-
-
- import sys
-
- import frida
-
-
- def on_message(message, data):
-
- if message['type'] == 'send':
-
- print("[*] {0}".format(message['payload']))
-
- else:
-
- print(message)
-
-
- devices = frida.get_usb_device()
-
- process = devices.attach('junior')
-
-
- with open('junior_sub_attach_rpc.js') as f:
-
- jscode = f.read()
-
-
- script = process.create_script(jscode)
-
- script.on('message', on_message)
-
- script.load()
-
-
- for i in range(20, 30):
-
- for j in range(0, 10):
-
- script.exports.sub(str(i), str(j))