在Hooking之前,快速测试方法是否可以hook
android hooking watch class_method com.aimi.android.common.service.c.f -
-dump-args --dump-return
当然,你需要先执行objection -g 挂载进程
不能实现直接hook 很多时候是因为该方法并非静态方法,那就需要实例化它的class
public interface c {
List<PackageInfo> A(Context context, boolean z);
boolean a();
byte[] b(byte[] bArr, byte[] bArr2);
byte[] c(byte[] bArr, byte[] bArr2);
byte[] d(byte[] bArr, byte[] bArr2);
String e(Context context, Long l);
String f(Context context, Long l);
String g(Context context, String str);
String h(Context context, String str, String str2);
String i(byte[] bArr);
String j(String str);
String k(byte[] bArr);
byte[] l(byte[] bArr);
int m();
我们可以看到c方法其实是一个接口
反混淆之后你能够看到一个大概的方法名和类目,直接用来搜索
以下是反混淆之后的类名
public interface InterfaceC2023c {
/* renamed from: A */
List<PackageInfo> mo23558A(Context context, boolean z);
/* renamed from: a */
boolean mo23555a();
/* renamed from: b */
byte[] mo23554b(byte[] bArr, byte[] bArr2);
/* renamed from: c */
byte[] mo23553c(byte[] bArr, byte[] bArr2);
/* renamed from: d */
byte[] mo23552d(byte[] bArr, byte[] bArr2);
/* renamed from: e */
String mo23551e(Context context, Long l);
/* renamed from: f */
String mo23550f(Context context, Long l);
/* renamed from: g */
String mo23549g(Context context, String str);
/* renamed from: h */
String mo23548h(Context context, String str, String str2);
frida帮助我们标注了之前的类名和方法名
我们直接用类名进行搜索
跟进去之后你能发现frida帮你标注好了它的原始类名 com.xunmeng.pinduoduo.secure.u
/* compiled from: Pdd */
/* renamed from: com.xunmeng.pinduoduo.secure.u */
/* loaded from: classes.dex */
public class C34708u implements InterfaceC2023c {
/* renamed from: B */
Integer f94116B;
/* renamed from: C */
Integer f94117C;
/* renamed from: D */
Long f94118D;
@Override // com.aimi.android.common.service.InterfaceC2023c
/* renamed from: p */
然后去jadx中搜索这个类 com.xunmeng.pinduoduo.secure.u ,在不反混淆的情况下直接在文件上点击右键即可复制名称
跟进去,你会发现很熟悉
然后我们回顾之前刚开始的时候,我们需要hook的是f方法,那直接在这里面搜索 f(
因为我们反混淆了,所以f方法我们找不到,不过没关系,frida帮我们标注了,所以我们直接搜索frida的注释:/ renamed from: f /
/* renamed from: f */
public String mo23550f(Context context, Long l) {
long m54538c;
if (C5611o.m93746p(134075, this, context, l)) {
return C5611o.m93739w();
}
if (AbTest.instance().isFlowControl("ab_timestamp_v2_5590", true)) {
m54538c = TimeStamp.getRealLocalTimeV2();
} else {
m54538c = C23083p.m54538c(TimeStamp.getRealLocalTime());
}
try {
return SecureNative.deviceInfo2(context, Long.valueOf(m54538c));
} catch (Throwable th) {
Logger.m95419e("PDD.SecureServiceImpl", "deviceInfo2 error, %s", th);
return null;
或者你可以反混淆回去搜索 public String f
此处内容需要评论回复后(审核通过)方可阅读。
安卓 Python+Frida Hook入门教程【简单Hook+RPC主动调用】
#frida.py
import frida # 导入frida模块
import sys # 导入sys模块
def on_message(message, data): # js中执行send函数后要回调的函数
print(message)
'''
spawn模式,Frida会自行启动并注入进目标App,Hook的时机非常早
'''
# device=frida.get_remote_device()
# pid=device.spawn(['com.jx885.reward']) #包名
# device.resume(pid)
# time.sleep(1)
# session = device.attach(pid)
'''
attach模式,Frida会附加到当前的目标进程中,即需要App处于启动状态,这也意味着只能从当前时机往后Hook,
'''
session = frida.get_remote_device().attach('驾培创业教练') #APPNAME
with open("./frida.js") as f:
script = session.create_script(f.read())
script.on('message', on_message) # 加载回调函数,也就是js中执行send函数规定要执行的python函数
script.load() # 加载脚本
currTime='20220619043925'
phone='13966552233'
type='1'
sign=script.exports.getsign(f'{currTime}{type}wocaonima{phone}')
print(sign)
#sys.stdin.read()
#frida.js
// Java.perform(function (){
// Java.use('com.jx885.library.http.CommAction').getSmscode.implementation=function (mi,mstr,mstr2){
// console.log(mi,mstr,mstr2);
// return this.getSmscode(mi,mstr,mstr2);
// }
// });
function sign(s){
var result='';
Java.perform(function (){
result=Java.use('com.jx885.library.http.network.HttpUtils').getStringMD5toUpperCase(s);
})
return result
}
rpc.exports={
getsign:sign
}