案例说明: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))