Skip to content

Commit e0cff0d

Browse files
committed
commit
1 parent 1e793d0 commit e0cff0d

File tree

2 files changed

+110
-17
lines changed

2 files changed

+110
-17
lines changed

projects/XposedHookWeiXin7/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
**本工程目标——微信自动抢红包**
1+
**本工程目标——秒抢微信红包**
22

33
**本工程基于[微信7.0.4版本源码](./docs/weixin_7.0.4_source)**
44

Lines changed: 109 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,137 @@
11
package com.example.xposedhookweixin1;
22

3+
import android.app.Activity;
34
import android.content.ContentValues;
5+
import android.content.Intent;
6+
import android.os.Bundle;
47
import android.util.Log;
8+
import android.view.View;
9+
import android.widget.Button;
510

6-
import java.util.Arrays;
11+
import java.lang.reflect.Field;
712

813
import de.robv.android.xposed.IXposedHookLoadPackage;
914
import de.robv.android.xposed.XC_MethodHook;
1015
import de.robv.android.xposed.XposedHelpers;
1116
import de.robv.android.xposed.callbacks.XC_LoadPackage;
1217

18+
import static de.robv.android.xposed.XposedHelpers.findClass;
19+
1320
public class XposedHookWeixin implements IXposedHookLoadPackage {
1421

1522
private static final String weixinPackageName = "com.tencent.mm";
1623

24+
private static final String weixinLauncherUIName = weixinPackageName + ".ui.LauncherUI";
25+
26+
private static final String weixinLuchyMoneyUIName = weixinPackageName + ".plugin.luckymoney.ui.LuckyMoneyNotHookReceiveUI";
27+
28+
private static final String weixinLuchyMoneyDetailsUIName = weixinPackageName + ".plugin.luckymoney.ui.LuckyMoneyDetailUI";
29+
1730
private static final String weixinSqlitClassName = "com.tencent.wcdb.database.SQLiteDatabase";
1831

19-
private static final String TAG="xposed";
32+
private static final String TAG = "xposed";
2033

2134
@Override
2235
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
23-
if(lpparam.packageName.equals(weixinPackageName)) {
24-
addLuckyMoneyListener(lpparam);
36+
if (lpparam.packageName.equals(weixinPackageName)) {
37+
initHook(lpparam);
38+
hookNewMessage(lpparam);
39+
hookOpenLuckyMoney(lpparam);
40+
hookCloseLuckyMoneyDetailUI(lpparam);
2541
}
2642
}
2743

28-
private void addLuckyMoneyListener(XC_LoadPackage.LoadPackageParam lpparam) {
29-
Class sqlitCls=XposedHelpers.findClassIfExists(weixinSqlitClassName,lpparam.classLoader);
30-
if(sqlitCls!=null) {
31-
XposedHelpers.findAndHookMethod(sqlitCls, "insertWithOnConflict", //
32-
String.class, String.class, ContentValues.class,//
33-
int.class, new XC_MethodHook() {
34-
@Override
35-
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
36-
super.afterHookedMethod(param);
37-
Log.d(TAG,"数据库参数:"+ Arrays.toString(param.args));
44+
private String lastTalkerName = "";
45+
private String lastNativeUrl = "";
46+
private Activity launcherUiActivity;
47+
48+
/**
49+
* 初始化微信红包勾子
50+
*/
51+
private void initHook(XC_LoadPackage.LoadPackageParam loadPackageParam) {
52+
XposedHelpers.findAndHookMethod(weixinLauncherUIName, loadPackageParam.classLoader, //
53+
"onCreate", Bundle.class, new XC_MethodHook() {
54+
@Override
55+
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
56+
launcherUiActivity = (Activity) param.thisObject;
57+
}
58+
});
59+
}
3860

61+
/**
62+
* 过滤红包消息
63+
*/
64+
private void hookNewMessage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
65+
XposedHelpers.findAndHookMethod(weixinSqlitClassName, loadPackageParam.classLoader, //
66+
"insertWithOnConflict", String.class, String.class, //
67+
ContentValues.class, int.class, new XC_MethodHook() {
68+
@Override
69+
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
70+
Log.d(TAG, "table=" + param.args[0] + "\n");
71+
ContentValues contentValues = (ContentValues) param.args[2];
72+
if ("WalletLuckyMoney".equals(param.args[0])) {
73+
Log.d(TAG, "mNativeUrl:" + contentValues.getAsString("mNativeUrl"));
74+
lastNativeUrl = contentValues.getAsString("mNativeUrl");
75+
} else if ("message".equals(param.args[0]) //
76+
&& null != contentValues.getAsString("reserved") //
77+
&& contentValues.getAsString("reserved").contains("微信红包")) {
78+
Log.d(TAG, "talker:" + contentValues.getAsString("talker"));
79+
lastTalkerName = contentValues.getAsString("talker");
80+
Log.d(TAG, "content:" + contentValues.getAsString("content"));
81+
// 启动红包页面
82+
if (launcherUiActivity != null) {
83+
Intent paramau = new Intent();
84+
paramau.putExtra("key_way", 0);
85+
paramau.putExtra("key_native_url", lastNativeUrl);
86+
paramau.putExtra("key_username", lastTalkerName);
87+
paramau.putExtra("key_cropname", (String) null);
88+
XposedHelpers.callStaticMethod(findClass(
89+
"com.tencent.mm.bp.d", //
90+
loadPackageParam.classLoader), "b", launcherUiActivity,//
91+
"luckymoney", ".ui.LuckyMoneyNotHookReceiveUI", paramau);
92+
} else {
93+
Log.d(TAG, "launcherUiActivity == null" + "\n");
94+
}
95+
}
96+
}
97+
});
98+
}
99+
100+
/**
101+
* 触发开红包动作
102+
*/
103+
private void hookOpenLuckyMoney(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
104+
XposedHelpers.findAndHookMethod(weixinLuchyMoneyUIName, loadPackageParam.classLoader, "onResume", new XC_MethodHook() {
105+
@Override
106+
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
107+
Log.d(TAG, "LuckyMoneyNotHookReceiveUI");
108+
Field buttonField = XposedHelpers.findField(param.thisObject.getClass(), "nTE");
109+
final Button kaiButton = (Button) buttonField.get(param.thisObject);
110+
if (kaiButton.getVisibility() != View.VISIBLE) {
111+
((Activity) param.thisObject).finish();
112+
} else {
113+
kaiButton.postDelayed(new Runnable() {
114+
@Override
115+
public void run() {
116+
kaiButton.performClick();
117+
}
118+
}, 500);
39119
}
40-
});
41-
}
120+
}
121+
});
122+
}
123+
124+
/**
125+
* 关闭红包详情页
126+
*/
127+
private void hookCloseLuckyMoneyDetailUI(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
128+
XposedHelpers.findAndHookMethod(weixinLuchyMoneyDetailsUIName, loadPackageParam.classLoader, //
129+
"onCreate", Bundle.class, new XC_MethodHook() {
130+
@Override
131+
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
132+
((Activity) param.thisObject).finish();
133+
}
134+
});
42135
}
43136

44137
}

0 commit comments

Comments
 (0)