x1ongzhu 1 year ago
parent
commit
86dc17bc87

BIN
.idea/copilot/chatSessions/00000000000.xd


BIN
.idea/copilot/chatSessions/blobs/version


+ 0 - 53
.idea/copilot/chatSessions/xd.lck

@@ -1,53 +0,0 @@
-Private property of Exodus: 15173@DrewdeMBP.lan
-
-jetbrains.exodus.io.LockingManager.lock(LockingManager.kt:88)
-jetbrains.exodus.io.LockingManager.lock(LockingManager.kt:39)
-jetbrains.exodus.io.FileDataWriter.lock(FileDataWriter.kt:70)
-jetbrains.exodus.log.Log.tryLock(Log.kt:804)
-jetbrains.exodus.log.Log.<init>(Log.kt:117)
-jetbrains.exodus.env.Environments.newLogInstance(Environments.kt:117)
-jetbrains.exodus.env.Environments.newLogInstance(Environments.kt:81)
-jetbrains.exodus.env.Environments.newLogInstance(Environments.kt:77)
-jetbrains.exodus.env.Environments$newInstance$4.invoke(Environments.kt:46)
-jetbrains.exodus.env.Environments$newInstance$4.invoke(Environments.kt:46)
-jetbrains.exodus.env.Environments.prepare(Environments.kt:120)
-jetbrains.exodus.env.Environments.newInstance(Environments.kt:46)
-kotlinx.dnq.store.container.EntityStoreHelperKt.createTransientEntityStore(EntityStoreHelper.kt:40)
-kotlinx.dnq.store.container.EntityStoreHelperKt.createTransientEntityStore(EntityStoreHelper.kt:31)
-kotlinx.dnq.store.container.EntityStoreHelperKt.createTransientEntityStore$default(EntityStoreHelper.kt:30)
-com.github.copilot.chat.session.persistence.xodus.XdChatSessionPersistenceService.initStore(XdChatSessionPersistenceService.kt:115)
-com.github.copilot.chat.session.persistence.xodus.XdChatSessionPersistenceService.<init>(XdChatSessionPersistenceService.kt:22)
-com.github.copilot.chat.session.persistence.xodus.XdChatSessionPersistenceService.<init>(XdChatSessionPersistenceService.kt:15)
-com.github.copilot.chat.session.persistence.ChatSessionPersistenceServiceKt.ChatSessionPersistenceService(ChatSessionPersistenceService.kt:43)
-com.github.copilot.chat.session.persistence.ChatSessionPersistenceServiceKt.chatSessionsPersistenceService(ChatSessionPersistenceService.kt:53)
-com.github.copilot.chat.session.ChatSessionManager.<init>(ChatSessionManager.kt:45)
-com.github.copilot.chat.session.ChatSessionManager.<init>(ChatSessionManager.kt:25)
-com.github.copilot.chat.window.CopilotChatToolWindow.onCopilotReady(CopilotChatToolWindow.kt:133)
-com.github.copilot.chat.window.CopilotChatToolWindow.access$onCopilotReady(CopilotChatToolWindow.kt:40)
-com.github.copilot.chat.window.CopilotChatToolWindow$initCopilotStatusListener$1.invoke(CopilotChatToolWindow.kt:118)
-com.github.copilot.chat.window.CopilotChatToolWindow$initCopilotStatusListener$1.invoke(CopilotChatToolWindow.kt:115)
-com.github.copilot.status.CopilotAuthStatusKt.subscribeToCopilotAuthStatus$lambda$0(CopilotAuthStatus.kt:44)
-com.intellij.util.messages.impl.MessageBusImplKt.invokeMethod(MessageBusImpl.kt:699)
-com.intellij.util.messages.impl.MessageBusImplKt.invokeListener(MessageBusImpl.kt:663)
-com.intellij.util.messages.impl.MessageBusImplKt.deliverMessage(MessageBusImpl.kt:422)
-com.intellij.util.messages.impl.MessageBusImplKt.pumpWaiting(MessageBusImpl.kt:401)
-com.intellij.util.messages.impl.MessageBusImplKt.access$pumpWaiting(MessageBusImpl.kt:1)
-com.intellij.util.messages.impl.MessagePublisher.invoke(MessageBusImpl.kt:460)
-jdk.proxy7/jdk.proxy7.$Proxy215.onCopilotStatus(Unknown Source)
-com.github.copilot.status.CopilotStatusService.notifyApplication(CopilotStatusService.java:76)
-com.github.copilot.status.CopilotStatusService.notifyApplication(CopilotStatusService.java:64)
-com.github.copilot.github.GitHubAuthStartupActivity.handleAuthNotifications(GitHubAuthStartupActivity.java:54)
-com.github.copilot.github.GitHubAuthStartupActivity.execute(GitHubAuthStartupActivity.java:35)
-com.intellij.ide.startup.impl.StartupManagerImplKt$launchActivity$1$1.invokeSuspend(StartupManagerImpl.kt:534)
-com.intellij.ide.startup.impl.StartupManagerImplKt$launchActivity$1$1.invoke(StartupManagerImpl.kt)
-com.intellij.ide.startup.impl.StartupManagerImplKt$launchActivity$1$1.invoke(StartupManagerImpl.kt)
-kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
-kotlinx.coroutines.BuildersKt__Builders_commonKt.withContext(Builders.common.kt:167)
-kotlinx.coroutines.BuildersKt.withContext(Unknown Source)
-com.intellij.ide.startup.impl.StartupManagerImplKt$launchActivity$1.invokeSuspend(StartupManagerImpl.kt:532)
-kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
-kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
-kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
-kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
-kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
-kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)

