├── .gitattributes
├── .github
└── workflows
│ └── android.yml
├── .gitignore
├── .vs
└── slnx.sqlite
├── README.md
├── app
├── build.gradle
├── libs
│ ├── arm64-v8a
│ │ └── libIl2CppHook.so
│ ├── armeabi-v7a
│ │ └── libIl2CppHook.so
│ ├── x86
│ │ └── libIl2CppHook.so
│ └── x86_64
│ │ └── libIl2CppHook.so
└── src
│ └── main
│ ├── AndroidManifest.xml
│ ├── assets
│ ├── native_init
│ └── xposed_init
│ ├── java
│ └── yuuki
│ │ └── yuukips
│ │ ├── Hook.kt
│ │ ├── MainHook.kt
│ │ └── TrustMeAlready.java
│ └── res
│ ├── drawable
│ └── ic_android_black_24dp.xml
│ └── values
│ ├── arrays.xml
│ └── strings.xml
├── build.gradle
├── gradle.properties
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── png
├── 1.png
├── 10.png
├── 2.png
├── 3.png
├── 4.png
├── 5.png
├── 8.png
└── 9.png
├── settings.gradle
└── tool
├── lspatch.jar
└── uber-apk-signer.jar
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.github/workflows/android.yml:
--------------------------------------------------------------------------------
1 | name: Android CI
2 |
3 | on:
4 | push:
5 | branches: [ "3.5-3.6cn" ]
6 | pull_request:
7 | branches: [ "3.5-3.6cn" ]
8 |
9 | jobs:
10 | build:
11 |
12 | runs-on: ubuntu-latest
13 |
14 | steps:
15 | - uses: actions/checkout@v3
16 | - name: set up JDK 17
17 | uses: actions/setup-java@v3
18 | with:
19 | java-version: '17'
20 | distribution: 'temurin'
21 | cache: gradle
22 |
23 | - name: Grant execute permission for gradlew
24 | run: chmod +x gradlew
25 | - name: Build with Gradle
26 | run: ./gradlew build
27 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.iml
2 | .gradle
3 | .idea
4 | .DS_Store
5 | build
6 | /captures
7 | /app/debug
8 | /app/build
9 | .externalNativeBuild
10 | .cxx
11 | local.properties
12 | apk
13 | *.apk
14 | app/bin
--------------------------------------------------------------------------------
/.vs/slnx.sqlite:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/.vs/slnx.sqlite
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Private servers that seriously violate the agreement:
2 | According to the information provided by relevant parties, a Genshin Impact private server from mainland China, named: “Zhu Xian Hu Tao”, server address: http://110.42.9.80:4433 is conducting illegal fundraising activities, namely forcing the sale of private server items through a third-party card secret platform. According to the available data, the amount of money involved is huge. In view of this situation, we will have to stop updating this repository until this illegal and criminal activity stops.
3 |
4 | # 严重不守约定的私人服务器:
5 | 据有关人士提供的资料显示,一个来自中国大陆的原神私人服务器,名称为:“诛仙胡桃”,服务器地址为:http://110.42.9.80:4433 在进行非法集资活动即强制性以第三方卡密平台售卖私人服务器内物品,据已有资料显示,涉及资金数额巨大,介于此情况的发生,我们将不得不停止此储存库的更新,直到此违法犯罪活动停止
6 |
7 | # 以下是有关人士提供的资源:
8 |
9 | # The following are the resources provided by relevant parties:
10 |
11 | 
12 |
13 | # 有关人士提供诛仙所有群组负责人:
14 |
15 | # Relevant parties provide the person in charge of all Zhu Xian groups:
16 |
17 | 
18 |
19 | # Disclaimer: The provision of the above pictures and text materials has nothing to do with this repository and the repository staff. This repository is only for recording. Conversely, any impact on the normal social order caused by any server using this repository and related files has nothing to do with this repository. This repository is only for technical exchange.
20 |
21 | # 免责声明:以上图片及文字资料的提供与本储存库及储存库人员无任何关系,本储存库仅做记录。相对的,任何服务器使用本储存库及相关文件造成的任何对社会正常秩序的影响也与此储存库无关,本储存库仅在于技术交流
22 | # Anime Game APK Proxy
23 | This code source is from [577fkj](https://github.com/577fkj) ,which is currently source code has been closed since version 1.7 because they don't want people to use this app for buying private server accounts. here I am just fixing the code so that it can be supported with version 2.8 including being able to login to a custom server without having to use a modified apk made in China which only allows using their server.
24 |
25 | ## Bug (Need your help)
26 | I've done some testing on several phones mine have it all working without problems. it's just that some other players still often get the error message "Failed to Extract il2cpp" which I can't fix because I don't have a phone that has the same error. so i need you guys to fix this :)
27 |
28 | ## Do not do this
29 | Please don't use this app to sell private server accounts, or any other weird thing because it's supposed to be free. If I find someone selling private server accounts I'll probably be shut down forever.
--------------------------------------------------------------------------------
/app/build.gradle:
--------------------------------------------------------------------------------
1 | plugins {
2 | id 'com.android.application'
3 | id 'kotlin-android'
4 | }
5 |
6 | android {
7 | namespace 'yuuki.yuukips'
8 |
9 | compileSdk 32
10 |
11 | defaultConfig {
12 | applicationId "yuuki.yuukips"
13 | minSdk = 28
14 | targetSdk = 32
15 | versionCode = 5
16 | versionName = "5"
17 |
18 | ndk {
19 | abiFilters 'arm64-v8a', 'armeabi-v7a', 'x86', 'x86_64'
20 | }
21 | }
22 |
23 | buildTypes {
24 | release {
25 | minifyEnabled false
26 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
27 | }
28 | }
29 |
30 | sourceSets {
31 | main {
32 | // let gradle pack the shared library into apk
33 | jniLibs.srcDirs = ['libs']
34 | }
35 | }
36 |
37 | compileOptions {
38 | sourceCompatibility JavaVersion.VERSION_11
39 | targetCompatibility JavaVersion.VERSION_11
40 | }
41 |
42 | kotlinOptions {
43 | jvmTarget = '11'
44 | }
45 |
46 | packagingOptions {
47 | resources {
48 | excludes += "/META-INF/**"
49 | excludes += "/kotlin/**"
50 | excludes += "/*.txt"
51 | excludes += "/*.bin"
52 | }
53 | }
54 | }
55 |
56 | dependencies {
57 | implementation fileTree(dir: "libs", include: ["lib*.so"])
58 | compileOnly 'de.robv.android.xposed:api:82'
59 | compileOnly 'de.robv.android.xposed:api:82:sources'
60 | implementation 'com.github.kyuubiran:EzXHelper:0.9.2'
61 | }
--------------------------------------------------------------------------------
/app/libs/arm64-v8a/libIl2CppHook.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/app/libs/arm64-v8a/libIl2CppHook.so
--------------------------------------------------------------------------------
/app/libs/armeabi-v7a/libIl2CppHook.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/app/libs/armeabi-v7a/libIl2CppHook.so
--------------------------------------------------------------------------------
/app/libs/x86/libIl2CppHook.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/app/libs/x86/libIl2CppHook.so
--------------------------------------------------------------------------------
/app/libs/x86_64/libIl2CppHook.so:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/app/libs/x86_64/libIl2CppHook.so
--------------------------------------------------------------------------------
/app/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/app/src/main/assets/native_init:
--------------------------------------------------------------------------------
1 | libIl2CppHook.so
--------------------------------------------------------------------------------
/app/src/main/assets/xposed_init:
--------------------------------------------------------------------------------
1 | yuuki.yuukips.MainHook
--------------------------------------------------------------------------------
/app/src/main/java/yuuki/yuukips/Hook.kt:
--------------------------------------------------------------------------------
1 | package yuuki.yuukips
2 |
3 | import android.annotation.SuppressLint
4 | import android.app.Activity
5 | import android.webkit.SslErrorHandler
6 | import android.widget.*
7 | import com.github.kyuubiran.ezxhelper.init.EzXHelperInit
8 | import com.github.kyuubiran.ezxhelper.utils.*
9 | import de.robv.android.xposed.XC_MethodHook
10 | import de.robv.android.xposed.XposedBridge
11 | import de.robv.android.xposed.callbacks.XC_LoadPackage
12 | import java.io.BufferedWriter
13 | import java.io.File
14 | import java.io.FileWriter
15 | import java.io.IOException
16 | import java.security.SecureRandom
17 | import java.security.cert.X509Certificate
18 | import java.text.SimpleDateFormat
19 | import java.util.Date
20 | import java.util.regex.Pattern
21 | import javax.net.ssl.*
22 | import org.json.JSONObject
23 | import org.json.JSONException
24 | import android.app.AlertDialog
25 | import android.text.TextWatcher
26 | import android.text.Editable
27 |
28 | class Hook {
29 | // URL Server
30 | private var server = "http://127.0.0.1:8080"
31 |
32 | // App
33 | private val package_apk = "com.HoYoverse.hkrpgoversea"
34 | private val injek_activity = "com.mihoyo.combosdk.ComboSDKActivity"
35 | private val path = "/data/user/0/${package_apk}"
36 | private val file_json = "/data/user/0/${package_apk}/server.json"
37 |
38 | //private lateinit var server: String
39 | private lateinit var textJson: String
40 |
41 | // List Domain v1
42 | private val domain = Pattern.compile("http(s|)://.*?\\.(hoyoverse|mihoyo|starrails|mob)\\.com")
43 |
44 | // List Domain v2
45 | private val more_domain =
46 | arrayListOf(
47 | // More Domain & log
48 | "uspider.starrails.com:8888",
49 | "log-upload.mihoyo.com",
50 | "globaldp-prod-os01.starrails.com",
51 | "globaldp-prod-os02.starrails.com",
52 | )
53 |
54 | // Activity
55 | private val activityList: ArrayList = arrayListOf()
56 | private var activity: Activity
57 | get() {
58 | for (mActivity in activityList) {
59 | if (mActivity.isFinishing) {
60 | activityList.remove(mActivity)
61 | } else {
62 | return mActivity
63 | }
64 | }
65 | throw Throwable("Activity not found.")
66 | }
67 | set(value) {
68 | activityList.add(value)
69 | }
70 |
71 | private fun getDefaultSSLSocketFactory(): SSLSocketFactory {
72 | return SSLContext.getInstance("TLS")
73 | .apply {
74 | init(
75 | arrayOf(),
76 | arrayOf(DefaultTrustManager()),
77 | SecureRandom()
78 | )
79 | }
80 | .socketFactory
81 | }
82 |
83 | private fun getDefaultHostnameVerifier(): HostnameVerifier {
84 | return DefaultHostnameVerifier()
85 | }
86 |
87 | class DefaultHostnameVerifier : HostnameVerifier {
88 | @SuppressLint("BadHostnameVerifier")
89 | override fun verify(p0: String?, p1: SSLSession?): Boolean {
90 | return true
91 | }
92 | }
93 |
94 | @SuppressLint("CustomX509TrustManager")
95 | private class DefaultTrustManager : X509TrustManager {
96 |
97 | @SuppressLint("TrustAllX509TrustManager")
98 | override fun checkClientTrusted(chain: Array?, authType: String?) {}
99 |
100 | @SuppressLint("TrustAllX509TrustManager")
101 | override fun checkServerTrusted(chain: Array?, authType: String?) {}
102 |
103 | override fun getAcceptedIssuers(): Array {
104 | return arrayOf()
105 | }
106 | }
107 |
108 | fun initZygote() {
109 | TrustMeAlready().initZygote()
110 |
111 | }
112 |
113 | @SuppressLint("WrongConstant", "ClickableViewAccessibility")
114 | fun handleLoadPackage(i: XC_LoadPackage.LoadPackageParam) {
115 | XposedBridge.log("Load: " + i.packageName) // debug
116 |
117 | // Ignore other apps
118 | if (i.packageName != "${package_apk}") {
119 | return
120 | }
121 | val z3ro = File(file_json)
122 | try {
123 | if (z3ro.exists()) {
124 | val z3roJson = JSONObject(z3ro.readText())
125 | server = z3roJson.getString("server")
126 | } else {
127 | server = "http://127.0.0.1:8080"
128 | z3ro.createNewFile()
129 | z3ro.writeText(TextJSON(server))
130 | }
131 | } catch (e: JSONException) {
132 | }
133 | // Startup
134 | EzXHelperInit.initHandleLoadPackage(i)
135 | // Hook Activity
136 | findMethod(injek_activity) { name == "onCreate" }.hookBefore { param ->
137 | activity = param.thisObject as Activity
138 | Injek()
139 | Enter()
140 | }
141 | Injek()
142 | Enter()
143 | }
144 |
145 | private fun Injek() {
146 | injekhttp()
147 | injekssl()
148 | }
149 |
150 | private fun Enter() {
151 | val z3ro = File(file_json)
152 | val z3roJson = JSONObject(z3ro.readText())
153 | if (z3roJson.getString("remove_il2cpp_folders") != "false") {
154 | val foldersPath = "${path}/files/il2cpp"
155 | val folders = File(foldersPath)
156 | if (folders.exists()) {
157 | folders.deleteRecursively()
158 | }
159 | }
160 | AlertDialog.Builder(activity).apply {
161 | setCancelable(false)
162 | setTitle("欢迎来到私人服务器")
163 | setMessage("采用开源模块制作\n请不要将此apk应用于商业行为\n否则将不会推出后续版本")
164 | setPositiveButton("前往游戏") { _, _ ->
165 | server = z3roJson.getString("server")
166 | Toast.makeText(activity, "加入的服务器地址: $server", Toast.LENGTH_LONG).show()
167 | Injek()
168 | }
169 | setNegativeButton("更改服务器") { _, _ ->
170 | RenameJSON()
171 | }
172 | }.show()
173 | }
174 |
175 | fun TextJSON(melon:String):String{
176 | return "{\n\t\"server\": \""+melon+"\",\n\t\"remove_il2cpp_folders\": true,\n\t\"showText\": true,\n\t\"move_folder\": {\n\t\t\"on\": false,\n\t\t\"from\": \"\",\n\t\t\"to\": \"\"\n\t}\n}"
177 | }
178 |
179 | private fun RenameJSON(){
180 | AlertDialog.Builder(activity).apply {
181 | setCancelable(false)
182 | setTitle("更改服务器")
183 | setMessage("如 (http://127.0.0.1:8080)和https://starrails.com 确认更改后将关闭app,请重新打开")
184 | setView(ScrollView(context).apply {
185 | addView(EditText(activity).apply {
186 | val str = ""
187 | setText(str.toCharArray(), 0, str.length)
188 | addTextChangedListener(object : TextWatcher {
189 | override fun beforeTextChanged(p0: CharSequence, p1: Int, p2: Int, p3: Int) {}
190 | override fun onTextChanged(p0: CharSequence, p1: Int, p2: Int, p3: Int) {}
191 | @SuppressLint("CommitPrefEdits")
192 | override fun afterTextChanged(p0: Editable) {
193 | server = p0.toString()
194 | if(server == "sdk"){
195 | server = "http://127.0.0.1:8080"
196 | }else if (server == "login"){
197 | server = "http://127.0.0.1:8080"
198 | } else if (server.contains("localhost") && server != "") {
199 | server = server.replace("localhost", "https://127.0.0.1")
200 | if (server.contains(" ")) {
201 | server = server.replace(" ", ":")
202 | }
203 | } else if (server == "https://" || server == "http://" && server != "") {
204 | server = ""
205 | } else if (!server.startsWith("https://") && (!server.startsWith("http://")) && server != "" && server != "sdk" && server != "login") {
206 | server = "https://"+server
207 | } else if (server == "") {
208 | server = ""
209 | }
210 | }
211 | })
212 | })
213 | })
214 | setPositiveButton("确认更改/将关闭app/请重新打开") { _, _ ->
215 | if (server == "" ) {
216 | Toast.makeText(activity, "已取消更改", Toast.LENGTH_LONG).show()
217 | Enter()
218 | } else {
219 | val z3ro = File(file_json)
220 | if (server == "cn") {
221 | server = "http://127.0.0.1:8080"
222 | }
223 | z3ro.writeText(TextJSON(server))
224 | Toast.makeText(activity, "已更改服务器重启中...请重新打开!!!", Toast.LENGTH_LONG).show()
225 | Runtime.getRuntime().exit(1);
226 | }
227 | }
228 | setNeutralButton("取消更改") { _, _ ->
229 | Enter()
230 | }
231 | }.show()
232 | }
233 |
234 | // Bypass HTTPS
235 | private fun injekssl() {
236 | // OkHttp3 Hook
237 | findMethodOrNull("com.combosdk.lib.third.okhttp3.OkHttpClient\$Builder") { name == "build" }
238 | ?.hookBefore {
239 | it.thisObject.invokeMethod(
240 | "sslSocketFactory",
241 | args(getDefaultSSLSocketFactory()),
242 | argTypes(SSLSocketFactory::class.java)
243 | )
244 | it.thisObject.invokeMethod(
245 | "hostnameVerifier",
246 | args(getDefaultHostnameVerifier()),
247 | argTypes(HostnameVerifier::class.java)
248 | )
249 | }
250 | findMethodOrNull("okhttp3.OkHttpClient\$Builder") { name == "build" }?.hookBefore {
251 | it.thisObject.invokeMethod(
252 | "sslSocketFactory",
253 | args(getDefaultSSLSocketFactory(), DefaultTrustManager()),
254 | argTypes(SSLSocketFactory::class.java, X509TrustManager::class.java)
255 | )
256 | it.thisObject.invokeMethod(
257 | "hostnameVerifier",
258 | args(getDefaultHostnameVerifier()),
259 | argTypes(HostnameVerifier::class.java)
260 | )
261 | }
262 | // WebView Hook
263 | arrayListOf(
264 | "android.webkit.WebViewClient",
265 | // "cn.sharesdk.framework.g",
266 | // "com.facebook.internal.WebDialog\$DialogWebViewClient",
267 | "com.geetest.sdk.dialog.views.GtWebView\$c",
268 | "com.miHoYo.sdk.webview.common.view.ContentWebView\$6"
269 | )
270 | .forEach {
271 | findMethodOrNull(it) {
272 | name == "onReceivedSslError" &&
273 | parameterTypes[1] == SslErrorHandler::class.java
274 | }
275 | ?.hookBefore { param -> (param.args[1] as SslErrorHandler).proceed() }
276 | }
277 | // Android HttpsURLConnection Hook
278 | findMethodOrNull("javax.net.ssl.HttpsURLConnection") {
279 | name == "getDefaultSSLSocketFactory"
280 | }
281 | ?.hookBefore { it.result = getDefaultSSLSocketFactory() }
282 | findMethodOrNull("javax.net.ssl.HttpsURLConnection") { name == "setSSLSocketFactory" }
283 | ?.hookBefore { it.result = null }
284 | findMethodOrNull("javax.net.ssl.HttpsURLConnection") {
285 | name == "setDefaultSSLSocketFactory"
286 | }
287 | ?.hookBefore { it.result = null }
288 | findMethodOrNull("javax.net.ssl.HttpsURLConnection") { name == "setHostnameVerifier" }
289 | ?.hookBefore { it.result = null }
290 | findMethodOrNull("javax.net.ssl.HttpsURLConnection") {
291 | name == "setDefaultHostnameVerifier"
292 | }
293 | ?.hookBefore { it.result = null }
294 | findMethodOrNull("javax.net.ssl.HttpsURLConnection") {
295 | name == "getDefaultHostnameVerifier"
296 | }
297 | ?.hookBefore { it.result = getDefaultHostnameVerifier() }
298 | }
299 |
300 | // Bypass HTTP
301 | private fun injekhttp() {
302 | findMethod("com.miHoYo.sdk.webview.MiHoYoWebview") {
303 | name == "load" &&
304 | parameterTypes[0] == String::class.java &&
305 | parameterTypes[1] == String::class.java
306 | }
307 | .hookBefore { replaceUrl(it, 1) }
308 | findAllMethods("android.webkit.WebView") { name == "loadUrl" }.hookBefore {
309 | replaceUrl(it, 0)
310 | }
311 | findAllMethods("android.webkit.WebView") { name == "postUrl" }.hookBefore {
312 | replaceUrl(it, 0)
313 | }
314 |
315 | findMethod("okhttp3.HttpUrl") { name == "parse" && parameterTypes[0] == String::class.java }
316 | .hookBefore { replaceUrl(it, 0) }
317 | findMethod("com.combosdk.lib.third.okhttp3.HttpUrl") {
318 | name == "parse" && parameterTypes[0] == String::class.java
319 | }
320 | .hookBefore { replaceUrl(it, 0) }
321 |
322 | findMethod("com.google.gson.Gson") {
323 | name == "fromJson" &&
324 | parameterTypes[0] == String::class.java &&
325 | parameterTypes[1] == java.lang.reflect.Type::class.java
326 | }
327 | .hookBefore { replaceUrl(it, 0) }
328 | findConstructor("java.net.URL") { parameterTypes[0] == String::class.java }.hookBefore {
329 | replaceUrl(it, 0)
330 | }
331 | findMethod("com.combosdk.lib.third.okhttp3.Request\$Builder") {
332 | name == "url" && parameterTypes[0] == String::class.java
333 | }
334 | .hookBefore { replaceUrl(it, 0) }
335 | findMethod("okhttp3.Request\$Builder") {
336 | name == "url" && parameterTypes[0] == String::class.java
337 | }
338 | .hookBefore { replaceUrl(it, 0) }
339 | }
340 |
341 | // Rename
342 | private fun replaceUrl(method: XC_MethodHook.MethodHookParam, args: Int) {
343 | // skip if server if empty
344 | if (server == "") return
345 | var melon = method.args[args].toString()
346 | // skip if string is empty
347 | if (melon == "") return
348 | // skip for support download game data
349 | if (melon.startsWith("autopatchhk.starrails.com")) return
350 | if (melon.startsWith("autopatchcn.starrails.com")) return
351 | // normal edit 1
352 | for (list in more_domain) {
353 | for (head in arrayListOf("http://", "https://")) {
354 | method.args[args] = method.args[args].toString().replace(head + list, server)
355 | }
356 | }
357 | // normal edit 2
358 | val m = domain.matcher(melon)
359 | if (m.find()) {
360 | method.args[args] = m.replaceAll(server)
361 | } else {
362 | }
363 | }
364 | }
365 |
--------------------------------------------------------------------------------
/app/src/main/java/yuuki/yuukips/MainHook.kt:
--------------------------------------------------------------------------------
1 | package yuuki.yuukips
2 |
3 | import de.robv.android.xposed.IXposedHookLoadPackage
4 | import de.robv.android.xposed.IXposedHookZygoteInit
5 | import de.robv.android.xposed.callbacks.XC_LoadPackage
6 |
7 | class MainHook : IXposedHookLoadPackage, IXposedHookZygoteInit {
8 | private val hook: Hook = Hook()
9 | override fun handleLoadPackage(i: XC_LoadPackage.LoadPackageParam) {
10 | hook.handleLoadPackage(i)
11 | }
12 | override fun initZygote(s: IXposedHookZygoteInit.StartupParam) {
13 | hook.initZygote()
14 | }
15 | }
--------------------------------------------------------------------------------
/app/src/main/java/yuuki/yuukips/TrustMeAlready.java:
--------------------------------------------------------------------------------
1 | package yuuki.yuukips;
2 |
3 | import static de.robv.android.xposed.XposedHelpers.*;
4 |
5 | import de.robv.android.xposed.XC_MethodReplacement;
6 | import java.lang.reflect.Method;
7 | import java.lang.reflect.ParameterizedType;
8 | import java.lang.reflect.Type;
9 | import java.security.cert.X509Certificate;
10 | import java.util.ArrayList;
11 | import java.util.Arrays;
12 | import java.util.List;
13 |
14 | public class TrustMeAlready {
15 |
16 | private static final String SSL_CLASS_NAME =
17 | "com.android.org.conscrypt.TrustManagerImpl";
18 | private static final String SSL_METHOD_NAME = "checkTrustedRecursive";
19 | private static final Class> SSL_RETURN_TYPE = List.class;
20 | private static final Class> SSL_RETURN_PARAM_TYPE = X509Certificate.class;
21 |
22 | public void initZygote() {
23 |
24 | for (Method method : findClass(SSL_CLASS_NAME, null).getDeclaredMethods()) {
25 | if (!checkSSLMethod(method)) {
26 | continue;
27 | }
28 |
29 | List