Xposed新版本某信发消息
本帖最后由 影月 于 2023-9-9 12:33 编辑最近在研究新版本某信发消息功能,下面先把发文字消息的逆向流程分享一下,有不足之处,请各位大佬指正。
第一步,还是老方法,用DDMS跟踪发消息时的点击事件。
然后去jadx里查这块代码。
没反编译出来onClick里的代码。可以去MT管理器里看看。
找出来是个接口。右键查找用例,去看这个接口的实现类。
看到只有这一个类,实现了这个接口。
现在主要分析这个g6方法。
为了确认一下,下面用AS动态调试
然后进入下面的g方法里。
去DDMS里找这个run方法里的调用流程。也可以AS动态调试。我这里用的DDMS,还方便点。
// 在java空间中加载
Java.perform(function () {
if (Java.available) {//判断是否在java空间
let u = Java.use("ie0.u");
u["$init"].overload('java.lang.String', 'java.lang.String', 'int', 'int', 'java.lang.Object').implementation = function (str, str2, i15, i16, obj) {
console.log(`u.$init is called: str=${str}, str2=${str2}, i15=${i15}, i16=${i16}, obj=${obj}`);
this["$init"](str, str2, i15, i16, obj);
// printStacks("send text==========")
};
hook到了创建ie0.u对象的构造方法,所传的参数。
然后就是想办法调用hd0.b0类里的g方法。方法里第一个参数传上面构造好的ie0.u对象,第二个参数传0
看到它是个动态方法。所以先要把hd0.b0对象拿到,才能调这个方法。
可以从内存里取这个对象,然后再主动调用。代码如下:
let SQLiteDatabase = Java.use("com.tencent.wcdb.database.SQLiteDatabase");
SQLiteDatabase["insertWithOnConflict"].implementation = function (str, str2, contentValues, i15) {
console.log(`SQLiteDatabase.insertWithOnConflict is called: str=${str}, str2=${str2}, contentValues=${contentValues}, i15=${i15}`);
let result = this["insertWithOnConflict"](str, str2, contentValues, i15);
console.log(`SQLiteDatabase.insertWithOnConflict result=${result}`);
let content = contentValues.get("content");
console.log(`content ====>${content}`);
if (content == null) {
return result;
}
if (content.toString() === 'sendtext') {//对方发来sendtext后,再回复他
let talker = contentValues.get("talker");
console.log(`talker ====>${talker}`);
let uObj = Java.use("ie0.u").$new(talker, '测试0', 1, 0, null);
Java.choose("hd0.b0",{
onComplete: function(){},
onMatch: function(instance){// 遍历所有的对象并调用
instance.g(uObj,0);
}
})
}
return result;
};
运行frida脚本,测试成功!
页:
[1]