微信怎么自动加好友java_Xposed-微信自动加好友功能实现
本帖最后由 hjw45611 于 2019-3-14 15:23 編輯
嚴重聲明
本文的意圖只有一個就是通過分析app學習更多的逆向技術,如果有人利用本文知識和技術進行非法操作進行牟利,帶來的任何法律責任都將由操作者本人承擔,和本文作者無任何關系,最終還是希望大家能夠秉著學習的心態閱讀此文。
前兩天有人想讓我做一個微信自動加好友的功能,今天就想試一試。
以微信6.6.7版本為例,手機root與Xposed框架安裝本文不做討論,如有需要查看論壇內其他帖子,本文只用于Xposed模塊編寫。
經壇友提醒,使用文本存儲手機號,在進行讀取for循環添加時,10個以上的時候就會產生操作過于頻繁的提醒,而且這個提醒大概一個小時才能解除。
經過優化后,增加了線程的sleep時間,可實現自動循環查看好友信息,但在運行到25個左右時也會觸發操作過于頻繁的提醒。
并且如果加好友的功能也增加上的話,也會由于加好友頻繁而被限制,所以最好是通過ContentProvider把大量手機號批量寫入到手機通訊錄數據庫中,然后使用微信的添加通訊錄好友的方式來添加好友,但有網友反應可用,也有網友反應加的多了收不到驗證信息,我也并未實驗, 以下分析流程就僅做參考吧。
至今(2019-03-14)微信自動加好友的分析已經完成,主要分三步:
1.查找好友(本文)
2.自動點擊添加好友按鈕進入驗證頁面
https://www.52pojie.cn/thread-886190-1-1.html
3.自動發送驗證信息
https://www.52pojie.cn/thread-897346-1-1.html
希望喜歡Xposed的朋友能交流學習,從中獲益。
1.首先查看微信加好友的頁面
是FTSAddFriendUI這個Activity。
2.使用jadx打開app,查找FTSAddFriendUI
3.尋找突破點
屏幕快照 2019-02-18 22.13.24.png (119.18 KB, 下載次數: 15)
2019-2-19 09:31 上傳
大體瀏覽后沒有類似EditView的實例對象,但發現一個內部類FTSAddFriendUI$5
屏幕快照 2019-02-18 17.49.34.png (307.29 KB, 下載次數: 9)
2019-2-19 09:31 上傳
-1通過簡單分析,確定這個內部類是搜索好友后的結果顯示
成功的話就intent跳轉,失敗的話就顯示該用戶不存在等錯誤信息
-2直接查找它的使用
是CM方法使用到它了,分析可得這個方法的參數就是輸入框的字符串,字符串不為空后進行查詢,并顯示一個正在查詢的Dialog,有結果后回調OnCancelListener,并且觸發內部類FTSAddFriendUI$5中的結果顯示方法。
屏幕快照 2019-02-18 17.52.33.png (144.55 KB, 下載次數: 8)
2019-2-19 09:32 上傳
Hook CM方法,打印string參數,發現就是輸入框的文本數據,確認CM方法就是要找的方法
-3xposed直接使用
[Java] 純文本查看 復制代碼final Class FTSAddFriendUIClass=loadPackageParam.classLoader.loadClass("com.tencent.mm.plugin.fts.ui.FTSAddFriendUI");
findAndHookMethod(FTSAddFriendUIClass,
"onCreate",Bundle.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
XposedHelpers.callMethod(param.thisObject,"CM","微信號/QQ號/手機號");
}
},1000);
}
});
searchUserErr.gif (709.39 KB, 下載次數: 8)
2019-2-19 09:33 上傳
-4解決問題
結果可以看到只有dialog,dialog結束后并沒有反應,但dialog能顯示說明代碼執行了,那就來看一下FTSAddFriendUI$5這個結果處理類里的方法有沒有執行吧。
[Java] 純文本查看 復制代碼findAndHookMethod("com.tencent.mm.plugin.fts.ui.FTSAddFriendUI$5",loadPackageParam.classLoader,
"a",int .class, int .class,String.class,XposedHelpers.findClass("com.tencent.mm.ab.l",loadPackageParam.classLoader) ,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
log("FTSAddFriendUI$5--0="+param.args[0]+"=1="+param.args[1]+
"=2="+param.args[2]);
}
});
打印結果如下:
2019-02-18 17:55:19.347 3872-3872/? I/Xposed: [17:55:19]:??FTSAddFriendUI$5--0=0=1=0=2=Everything is OK
搜索結果處理的方法執行了,說明問題不在CM方法,而是在處理方法中因為某個問題而停止了。
那就來分析一下這個a方法里的哪段代碼是有問題的吧。a方法完整代碼如下,
[Java] 純文本查看 復制代碼public final void mo2331a(int i, int i2, String str, C0879l c0879l) {
C1261g.m2963DF().mo8629b(106, (C0874e) this);
FTSAddFriendUI.this.aQA();
if (i == 0 && i2 == 0) {
FTSAddFriendUI.this.iJw = ((C9339f) c0879l).bcS();
if (FTSAddFriendUI.this.iJw.rHb > 0) {
if (FTSAddFriendUI.this.iJw.rHc.isEmpty()) {
C35785h.m67602a(FTSAddFriendUI.this, C8733g.search_contact_not_found, 0, true, null);
return;
}
Intent intent = new Intent();
intent.putExtra("add_more_friend_search_scene", 3);
if (FTSAddFriendUI.this.iJw.rHc.size() > 1) {
try {
intent.putExtra("result", FTSAddFriendUI.this.iJw.toByteArray());
C36379d.m70344b(FTSAddFriendUI.this.mController.tml, "subapp", ".ui.pluginapp.ContactSearchResultUI", intent);
return;
} catch (Throwable e) {
C3327x.printErrStackTrace("MicroMsg.FTS.FTSAddFriendUI", e, "", new Object[0]);
return;
}
}
((C33521h) C1261g.m2977l(C33521h.class)).mo24028a(intent, (biy) FTSAddFriendUI.this.iJw.rHc.getFirst(), FTSAddFriendUI.this.jvZ);
}
FTSAddFriendUI.this.jvX = 1;
FTSAddFriendUI.m48692g(FTSAddFriendUI.this);
} else {
switch (i2) {
case DownloadResult.CODE_CONNECTION_EXCEPTION /*-24*/:
C29477a eV = C29477a.m50825eV(str);
if (eV == null) {
FTSAddFriendUI.this.jvQ.setText(C8733g.no_contact_result);
break;
} else {
FTSAddFriendUI.this.jvQ.setText(eV.desc);
break;
}
case -4:
if (i != 4) {
FTSAddFriendUI.this.jvQ.setText(FTSAddFriendUI.this.getString(C8733g.search_contact_err_no_code));
break;
}
default:
FTSAddFriendUI.this.jvQ.setText(C8733g.no_contact_result);
break;
}
FTSAddFriendUI.this.jvX = -1;
FTSAddFriendUI.this.jvY = 1;
}
FTSAddFriendUI.m48693h(FTSAddFriendUI.this);
}
因為上面打印log時前兩個參數都是0,所以精簡后如下
[Java] 純文本查看 復制代碼public final void mo2331a(int i, int i2, String str, C0879l c0879l) {
C1261g.m2963DF().mo8629b(106, (C0874e) this);
FTSAddFriendUI.this.aQA();
if (i == 0 && i2 == 0) {
FTSAddFriendUI.this.iJw = ((C9339f) c0879l).bcS();
if (FTSAddFriendUI.this.iJw.rHb > 0) {
if (FTSAddFriendUI.this.iJw.rHc.isEmpty()) {
C35785h.m67602a(FTSAddFriendUI.this, C8733g.search_contact_not_found, 0, true, null);
return;
}
Intent intent = new Intent();
intent.putExtra("add_more_friend_search_scene", 3);
if (FTSAddFriendUI.this.iJw.rHc.size() > 1) {
try {
intent.putExtra("result", FTSAddFriendUI.this.iJw.toByteArray());
C36379d.m70344b(FTSAddFriendUI.this.mController.tml, "subapp", ".ui.pluginapp.ContactSearchResultUI", intent);
return;
} catch (Throwable e) {
C3327x.printErrStackTrace("MicroMsg.FTS.FTSAddFriendUI", e, "", new Object[0]);
return;
}
}
((C33521h) C1261g.m2977l(C33521h.class)).mo24028a(intent, (biy) FTSAddFriendUI.this.iJw.rHc.getFirst(), FTSAddFriendUI.this.jvZ);
}
FTSAddFriendUI.this.jvX = 1;
FTSAddFriendUI.m48692g(FTSAddFriendUI.this);
}
FTSAddFriendUI.m48693h(FTSAddFriendUI.this);
}
前面代碼分析后無問題,但 if (FTSAddFriendUI.this.iJw.rHb > 0) 判斷時不知rHb的值,此處需要hook一下。
[Java] 純文本查看 復制代碼findAndHookMethod("com.tencent.mm.plugin.fts.ui.FTSAddFriendUI$5",loadPackageParam.classLoader,
"a",int .class, int .class,String.class,XposedHelpers.findClass("com.tencent.mm.ab.l",loadPackageParam.classLoader) ,
new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
log("FTSAddFriendUI$5--0="+param.args[0]+"=1="+param.args[1]+
"=2="+param.args[2]+ "=rHb="+XposedHelpers.findField(XposedHelpers.findClass("com.tencent.mm.protocal.c.bja",loadPackageParam.classLoader),"rHb").get(XposedHelpers.callMethod((param.args[3]),"bcS"))
);
}
打印得知rHb=0,所以不會走if語句內的代碼,只有兩個方法m48692g與m48693h有可能有問題,按順序檢查參數
最終發現是這兩個方法中使用了FTSAddFriendUI的變量bWm,而在輸入框使用addTextChangedListener進行綁定后,bWm存儲了輸入的字符串,所以如果直接調用CM方法的話,導致bWm變量為空,所以解決方法如下:
[Java] 純文本查看 復制代碼final Class FTSAddFriendUIClass=loadPackageParam.classLoader.loadClass("com.tencent.mm.plugin.fts.ui.FTSAddFriendUI");
findAndHookMethod(FTSAddFriendUIClass,
"onCreate",Bundle.class,
new XC_MethodHook() {
@Override
protected void afterHookedMethod(final MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
XposedHelpers.setObjectField(param.thisObject,"bWm","微信號/QQ號/手機號");
XposedHelpers.callMethod(param.thisObject,"CM","微信號/QQ號/手機號");
}
},1000);
}
});
2019-02-19 09_24_57.gif (739.03 KB, 下載次數: 8)
2019-2-19 09:34 上傳
可以看到進入加好友界面后不需要輸入,直接進入好友詳情界面。
當然如果輸入數據搜索不到好友,結果處理方法的參數是
2019-02-18 17:58:34.082 3872-3872/? I/Xposed: [17:58:34]:??FTSAddFriendUI$5--0=4=1=-4=2=User do not exist
總結
以上是生活随笔為你收集整理的微信怎么自动加好友java_Xposed-微信自动加好友功能实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android常用类库包介绍
- 下一篇: Srping MVC入门推荐