From f25f04f54eb2115bf9ec5052477c2971d0aa8255 Mon Sep 17 00:00:00 2001
From: wxs <18771603711@sina.cn>
Date: Wed, 7 Jun 2023 16:34:56 +0800
Subject: [PATCH] =?UTF-8?q?--user=3Dwxs=20=E5=A2=9E=E5=8A=A0=E8=BD=AC?=
=?UTF-8?q?=E5=8F=91=E6=B6=88=E6=81=AF=E5=8A=9F=E8=83=BD=EF=BC=8C=E5=8F=AF?=
=?UTF-8?q?=E6=89=93=E5=8C=85=E6=88=90jar=E7=9B=B4=E6=8E=A5=E8=BF=90?=
=?UTF-8?q?=E8=A1=8C=EF=BC=8C=E8=AF=A6=E6=83=85=E8=A7=81README.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
weChatHook-java/README.md | 29 +++
weChatHook-java/pom.xml | 37 +++-
.../com/example/client/WeChatHookClient.java | 10 +
.../service/WeChatHookNettyServer.java | 176 ++++++++++++++----
4 files changed, 217 insertions(+), 35 deletions(-)
create mode 100644 weChatHook-java/README.md
diff --git a/weChatHook-java/README.md b/weChatHook-java/README.md
new file mode 100644
index 0000000..be80b0f
--- /dev/null
+++ b/weChatHook-java/README.md
@@ -0,0 +1,29 @@
+#maven打包
+```aidl
+进入weChatHook-java项目根目录执行如下,命令进行打包
+
+mvn package
+
+打包完成后在target目录下找到
+weChatHook-java-1.0-jar-with-dependencies.jar
+文件就可以直接启动了
+```
+#启动命令
+####命令参数说明
+###port:监听的端口 默认端口19077
+###hookApi:消息转发的接口 为空不转发
+```aidl
+java -jar .\weChatHook-java-1.0-jar-with-dependencies.jar --port=9999 --hookApi=http://localhost:29099/api/demo/msg
+```
+#java接收hook消息示例
+```aidl
+@RequestMapping("/api/demo")
+public class DemoController {
+ @PostMapping("/msg")
+ public void getMsg(String msg){
+ JSONObject jsonObject = JSON.parseObject(msg);
+ jsonObject.forEach((k,v)->{
+ System.out.println(k+":"+v);
+ });
+}
+```
\ No newline at end of file
diff --git a/weChatHook-java/pom.xml b/weChatHook-java/pom.xml
index abda013..5fa9c97 100644
--- a/weChatHook-java/pom.xml
+++ b/weChatHook-java/pom.xml
@@ -6,7 +6,7 @@
org.example
weChatHook-java
- 1.0-SNAPSHOT
+ 1.0
8
@@ -38,5 +38,40 @@
netty-all
4.1.51.Final
+
+ junit
+ junit
+ 4.13.2
+ test
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+
+
+ true
+ com.example.service.WeChatHookNettyServer
+
+
+
+ jar-with-dependencies
+
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/weChatHook-java/src/main/java/com/example/client/WeChatHookClient.java b/weChatHook-java/src/main/java/com/example/client/WeChatHookClient.java
index dc187d7..df214cb 100644
--- a/weChatHook-java/src/main/java/com/example/client/WeChatHookClient.java
+++ b/weChatHook-java/src/main/java/com/example/client/WeChatHookClient.java
@@ -606,4 +606,14 @@ public class WeChatHookClient {
return JSON.parseObject(body);
}
+ @SneakyThrows
+ public static JSONObject hook(String url, String json) {
+ String body = Jsoup.connect(url)
+ .data("msg",json)
+ .method(Connection.Method.POST)
+ .timeout(1000)
+ .execute().body();
+ return JSON.parseObject(body);
+ }
+
}
diff --git a/weChatHook-java/src/main/java/com/example/service/WeChatHookNettyServer.java b/weChatHook-java/src/main/java/com/example/service/WeChatHookNettyServer.java
index 00e1459..600ed01 100644
--- a/weChatHook-java/src/main/java/com/example/service/WeChatHookNettyServer.java
+++ b/weChatHook-java/src/main/java/com/example/service/WeChatHookNettyServer.java
@@ -17,11 +17,11 @@ import io.netty.handler.codec.Delimiters;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
import io.netty.util.CharsetUtil;
+import io.netty.util.internal.StringUtil;
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStreamReader;
+import java.io.*;
import java.net.InetSocketAddress;
+import java.util.*;
/**
* @PACKAGE_NAME: com.example.service
@@ -34,56 +34,125 @@ public class WeChatHookNettyServer {
/**
* 直接启动main方法
+ *
* @param args
*/
public static void main(String[] args) {
- Integer hookPort = 19099;
+
+ Integer serverPort = 19077;
+
+ String hookApi = null;
+
+ for (String arg : args) {
+ System.out.println(arg);
+ if (arg.startsWith("--port")) {
+ serverPort = Integer.valueOf(arg.split("=")[1]);
+ }
+ if (arg.startsWith("--hookApi")) {
+ hookApi = arg.split("=")[1];
+ }
+ }
+
//1、注入
inject();
//2、开启hook
try {
- JSONObject result = WeChatHookClient.hook_msg("127.0.0.1", hookPort.toString());
+ JSONObject result = WeChatHookClient.hook_msg("127.0.0.1", serverPort.toString());
} catch (Exception e) {
System.out.println("hook 失败,请检查微信是否登录");
return;
}
//3、启动服务
- start(hookPort);
+ start(serverPort, hookApi);
}
/**
* 执行注入命令
*/
public static void inject() {
- ClassLoader classLoader = WeChatHookNettyServer.class.getClassLoader();
- //获取ConsoleInject 文件路径
- String ConsoleInject = classLoader.getResource("ConsoleInject.exe").getPath().replaceFirst("/", "");
- //获取 wxhelper.dll 文件路径
- String wxhelper = classLoader.getResource("wxhelper.dll").getPath().replaceFirst("/", "");
+ //
+ File consoleInjectTemp = null;
+ File wxhelperTemp = null;
+ try {
+ consoleInjectTemp = createTempFile("ConsoleInject", ".exe");
+ wxhelperTemp = createTempFile("wxhelper", ".dll");
- //ConsoleInject.exe -i WeChat.exe -p C:\Users\DELL\Desktop\injector\wxhelper.dll
- String command = ConsoleInject + " -i WeChat.exe -p " + wxhelper;
+ String ConsoleInject = consoleInjectTemp.getAbsolutePath();
- //重试3次
- int retryCount = 3;
- do {
- retryCount--;
- try {
- //检查登录状态
- JSONObject jsonObject = WeChatHookClient.check_login();
- //如果已登录不需要注入
- if (jsonObject.getInteger("code").equals(1)) {
- return;
+ String wxhelper = wxhelperTemp.getAbsolutePath();
+
+ //ConsoleInject.exe -i WeChat.exe -p C:\Users\DELL\Desktop\injector\wxhelper.dll
+ String command = ConsoleInject + " -i WeChat.exe -p " + wxhelper;
+
+ //重试3次
+ int retryCount = 3;
+ do {
+ retryCount--;
+ try {
+ //检查登录状态
+ JSONObject jsonObject = WeChatHookClient.check_login();
+ //如果已登录不需要注入
+ if (jsonObject.getInteger("code").equals(1)) {
+ return;
+ }
+ } catch (Exception e) {
+ System.out.println(e.getMessage() + "请确认微信已登录");
}
- } catch (Exception e) {
- System.out.println(e.getMessage() + "请确认微信已登录");
+ //执行注入命令
+ excuteShell(command);
+ } while (retryCount >= 0);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ return;
+ } finally {
+ ////如果不为空删除临时文件
+ if (Objects.nonNull(consoleInjectTemp)) {
+ consoleInjectTemp.delete();
}
- //执行注入命令
- excuteShell(command);
+ //如果不为空删除临时文件
+ if (Objects.nonNull(wxhelperTemp)) {
+ wxhelperTemp.delete();
+ }
+ }
- } while (retryCount > 0);
+ }
+
+ /**
+ * 创建临时文件
+ *
+ * @param fileName
+ * @param suffix
+ * @return
+ */
+ private static File createTempFile(String fileName, String suffix) {
+ InputStream inputStream = WeChatHookNettyServer.class.getResourceAsStream("/" + fileName + suffix);
+
+ FileOutputStream outputStream = null;
+ try {
+ File tempFile = File.createTempFile(fileName, suffix);
+ outputStream = new FileOutputStream(tempFile);
+ byte[] buffer = new byte[4096];
+ int bytesRead;
+ while ((bytesRead = inputStream.read(buffer)) != -1) {
+ outputStream.write(buffer, 0, bytesRead);
+ }
+ return tempFile;
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (Objects.nonNull(outputStream)) {
+ try {
+ outputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ }
+ return null;
}
/**
@@ -91,7 +160,7 @@ public class WeChatHookNettyServer {
*
* @param port
*/
- public static void start(Integer port) {
+ public static void start(Integer port, String hookApi) {
NioEventLoopGroup bossGroup = new NioEventLoopGroup();
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
try {
@@ -102,10 +171,10 @@ public class WeChatHookNettyServer {
.childHandler(new ChannelInitializer() {
@Override
protected void initChannel(SocketChannel ch) {
- ch.pipeline().addLast(new DelimiterBasedFrameDecoder(8192, Delimiters.lineDelimiter()));
+ ch.pipeline().addLast(new DelimiterBasedFrameDecoder(1024 * 100, Delimiters.lineDelimiter()));
ch.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));
ch.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));
- ch.pipeline().addLast(new ReceiveMsgHandler());
+ ch.pipeline().addLast(new ReceiveMsgHandler(hookApi));
}
})
.option(ChannelOption.SO_BACKLOG, 128)
@@ -124,12 +193,52 @@ public class WeChatHookNettyServer {
private static class ReceiveMsgHandler extends SimpleChannelInboundHandler {
+ private String hookApi;
+
+ public ReceiveMsgHandler(String hookApi) {
+ this.hookApi = hookApi;
+ }
+
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) {
- JSON.parseObject(msg).forEach((k, v) -> {
+ JSONObject jsonObject = JSON.parseObject(msg);
+
+ jsonObject.forEach((k, v) -> {
System.out.println(k + " = " + v);
});
- System.out.println("----------end----------");
+
+ String fromGroup = jsonObject.getString("fromGroup");
+ String fromUser = jsonObject.getString("fromUser");
+ String from;
+ if (fromGroup.equals(fromUser)) {
+ JSONObject fromGroupJson = WeChatHookClient.query_nickname(jsonObject.getString("fromGroup"));
+ String groupNname = fromGroupJson.getString("name");
+ from = "消息来自:" + groupNname;
+ jsonObject.put("fromUserName", groupNname);
+ } else {
+ JSONObject fromGroupJson = WeChatHookClient.query_nickname(jsonObject.getString("fromGroup"));
+ String groupNname = fromGroupJson.getString("name");
+
+ JSONObject fromUserJson = WeChatHookClient.query_nickname(jsonObject.getString("fromUser"));
+ String fromUserName = fromUserJson.getString("name");
+ jsonObject.put("fromUserName", fromUserName);
+
+ from = "消息来自:" + groupNname + "->" + fromUserName;
+ }
+ System.out.println("----------" + from + "----------");
+ //消息转发
+ if (StringUtil.isNullOrEmpty(hookApi)) {
+ return;
+ }
+ //检查api接口是否是通的
+ //转发消息
+ try {
+ WeChatHookClient.hook(hookApi, msg);
+ } catch (Exception e) {
+ //请检查hookApi服务是否正常
+ System.err.println("--》消息转发失败,请检查hookApi服务是否正常");
+ }
+
}
@Override
@@ -160,5 +269,4 @@ public class WeChatHookNettyServer {
e.printStackTrace();
}
}
-
}