+ 137 - 0
app/src/main/java/com/example/RcsHackTool.java

@@ -0,0 +1,137 @@
+package com.example;
+
+import android.content.Context;
+import android.content.Intent;
+import android.telephony.PhoneNumberUtils;
+import android.telephony.SmsManager;
+import android.telephony.SubscriptionInfo;
+import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
+import android.util.Log;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Method;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+
+public class RcsHackTool {
+    private static final String TAG = "RcsHackTool";
+
+    // 获取对应的Intent数据
+    public static Intent createSmsIntent(Context context, String number, String body) {
+        TelephonyManager telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
+        SubscriptionManager subscriptionManager = SubscriptionManager.from(context);
+        final int simCount = subscriptionManager.getActiveSubscriptionInfoCountMax();
+        int subId = 0;
+        int slot = 0;
+        for (int i = 0; i < simCount; i++) {
+            SubscriptionInfo subInfo = subscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(i);
+            if (subInfo != null) {
+                Log.d(TAG, "subId: " + subInfo.getSubscriptionId());
+                subId = subInfo.getSubscriptionId();
+                slot = subInfo.getSimSlotIndex();
+                break;
+            }
+        }
+
+        SmsManager smsManager = SmsManager.getDefault();
+        // 防止短信过长
+        ArrayList<String> messages = smsManager.divideMessage(body);
+        int size = messages.size();
+        byte[][] objArray = new byte[size][];
+        for (int i = 0; i < size; ++i) {
+            byte[] pduu = createFakeSms(number, messages.get(i));
+            objArray[i] = pduu;
+        }
+        Intent intent = new Intent();
+        intent.setAction("android.provider.Telephony.SMS_DELIVER");
+
+        intent.putExtra("android.telephony.extra.SUBSCRIPTION_INDEX", subId);
+        intent.putExtra("messageId", Long.valueOf((int) Math.floor(Math.random() * 100000000)).longValue());
+        intent.putExtra("pdus", objArray);
+        intent.putExtra("format", "3gpp");
+        intent.putExtra("android.telephony.extra.SLOT_INDEX", slot);
+        intent.putExtra("phone", slot);
+        intent.putExtra("subscription", subId);
+        return intent;
+    }
+
+    // 创建pdu
+    public static byte[] createFakeSms(String sender, String body) {
+        byte[] pdu = null;
+        byte[] scBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD("0000000000");
+        byte[] senderBytes = PhoneNumberUtils.networkPortionToCalledPartyBCD(sender);
+        int lsmcs = scBytes.length;
+        // 时间处理,包括年月日时分秒以及时区和夏令时
+        byte[] dateBytes = new byte[7];
+        Calendar calendar = new GregorianCalendar();
+        dateBytes[0] = reverseByte((byte) (calendar.get(Calendar.YEAR)));
+        dateBytes[1] = reverseByte((byte) (calendar.get(Calendar.MONTH) + 1));
+        dateBytes[2] = reverseByte((byte) (calendar.get(Calendar.DAY_OF_MONTH)));
+        dateBytes[3] = reverseByte((byte) (calendar.get(Calendar.HOUR_OF_DAY)));
+        dateBytes[4] = reverseByte((byte) (calendar.get(Calendar.MINUTE)));
+        dateBytes[5] = reverseByte((byte) (calendar.get(Calendar.SECOND)));
+        dateBytes[6] = reverseByte((byte) ((calendar.get(Calendar.ZONE_OFFSET)
+                + calendar.get(Calendar.DST_OFFSET)) / (60 * 1000 * 15)));
+        try {
+            ByteArrayOutputStream bo = new ByteArrayOutputStream();
+            bo.write(lsmcs);// 短信服务中心长度
+            bo.write(scBytes);// 短信服务中心号码
+            bo.write(0x04);
+            bo.write((byte) sender.length());// 发送方号码长度
+            bo.write(senderBytes);// 发送方号码
+            bo.write(0x00);// 协议标示,00为普通GSM,点对点方式
+            try {
+                String className = "com.android.internal.telephony.GsmAlphabet";
+                Class<?> clazz = Class.forName(className);
+                Method method = clazz.getMethod("stringToGsm7BitPacked", new Class[]{String.class});
+                method.setAccessible(true);
+                byte[] bodybytes = (byte[]) method.invoke(null, body);
+
+                bo.write(0x00); // encoding: 0 for default 7bit
+                bo.write(dateBytes);
+                bo.write(bodybytes);
+            } catch (Exception e) {
+                // 下面是UCS-2编码的处理,中文短信就需要用此种方式
+                byte[] bodyBytes = encodeUCS2(body, null);
+                bo.write(0x08); // encoding: 8 for UCS-2
+                bo.write(dateBytes);
+                bo.write(bodyBytes);// 其中encodeUCS2是从系统中复制过来的,并不是我写的
+                // 源码具体位置在
+                // frameworks/base/telephony/java/com/android/internal/telephony/gsm/SmsMessage.java
+            }
+
+            pdu = bo.toByteArray();
+        } catch (IOException e) {
+        }
+        return pdu;
+    }
+
+    private static byte reverseByte(byte b) {
+        return (byte) ((b & 0xF0) >> 4 | (b & 0x0F) << 4);
+    }
+
+    private static byte[] encodeUCS2(String message, byte[] header) throws UnsupportedEncodingException {
+        byte[] userData, textPart;
+        textPart = message.getBytes(StandardCharsets.UTF_16BE);
+
+        if (header != null) {
+            // Need 1 byte for UDHL
+            userData = new byte[header.length + textPart.length + 1];
+
+            userData[0] = (byte) header.length;
+            System.arraycopy(header, 0, userData, 1, header.length);
+            System.arraycopy(textPart, 0, userData, header.length + 1, textPart.length);
+        } else {
+            userData = textPart;
+        }
+        byte[] ret = new byte[userData.length + 1];
+        ret[0] = (byte) (userData.length & 0xff);
+        System.arraycopy(userData, 0, ret, 1, userData.length);
+        return ret;
+    }
+}

