我写代码一直秉持追求的是效率和代码所能产出的价值。所以有些时候有些代码项目不值得去细扣还原,业务做的久了你就知道哪些项目是一次性项目,当你哼哧哼哧的APP逆向从Java层跑到so层,然后再用python还原出来,嗯……
从技术角度来说确实挺屌的,但是和你一起对接合作的运营和商务,他们因为等着要东西,只觉得你的速度好慢你好菜。
先不说别的了,就说RPC吧,什么是Frida-RPC,百度了一下好枯燥我不复制了,你们想知道自己百度一下吧,我的博客里不允许出现这么枯燥无味的东西。
我个人的理解是,APP本身就是一个应用程序,说白了他就是一坨代码,他自身也会执行他的那些代码,我们用Frida调用他的加密代码,然后再用RPC技术把结果返回给我们。就这么个流程
因为这两个模块我总是用到,所以我想把这两个模块的代码贴到这里,也算是记录一下。
# 打印参数或者说加密结果
import frida # 15.1.10
import sys
def on_message(message,data):
"""
js中执行send函数后要回调函数
:param message:
:param data:
:return:
"""
print(message)
'''
模式一:spawn模式,Frida会自行启动并注入目标APP,Hook的时机
还未实操过
'''
# device = frida.get_remote_device()
# pid = device.spawn(['']) #包名i,或者说是进程名吧
# device.resume(pid)
# time.sleep(1)
# session = device.attach(pid)
'''
模式二:attach
'''
session = frida.get_remote_device().attach('APP名') #PID也行
with open("JavaScript/1.js") as f:
script = session.create_script(f.read())
script.on('message',on_message)
script.load()
sys.stdin.read()
// 1.js
Java.perform(function (){
console.log("i am here")
var asd = Java.use('com.jx885.library.http.CommAction') //包名.类名
asd.getSmscode.implementation = //方法名
function (i,str1,str2) {
console.log(i,str1,str2)
return this.getSmscode (i,str1,str2)
}
})
如果是已经找到了加密入口,用RPC调用的话,就和上面代码有所不同,不过其中的底层原理还是一样的,代码我再贴一下。以防自己以后忘了,哈哈哈
import frida,sys
def on_message(message,data):
"""
js中执行send函数后要回调函数
:param message:
:param data:
:return:
"""
print(message)
'''
模式二:attach
'''
session = frida.get_remote_device().attach('APP名')
with open('JavaScript/dome3_.js') as f:
script = session.create_script(f.read())
script.on('message',on_message)
script.load()
# sys.stdin.read()
# {"sign":"E71B5C3EF77033187A0BC7BB405053BE",
# "currTime":"20220708115952",
# "phone":"************",
# "type":"1"}
currTime = '20220708115952'
phone = '13252253402'
type = '1'
sign = script.exports.getsign(f'{currTime}{type}wocaonima{phone}')
print(sign)
function sign(str1) {
var result = '';
Java.perform(function () {
result = Java.use('com.jx885.library.http.network.HttpUtils').getStringMD5toUpperCase(str1);
})
console.log(">>>",result)
return result
}
rpc.exports = {
getsign:sign
}
=============================补充========================
Java.choose("路径.类名", {
onMatch: function (instance) {
console.log(instance.成员变量.value)
},
onComplete: function () { }
});
==========================补充2==============================
因为我用的是模拟器,启动Frida的时候需要一些额外步骤,我就都写下来吧。
#逍遥模拟器进入adb
'adb connect 127.0.0.1:21513'
'adb forward tcp:27042 tcp:27042'
'adb forward tcp:27043 tcp:27043'