首页 > 网名 正文
(微信名字有obj)微信名字有深意励志

时间:2023-05-29 作者:佚名

最近忙于工作,经过我‘咸鱼’的时间终于是有了些眉目,期间也走了许多弯路,现在做个笔记让也想学习的朋友们做个参考。

接收的图

发送的图

老规矩,来分析一波吧!

刚开始没发现,看这个布局分析得到微信的聊天列表和这个聊天界面在同一层级,导致我后面hook listview的时候老是跑到首页的的列表上。

看到了关键点-com. 在我的上篇的提到的ChattingUI$a类里面,这个才是正主。

那么接下来我们在看看撤回消息的时候到底发生了什么。消息是存到本地数据了的,至于为什么这么说,请继续看

com.

话说有这么个类,前面已经提到过与之关联的类ChattingUI$a 如果不知道为什么我找到后面几个关联类的请看前面的一篇帖子既可以联系起来

然后这个类里面没有什么实质性的东西,于是我就点开他的父类看了看

com.

发现了

com.

我不说其他人看到这个会怎么想,我平时自己写聊天应用的时候也会把聊天数据存储在数据库,于是乎开始hook起来

/*** 直接hook sql达到获取撤回消息id的目的** @param applicationContext* @param classLoader*/private void hookDB(final Context applicationContext, final ClassLoader classLoader) {

final Class sQLiteDatabase = X("com.", classLoader);

final Class cancellationSignal = X("com.;, classLoader);

if (sQLiteDatabase == null) return;

X("com.;,

classLoader,

sQLiteDatabase,

S,

Object[].class,

cancellationSignal,

new XC_MethodReplacement() {

@Override

protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {

Object[] objArr = (Object[]) [2];

String originalSql = [1].toString();

//打印所有调用SQLiteProgram的sql ("hookDB", "sql -> " + [1], "objArr:" + JSON.toJSONString(objArr)); if (objArr != null && originalSql.toUpperCase().startsWith("UPDATE MESSAGE")) {

for (Object obj : objArr) {

String sqlParam = obj.toString();//自己撤回10002 别人撤回10000 if ("10000")) {//别人撤回 Object[] newObjArr = new Object[2];

//[1] = "UPDATE message SET type=? WHERE msgId=?"; [1] = "select * from message where type=? and msgId=?";

[2] = newObjArr;

newObjArr[0] = 1;

newObjArr[1] = objArr[objArr.length - 1];

//[1] = "UPDATE message SET content=(select (select content from message where msgId = ?)||X'0D'||X'0A'||X'0D'||X'0A'||(\"wxInvoke卧槽,TA竟然要撤回上面的信息wxInvoke\")),msgId=?,type=? WHERE msgId=?"; LogU("hookDB", "originalSql->" + originalSql, "newSql->" + [1], "sqlParam->" + JSON.toJSONString(newObjArr));

WxChatInvokeMsg msg = new WxChatInvokeMsg();

m(newObjArr[1].toString());

WxC(applicationContext, msg);

}

}

}

return X, , );

}

});

}

看到上面我hook的是SQLiteProgram 会有朋友问为啥?

因为我SQLiteDatabase在里面找insert和update的方法发现里面最后走进入了SQLiteProgram 哈哈! 偷个懒我就不具体截图找给大家看了,然后把撤回的消息id记录在本地,作为后面标记的依据。

接下来开始处理撤回效果了

/** * 微信聊天界面 * * @param applicationContext * @param classLoader */ private void hookWxChatUIMM(final Context applicationContext, final ClassLoader classLoader) {

X("com.",

classLoader,

"onLayout",

boolean.class,

int.class,

int.class,

int.class,

int.class,

new XC_MethodHook() {

@Override

protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

(param);

ViewGroup mMPullDownView = (ViewGroup) ;// if () == View.GONE) return; for (int i = 0; i < mMPullDownView.getChildCount(); i++) {

View childAt = mMPullDownView.getChildAt(i);

if (childAt instanceof ListView) {

final ListView listView = (ListView) childAt;

final Listadapter adapter = li();

X(),

"getView",

int.class,

View.class,

ViewGroup.class,

new XC_MethodHook() {

@Override

protected void beforeHookedMethod(MethodHookParam param) throws Throwable {

(param);

int position = (int) [0];

View view = (View) [1];

JSONObject itemData = null;// LogU(position, view.toString()); if (position < ada()) {

itemData = JSON.parseObjec(position)), JSONObject.class);

int itemViewType = ada(position);// LogU(itemViewType); //经过以上代码可以知道 itemViewType == 1的时候打印的值是正常对话列表的值 if (itemData != null && (view != null && view.toString().contains("com.;))) {// if (itemData != null && itemViewType == 1 && (view != null && view.toString().contains("com.;))) { String field_msgId = i("field_msgId");

WxChatInvokeMsg wxChatInvokeMsg = WxC(applicationContext, field_msgId);

ViewGroup itemView = (ViewGroup) view;

View itemViewChild = i(0);

Object tag = i);

TextView textView;

if (tag == null) {

textView = new TextView(applicationContext);

);

(new LinearLayout.LayoutParam, ViewGroup.Layou));

i, textView);

);

