├── .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 | ![image](./png/8.png)![image](./png/9.png)![image](./png/10.png)![image](./png/1.png)![image](./png/2.png)![image](./png/3.png)![image](./png/4.png) 12 | 13 | # 有关人士提供诛仙所有群组负责人: 14 | 15 | # Relevant parties provide the person in charge of all Zhu Xian groups: 16 | 17 | ![image](./png/5.png) 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 params = new ArrayList<>(); 30 | params.addAll(Arrays.asList(method.getParameterTypes())); 31 | params.add( 32 | new XC_MethodReplacement() { 33 | @Override 34 | protected Object replaceHookedMethod(MethodHookParam param) 35 | throws Throwable { 36 | return new ArrayList(); 37 | } 38 | } 39 | ); 40 | findAndHookMethod( 41 | SSL_CLASS_NAME, 42 | null, 43 | SSL_METHOD_NAME, 44 | params.toArray() 45 | ); 46 | } 47 | } 48 | 49 | private boolean checkSSLMethod(Method method) { 50 | if (!method.getName().equals(SSL_METHOD_NAME)) { 51 | return false; 52 | } 53 | 54 | // check return type 55 | if (!SSL_RETURN_TYPE.isAssignableFrom(method.getReturnType())) { 56 | return false; 57 | } 58 | 59 | // check if parameterized return type 60 | Type returnType = method.getGenericReturnType(); 61 | if (!(returnType instanceof ParameterizedType)) { 62 | return false; 63 | } 64 | 65 | // check parameter type 66 | Type[] args = ((ParameterizedType) returnType).getActualTypeArguments(); 67 | if (args.length != 1 || !(args[0].equals(SSL_RETURN_PARAM_TYPE))) { 68 | return false; 69 | } 70 | return true; 71 | } 72 | } 73 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_android_black_24dp.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/arrays.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | com.HoYoverse.hkrpgoversea 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | YuukiPS Mod Launcher 3 | -------------------------------------------------------------------------------- /build.gradle: -------------------------------------------------------------------------------- 1 | // Top-level build file where you can add configuration options common to all sub-projects/modules. 2 | buildscript { 3 | repositories { 4 | google() 5 | mavenCentral() 6 | } 7 | dependencies { 8 | classpath("com.android.tools.build:gradle:7.4.0-alpha08") 9 | classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.7.10") 10 | } 11 | } 12 | 13 | task clean(type: Delete) { 14 | delete rootProject.buildDir 15 | } -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | # IDE (e.g. Android Studio) users: 3 | # Gradle settings configured through the IDE *will override* 4 | # any settings specified in this file. 5 | # For more details on how to configure your build environment visit 6 | # http://www.gradle.org/docs/current/userguide/build_environment.html 7 | # Specifies the JVM arguments used for the daemon process. 8 | # The setting is particularly useful for tweaking memory settings. 9 | org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 10 | # When configured, Gradle will run in incubating parallel mode. 11 | # This option should only be used with decoupled projects. More details, visit 12 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 13 | # org.gradle.parallel=true 14 | # AndroidX package structure to make it clearer which packages are bundled with the 15 | # Android operating system, and which are packaged with your app"s APK 16 | # https://developer.android.com/topic/libraries/support-library/androidx-rn 17 | android.useAndroidX=true 18 | # Automatically convert third-party libraries to use AndroidX 19 | android.enableJetifier=true 20 | # Kotlin code style for this project: "official" or "obsolete": 21 | kotlin.code.style=official -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.properties: -------------------------------------------------------------------------------- 1 | #Fri Apr 29 17:30:47 CST 2022 2 | distributionBase=GRADLE_USER_HOME 3 | distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip 4 | distributionPath=wrapper/dists 5 | zipStorePath=wrapper/dists 6 | zipStoreBase=GRADLE_USER_HOME 7 | -------------------------------------------------------------------------------- /gradlew: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | 3 | # 4 | # Copyright 2015 the original author or authors. 5 | # 6 | # Licensed under the Apache License, Version 2.0 (the "License"); 7 | # you may not use this file except in compliance with the License. 8 | # You may obtain a copy of the License at 9 | # 10 | # https://www.apache.org/licenses/LICENSE-2.0 11 | # 12 | # Unless required by applicable law or agreed to in writing, software 13 | # distributed under the License is distributed on an "AS IS" BASIS, 14 | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 | # See the License for the specific language governing permissions and 16 | # limitations under the License. 17 | # 18 | 19 | ############################################################################## 20 | ## 21 | ## Gradle start up script for UN*X 22 | ## 23 | ############################################################################## 24 | 25 | # Attempt to set APP_HOME 26 | # Resolve links: $0 may be a link 27 | PRG="$0" 28 | # Need this for relative symlinks. 29 | while [ -h "$PRG" ] ; do 30 | ls=`ls -ld "$PRG"` 31 | link=`expr "$ls" : '.*-> \(.*\)$'` 32 | if expr "$link" : '/.*' > /dev/null; then 33 | PRG="$link" 34 | else 35 | PRG=`dirname "$PRG"`"/$link" 36 | fi 37 | done 38 | SAVED="`pwd`" 39 | cd "`dirname \"$PRG\"`/" >/dev/null 40 | APP_HOME="`pwd -P`" 41 | cd "$SAVED" >/dev/null 42 | 43 | APP_NAME="Gradle" 44 | APP_BASE_NAME=`basename "$0"` 45 | 46 | # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 47 | DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' 48 | 49 | # Use the maximum available, or set MAX_FD != -1 to use that value. 50 | MAX_FD="maximum" 51 | 52 | warn () { 53 | echo "$*" 54 | } 55 | 56 | die () { 57 | echo 58 | echo "$*" 59 | echo 60 | exit 1 61 | } 62 | 63 | # OS specific support (must be 'true' or 'false'). 64 | cygwin=false 65 | msys=false 66 | darwin=false 67 | nonstop=false 68 | case "`uname`" in 69 | CYGWIN* ) 70 | cygwin=true 71 | ;; 72 | Darwin* ) 73 | darwin=true 74 | ;; 75 | MINGW* ) 76 | msys=true 77 | ;; 78 | NONSTOP* ) 79 | nonstop=true 80 | ;; 81 | esac 82 | 83 | CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar 84 | 85 | # Determine the Java command to use to start the JVM. 86 | if [ -n "$JAVA_HOME" ] ; then 87 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 88 | # IBM's JDK on AIX uses strange locations for the executables 89 | JAVACMD="$JAVA_HOME/jre/sh/java" 90 | else 91 | JAVACMD="$JAVA_HOME/bin/java" 92 | fi 93 | if [ ! -x "$JAVACMD" ] ; then 94 | die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME 95 | 96 | Please set the JAVA_HOME variable in your environment to match the 97 | location of your Java installation." 98 | fi 99 | else 100 | JAVACMD="java" 101 | which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 102 | 103 | Please set the JAVA_HOME variable in your environment to match the 104 | location of your Java installation." 105 | fi 106 | 107 | # Increase the maximum file descriptors if we can. 108 | if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then 109 | MAX_FD_LIMIT=`ulimit -H -n` 110 | if [ $? -eq 0 ] ; then 111 | if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then 112 | MAX_FD="$MAX_FD_LIMIT" 113 | fi 114 | ulimit -n $MAX_FD 115 | if [ $? -ne 0 ] ; then 116 | warn "Could not set maximum file descriptor limit: $MAX_FD" 117 | fi 118 | else 119 | warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" 120 | fi 121 | fi 122 | 123 | # For Darwin, add options to specify how the application appears in the dock 124 | if $darwin; then 125 | GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" 126 | fi 127 | 128 | # For Cygwin or MSYS, switch paths to Windows format before running java 129 | if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then 130 | APP_HOME=`cygpath --path --mixed "$APP_HOME"` 131 | CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` 132 | 133 | JAVACMD=`cygpath --unix "$JAVACMD"` 134 | 135 | # We build the pattern for arguments to be converted via cygpath 136 | ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` 137 | SEP="" 138 | for dir in $ROOTDIRSRAW ; do 139 | ROOTDIRS="$ROOTDIRS$SEP$dir" 140 | SEP="|" 141 | done 142 | OURCYGPATTERN="(^($ROOTDIRS))" 143 | # Add a user-defined pattern to the cygpath arguments 144 | if [ "$GRADLE_CYGPATTERN" != "" ] ; then 145 | OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" 146 | fi 147 | # Now convert the arguments - kludge to limit ourselves to /bin/sh 148 | i=0 149 | for arg in "$@" ; do 150 | CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` 151 | CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option 152 | 153 | if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition 154 | eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` 155 | else 156 | eval `echo args$i`="\"$arg\"" 157 | fi 158 | i=`expr $i + 1` 159 | done 160 | case $i in 161 | 0) set -- ;; 162 | 1) set -- "$args0" ;; 163 | 2) set -- "$args0" "$args1" ;; 164 | 3) set -- "$args0" "$args1" "$args2" ;; 165 | 4) set -- "$args0" "$args1" "$args2" "$args3" ;; 166 | 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; 167 | 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; 168 | 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; 169 | 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; 170 | 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; 171 | esac 172 | fi 173 | 174 | # Escape application args 175 | save () { 176 | for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done 177 | echo " " 178 | } 179 | APP_ARGS=`save "$@"` 180 | 181 | # Collect all arguments for the java command, following the shell quoting and substitution rules 182 | eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" 183 | 184 | exec "$JAVACMD" "$@" 185 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @rem 2 | @rem Copyright 2015 the original author or authors. 3 | @rem 4 | @rem Licensed under the Apache License, Version 2.0 (the "License"); 5 | @rem you may not use this file except in compliance with the License. 6 | @rem You may obtain a copy of the License at 7 | @rem 8 | @rem https://www.apache.org/licenses/LICENSE-2.0 9 | @rem 10 | @rem Unless required by applicable law or agreed to in writing, software 11 | @rem distributed under the License is distributed on an "AS IS" BASIS, 12 | @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 | @rem See the License for the specific language governing permissions and 14 | @rem limitations under the License. 15 | @rem 16 | 17 | @if "%DEBUG%" == "" @echo off 18 | @rem ########################################################################## 19 | @rem 20 | @rem Gradle startup script for Windows 21 | @rem 22 | @rem ########################################################################## 23 | 24 | @rem Set local scope for the variables with windows NT shell 25 | if "%OS%"=="Windows_NT" setlocal 26 | 27 | set DIRNAME=%~dp0 28 | if "%DIRNAME%" == "" set DIRNAME=. 29 | set APP_BASE_NAME=%~n0 30 | set APP_HOME=%DIRNAME% 31 | 32 | @rem Resolve any "." and ".." in APP_HOME to make it shorter. 33 | for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi 34 | 35 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 36 | set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" 37 | 38 | @rem Find java.exe 39 | if defined JAVA_HOME goto findJavaFromJavaHome 40 | 41 | set JAVA_EXE=java.exe 42 | %JAVA_EXE% -version >NUL 2>&1 43 | if "%ERRORLEVEL%" == "0" goto execute 44 | 45 | echo. 46 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 47 | echo. 48 | echo Please set the JAVA_HOME variable in your environment to match the 49 | echo location of your Java installation. 50 | 51 | goto fail 52 | 53 | :findJavaFromJavaHome 54 | set JAVA_HOME=%JAVA_HOME:"=% 55 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 56 | 57 | if exist "%JAVA_EXE%" goto execute 58 | 59 | echo. 60 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 61 | echo. 62 | echo Please set the JAVA_HOME variable in your environment to match the 63 | echo location of your Java installation. 64 | 65 | goto fail 66 | 67 | :execute 68 | @rem Setup the command line 69 | 70 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 71 | 72 | 73 | @rem Execute Gradle 74 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* 75 | 76 | :end 77 | @rem End local scope for the variables with windows NT shell 78 | if "%ERRORLEVEL%"=="0" goto mainEnd 79 | 80 | :fail 81 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 82 | rem the _cmd.exe /c_ return code! 83 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 84 | exit /b 1 85 | 86 | :mainEnd 87 | if "%OS%"=="Windows_NT" endlocal 88 | 89 | :omega -------------------------------------------------------------------------------- /png/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/png/1.png -------------------------------------------------------------------------------- /png/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/png/10.png -------------------------------------------------------------------------------- /png/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/png/2.png -------------------------------------------------------------------------------- /png/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/png/3.png -------------------------------------------------------------------------------- /png/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/png/4.png -------------------------------------------------------------------------------- /png/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/png/5.png -------------------------------------------------------------------------------- /png/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/png/8.png -------------------------------------------------------------------------------- /png/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/png/9.png -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | dependencyResolutionManagement { 2 | repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) 3 | repositories { 4 | google() 5 | mavenCentral() 6 | jcenter() // Warning: this repository is going to shut down soon 7 | } 8 | } 9 | 10 | rootProject.name = "YuukiPS" 11 | include ':app' 12 | -------------------------------------------------------------------------------- /tool/lspatch.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/tool/lspatch.jar -------------------------------------------------------------------------------- /tool/uber-apk-signer.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/gucooing/Launcher-Android/c5040e3cd7aa95114cac315a84de82115b456510/tool/uber-apk-signer.jar --------------------------------------------------------------------------------