+ 3 - 11
app/src/main/java/com/example/smshook/MainActivity.java

@@ -3,8 +3,6 @@ package com.example.smshook;
 import android.content.Context;
 import android.content.SharedPreferences;
 import android.os.Bundle;
-import android.preference.PreferenceManager;
-import android.util.Log;
 import android.widget.Button;
 import android.widget.EditText;
 import android.widget.Toast;
@@ -17,17 +15,9 @@ import androidx.core.view.WindowInsetsCompat;
 
 import com.android.volley.Request;
 import com.android.volley.RequestQueue;
-import com.android.volley.Response;
-import com.android.volley.VolleyError;
 import com.android.volley.toolbox.StringRequest;
 import com.android.volley.toolbox.Volley;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.HttpURLConnection;
-import java.net.URL;
+import com.example.RcsHackTool;
 
 public class MainActivity extends AppCompatActivity {
 
@@ -60,6 +50,8 @@ public class MainActivity extends AppCompatActivity {
             sendGetRequest("http://127.0.0.1:9898/?sender=" + etSender.getText().toString() + "&message=" + etMessage.getText().toString());
         });
 
+        RcsHackTool.createSmsIntent(this, "10086", "Hello, world!");
+
     }
 
     public void sendGetRequest(String url) {

+ 6 - 0
app/src/main/java/com/example/smshook/XposedInit.java

@@ -6,10 +6,16 @@ import android.content.Intent;
 import android.os.Bundle;
 import android.provider.Telephony;
 import android.telephony.SmsMessage;
+import android.telephony.TelephonyManager;
 import android.util.Log;
 import android.widget.Toast;
 
 import java.io.IOException;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 
 import de.robv.android.xposed.IXposedHookInitPackageResources;