i(textView);

} else {

textView = (TextView) i);

}

("");

);

if (wxChatInvokeMsg != null) {

(10, 5, 10, 5);

());

Color("#666666"));

View msgView = i(3);

Rela lp = (Rela) ();

lp.addRule);

lp.addRule, m());

lp.bottomMargin = 50;

("这小子想撤回这个消息");

);

LogU(position, view, itemViewType, i());

}

}

}// }

});

break;

}

}

}

});

}

记住hook 这个listview的时候会遇到我文章片头说的问题,导致每个item的view 对应错误,所以我加了过滤标识。

以上内容仅仅作为学习交流。代码很简单,乐趣在于找到这些代码位置的过程。

原文链接:[原创]Xposed第三课(微信篇) 防止好友消息撤回

本文由看雪论坛 KingZd 原创

转载请注明来自看雪社区

本文信息为网友自行发布旨在分享与大家阅读学习,文中的观点和立场与本站无关,如对文中内容有异议请联系处理。

本文链接:https://www.paituo.cc/wangming/1033096.html

  • 相关阅读

    微信名字有求必应—微信名字有意义的?

    微信名字有求必应,微信名字有意义的,微信名字取什么最好相关介绍,人和人的感情,有时候好像毛衣,织的时候一针一线,小心谨慎,拆的时候只要轻轻一拉,也许只是一句玩笑话,也许是无意间的一个小误会,所有的情感再也不见!友不在多,贵在风雨同行;情不论久,重在有求必应。早安!

    (微信名字后有尾巴)微信名字有意义的

    微信名字后有尾巴,微信名字有意义的,微信名字有哪些相关介绍,微信这个小妖精,隔三差五就有新花样。 前阵子拍一拍功能上线,大家趁机改昵称,搞出了很多有意思的玩法。 一夜之间,小虎妞发现大家又开始折腾小尾巴了。 喏,你们看。 每句话后面都挂着一句标志,相当让人鸡冻

    微信名字用颜文字—微信名字有什么好听的?

    微信名字用颜文字,微信名字有什么好听的,微信名字用什么相关介绍,大家平时在使用微信的过程中,肯定发现有的好友微信昵称前添加了很多“奇怪的”字符?颜文字表情? 小程序『花式昵称』,就是专门为这个而生的。 这款小程序包含各种各样的花式昵称、翅膀昵称网名、花字特效、em

    微信名字宝妈用微信名字有意义的

    微信名字宝妈用,微信名字有意义的,微信名字用什么相关介绍,有人说“90后是艰难的一代”,同时面临着工作和生活的双重压力,有宝宝之后更是感到心力交瘁,尤其是在疫情影响之下,肩上的担子就更重了。对此,不少母婴店针对消费者增添了多项贴心服务,让宝妈宝爸们轻松了不少

    微信名字有什么秘密、微信名字有什么好听的…

    微信名字有什么秘密,微信名字有什么好听的,微信名字叫什么好相关介绍,曾经一个朋友说,有个很久没联系的男孩子,半夜分享了一首歌给她,歌名叫《十二》,然后还说给她的微信备注也是“十二”。 她问我这个男孩是什么意思?问我怎么理解“十二”这个歌名,以及这首歌歌词的含义。 我说

    微信名字被用过了微信名字有什么好听的…

    微信名字被用过了,微信名字有什么好听的,微信名字用什么好相关介绍,11月3日,有网友在社交媒体发文,称自己发现凌晨微信被登录了。随后,多地网友表示,被陌生设备登录了,还有设备显示为的一串代码; ​ 这串字符很可能就是你自己的设备。因厂商设置等原因,同一设备在微信登录

    [微信名字有obj]微信名字有个小耳朵是什么意思

    微信名字有obj,微信名字有个小耳朵是什么意思,微信名字有obj虚线相关介绍,WeTest 导读 目前iOS主流的内存监控工具是Instruments的Allocations,但只能用于开发阶段。本文介绍如何实现离线化的内存监控工具,用于App上线后发现内存问题。 FOOM(F

    微信名字后有尾巴——微信名字有意义的?

    微信名字后有尾巴,微信名字有意义的,微信名字有哪些相关介绍,前几天堂堂给大家分享了一波,微信小尾巴修改的成iPhone 11 pro 装逼的图片。那有些果粉想要自定义文字的怎么办?只需要一个捷径规则即可实现自定义微信小尾巴。 首先需要下载「快捷指令」APP,在