最近在研究新版本某信发消息功能,下面先把发文字消息的逆向流程分享一下,有不足之处,请各位大佬指正。
工具
jadx
DDMS
Frida
AS smali动态调式
第一步 还是老方法,用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;
};
本文详细描述了作者通过逆向工程研究某信新版本发送文字消息功能的过程,包括使用DDMS追踪事件,Jadx查找代码,以及利用Frida和ASsmali进行动态调试,最终实现了对关键方法的Hook和操作。

826

被折叠的 条评论
为什么被折叠?



