diff --git a/CUSTOM-SERVER-CONFIGURATION.md b/CUSTOM-SERVER-CONFIGURATION.md new file mode 100644 index 000000000..d3152b2da --- /dev/null +++ b/CUSTOM-SERVER-CONFIGURATION.md @@ -0,0 +1,607 @@ +# ๐ŸŒ RR3 Custom Server Configuration - Complete Guide + +**Problem:** Someone is concerned about SSL/certificate validation AND hardcoded server URLs +**Reality:** They're absolutely right - this is the real challenge! +**Solution:** Multiple Smali + XML modifications required to redirect game to custom servers + +--- + +## โš ๏ธ IMPORTANT CORRECTION + +**My previous SSL-CERTIFICATE-BYPASS.md was INCOMPLETE!** + +While SSL validation is indeed disabled for basic TrustManager checks, **the real challenge is:** + +1. **Hardcoded server URLs** in compiled bytecode +2. **Native code** (libRealRacing3.so) that handles network communication +3. **Configuration passing** from Java โ†’ Native layer + +The person questioning Part 3 was **100% correct**! โœ… + +--- + +## ๐Ÿ” The Real Technical Reality + +### What We Found + +#### 1. Hardcoded EA Server URLs (In Java/Smali) + +**File:** `smali_classes2/com/ea/nimble/SynergyEnvironmentImpl.smali` + +```smali +# Line 19 +.field private static final SYNERGY_INT_SERVER_URL:Ljava/lang/String; = "https://director-int.sn.eamobile.com" + +# Line 21 +.field private static final SYNERGY_LIVE_SERVER_URL:Ljava/lang/String; = "https://syn-dir.sn.eamobile.com" + +# Line 23 +.field private static final SYNERGY_STAGE_SERVER_URL:Ljava/lang/String; = "https://director-stage.sn.eamobile.com" +``` + +**These are COMPILED INTO THE BYTECODE** - not in a config file! + +--- + +#### 2. Server Environment Configuration (In XML) + +**File:** `res/values/strings.xml` + +**Line 137:** +```xml +live +``` + +**This selects which hardcoded URL to use:** +- `"live"` โ†’ Uses `syn-dir.sn.eamobile.com` +- `"stage"` โ†’ Uses `director-stage.sn.eamobile.com` +- `"int"` โ†’ Uses `director-int.sn.eamobile.com` + +**Line 350-353 (Nimble API Keys):** +```xml +1cd0dfa4-c34c-4b0a-b444-aca954c96d50 +aea852db-02b4-42f1-8a4a-7c167953b46e +4757e3d6-bb9e-4766-92bd-fd6a9e97eca6 +76ec9d8a-fbb1-448d-99d0-27f5ddcd664a +``` + +**These authenticate with EA's Nimble SDK backend.** + +--- + +#### 3. Native Code Integration + +**Java HTTP wrapper:** `com/firemint/realracing/Http.smali` + +**Native callback methods (Lines 119-129):** +```smali +.method private native completeCallback(J)V +.end method + +.method private native dataCallback(J[BI)V +.end method + +.method private native errorCallback(J)V +.end method + +.method private native headerCallback(JI)V +.end method +``` + +**Key Point:** +- Java code makes HTTP requests +- Results are passed to **native C++ code** via JNI callbacks +- Native code (`libRealRacing3.so`) processes responses + +**This means:** +- URL comes from Java (we can change) +- SSL verification happens in Java (already bypassed) +- **BUT** native code validates responses and might check domain/data format + +--- + +## ๐Ÿ› ๏ธ How to Redirect to Custom Server + +### Method 1: Change Hardcoded URL (Recommended) + +**Modify:** `smali_classes2/com/ea/nimble/SynergyEnvironmentImpl.smali` + +**Original (Line 21):** +```smali +.field private static final SYNERGY_LIVE_SERVER_URL:Ljava/lang/String; = "https://syn-dir.sn.eamobile.com" +``` + +**Modified:** +```smali +.field private static final SYNERGY_LIVE_SERVER_URL:Ljava/lang/String; = "https://your-custom-server.com:5555" +``` + +**Also change Line 19 (int) and Line 23 (stage) to the same URL for consistency.** + +--- + +### Method 2: Add Custom Environment Option + +**Option A: Add to strings.xml** + +**File:** `res/values/strings.xml` + +**Add new entry:** +```xml +custom +https://your-server.com:5555 +``` + +**Then modify SynergyEnvironmentImpl to read custom URL.** + +**Option B: Use existing "int" environment** + +**Simpler approach - just change the "int" URL:** + +```smali +# Change line 19 +.field private static final SYNERGY_INT_SERVER_URL:Ljava/lang/String; = "https://your-server.com:5555" +``` + +**Then in strings.xml:** +```xml +int +``` + +--- + +### Method 3: Network Injection (Advanced) + +**If you can't modify APK bytecode**, intercept at OS level: + +#### DNS Spoofing +```bash +# /etc/hosts on rooted Android +127.0.0.1 syn-dir.sn.eamobile.com +127.0.0.1 director-int.sn.eamobile.com +127.0.0.1 director-stage.sn.eamobile.com +``` + +**Run local proxy on 127.0.0.1 to forward to your server.** + +#### VPN Tunnel +```bash +# Use VPN app to redirect EA domains to custom server +# Tools: Packet Tunnel, NetGuard, AdGuard (with custom DNS rules) +``` + +**Note:** This still requires SSL bypass since certificate won't match! + +--- + +## ๐Ÿ”’ SSL Certificate Reality Check + +### What I Got Wrong Before + +**My previous doc said:** +> "SSL validation is disabled, custom servers work out-of-the-box" + +**What I SHOULD have said:** +> "SSL validation bypasses certificate expiry checks, BUT you still need to handle domain mismatches and native code expectations" + +### The Truth About SSL in RR3 + +#### Java Layer SSL (What We Analyzed) + +**Http.smali Line 179:** +```smali +sget-object v0, Lorg/apache/http/conn/ssl/SSLSocketFactory;->ALLOW_ALL_HOSTNAME_VERIFIER:Lorg/apache/http/conn/ssl/X509HostnameVerifier; +invoke-static {v0}, Ljavax/net/ssl/HttpsURLConnection;->setDefaultHostnameVerifier(Ljavax/net/ssl/HostnameVerifier;)V +``` + +**This line is CRITICAL:** +- `ALLOW_ALL_HOSTNAME_VERIFIER` - Disables hostname verification! +- This means Java layer accepts ANY domain (e.g., your-server.com instead of ea.com) +- โœ… **Good news for custom servers!** + +**Http$1.smali (TrustManager):** +```smali +.method public checkServerTrusted([Ljava/security/cert/X509Certificate;Ljava/lang/String;)V + return-void # Does nothing = accepts all certificates +.end method +``` + +**Result:** +- โœ… Java layer accepts self-signed certificates +- โœ… Java layer accepts wrong domain names +- โœ… Java layer doesn't pin certificates + +--- + +#### Native Layer SSL (Unknown Territory) + +**What we DON'T know:** +- Does `libRealRacing3.so` perform additional SSL validation? +- Does native code check response signatures? +- Does native code validate server responses format? + +**What we CAN'T easily check:** +- Native library is compiled C++ (not decompilable to readable code) +- Would need reverse engineering tools (IDA Pro, Ghidra) +- Or runtime testing with custom server + +--- + +## ๐Ÿงช Testing Strategy + +### Phase 1: Java Layer Only + +**Goal:** Confirm URL redirection works + +**Steps:** +1. Modify `SYNERGY_LIVE_SERVER_URL` to point to your server +2. Rebuild APK, sign, install +3. Monitor network traffic: `adb logcat | grep -i "http"` +4. Check if game connects to your server + +**Expected Result:** +- โœ… Game makes HTTP requests to your server +- โ“ Native code might reject responses + +--- + +### Phase 2: Response Validation + +**Goal:** Determine what responses native code expects + +**Steps:** +1. Set up proxy (mitmproxy, Charles, Burp Suite) +2. Intercept EA's server responses (if still accessible) +3. Document response format, headers, JSON structure +4. Replicate exact format on custom server + +**Key Things Native Code Might Check:** +- Response HTTP status codes +- JSON structure/schema +- Cryptographic signatures (HMAC, JWT) +- Response headers (X-EA-*, EAM-*) +- Timing/sequence of responses + +--- + +### Phase 3: Native Code Validation + +**Goal:** Bypass/understand native checks + +**Options:** + +#### A. Frida Hooking (Advanced) +```javascript +// Hook native callback functions +Interceptor.attach(Module.findExportByName("libRealRacing3.so", "Java_com_firemint_realracing_Http_dataCallback"), { + onEnter: function(args) { + console.log("Native callback called with data:", args[2]); + } +}); +``` + +#### B. Runtime Analysis +```bash +# Use strace to monitor native system calls +adb shell +strace -f -p $(pidof com.ea.games.r3_row) -e trace=network +``` + +#### C. Library Patching (Nuclear Option) +- Decompile `libRealRacing3.so` with Ghidra +- Find SSL validation functions +- Patch to always return success +- Recompile library + +**Warning:** This is VERY complex and error-prone! + +--- + +## ๐Ÿ“‹ Complete Modification Checklist + +### Required Changes for Custom Server + +#### 1. Server URL Redirection + +**Files to modify:** + +``` +โœ… smali_classes2/com/ea/nimble/SynergyEnvironmentImpl.smali + - Line 19: SYNERGY_INT_SERVER_URL + - Line 21: SYNERGY_LIVE_SERVER_URL + - Line 23: SYNERGY_STAGE_SERVER_URL + +โ“ res/values/strings.xml + - Line 137: cc_server_env (set to "live" or "custom") +``` + +--- + +#### 2. SSL/TLS Configuration + +**Already bypassed by default:** + +``` +โœ… smali_classes2/com/firemint/realracing/Http.smali + - Line 179: ALLOW_ALL_HOSTNAME_VERIFIER (already set) + +โœ… smali_classes2/com/firemint/realracing/Http$1.smali + - Line 38-40: checkServerTrusted (empty method) + +โœ… smali_classes2/com/firemonkeys/cloudcellapi/HttpRequest.smali + - Line 47: m_bSSLCheck = false (disabled) +``` + +**No changes needed here!** โœ… + +--- + +#### 3. API Key Configuration (Optional) + +**If your server validates Nimble API keys:** + +``` +โ“ res/values/strings.xml + - Line 350: nimble_api_key_live (change to your key) + - Line 352: nimble_api_secret_live (change to your secret) +``` + +**If your server ignores API keys, skip this.** + +--- + +## ๐ŸŽฏ Simplified Build Script + +```powershell +# RR3-Custom-Server.ps1 - Automated URL replacement + +param( + [string]$ServerURL = "https://your-server.com:5555" +) + +# Decompile APK +apktool d realracing3.apk -o rr3-custom + +# Replace server URLs +$smaliFile = "rr3-custom\smali_classes2\com\ea\nimble\SynergyEnvironmentImpl.smali" +(Get-Content $smaliFile) ` + -replace 'https://syn-dir\.sn\.eamobile\.com', $ServerURL ` + -replace 'https://director-int\.sn\.eamobile\.com', $ServerURL ` + -replace 'https://director-stage\.sn\.eamobile\.com', $ServerURL ` + | Set-Content $smaliFile + +Write-Host "โœ… Server URLs updated to: $ServerURL" + +# Rebuild APK +apktool b rr3-custom -o rr3-custom-server.apk + +# Align & Sign +zipalign -f -P 16 -v 16 rr3-custom-server.apk rr3-aligned.apk +java -jar uber-apk-signer.jar --apks rr3-aligned.apk + +Write-Host "โœ… APK built: rr3-aligned-signed.apk" +``` + +**Usage:** +```bash +.\RR3-Custom-Server.ps1 -ServerURL "https://rr3.mydomain.com:5555" +``` + +--- + +## ๐Ÿงฉ What Your Custom Server Needs + +### Minimum Requirements + +#### 1. Match EA's API Endpoints + +**Director API (Primary):** +``` +GET /director/api/android/getDirectionByPackage +POST /synergy/api/user/login +POST /synergy/api/user/register +GET /synergy/api/game/config +POST /synergy/api/game/saveProgress +``` + +**Content API (Assets):** +``` +GET /content/api/manifest +GET /content/api/assets/{path} +``` + +--- + +#### 2. Replicate Response Format + +**Example: getDirectionByPackage response:** +```json +{ + "appUpgrade": 0, + "serverURL": { + "synergy.product": "https://your-server.com:5555", + "synergy.user": "https://your-server.com:5555", + "synergy.tracking": "https://your-server.com:5555" + }, + "version": "14.0.1", + "minimumVersion": "14.0.0" +} +``` + +**Key Points:** +- `appUpgrade: 0` - Bypass killswitch +- `serverURL` object contains secondary endpoints +- If native code validates JSON structure, match it exactly! + +--- + +#### 3. Handle Authentication Headers + +**RR3 sends these headers:** +```http +EAM-SESSION: +EAM-USER-ID: +EA-SELL-ID: +SDK-VERSION: +X-EA-GAME: RealRacing3 +X-EA-PLATFORM: Android +``` + +**Your server should:** +1. Accept these headers (don't reject unknown headers) +2. Validate session tokens if implementing auth +3. Return appropriate JSON responses + +--- + +## โš ๏ธ Known Challenges + +### Challenge 1: Native Code Validation + +**Risk:** Native code rejects responses from custom server + +**Symptoms:** +- APK connects to your server (visible in logs) +- No error messages +- Game stuck at loading screen +- Native code silently fails + +**Solution:** +- Test with exact EA response format +- Monitor native callbacks with Frida +- May require native library patching + +--- + +### Challenge 2: Cryptographic Signatures + +**Risk:** Responses might be signed with EA's private key + +**Evidence:** +- Nimble SDK has crypto capabilities +- API keys/secrets exist in config +- Native code could validate HMAC signatures + +**Solution:** +- Try without signatures first (might not be enforced) +- If required, remove signature validation from native code +- Or generate valid signatures (if algorithm is known) + +--- + +### Challenge 3: Asset Downloads + +**Risk:** Assets have MD5 checksums that must match + +**File:** `AssetsController.cs` already handles this: +```csharp +// Calculate MD5 on upload +using var md5 = MD5.Create(); +var hash = md5.ComputeHash(fileStream); +asset.MD5Hash = BitConverter.ToString(hash).Replace("-", "").ToLower(); +``` + +**Your manifest MUST return matching MD5s or game rejects files!** โœ… + +--- + +## ๐ŸŽ“ Learning from Discord Community + +### What We Know Works (Community Reports) + +**From Discord "airplane mode trick":** +1. Users start game normally +2. Enable airplane mode during loading screen +3. Game switches to "offline mode" +4. Progression works locally + +**This proves:** +- โœ… Game has offline capability +- โœ… Native code doesn't REQUIRE server validation for gameplay +- โœ… Server is primarily for cloud saves and multiplayer + +--- + +### What Needs Testing + +**Questions for community:** +1. Has anyone successfully redirected to custom server? +2. What responses does native code expect? +3. Are there signature validations? +4. Does changing URL work without native code changes? + +--- + +## ๐Ÿ“š Related Documentation + +- **KILLSWITCH-REMOVAL-TECHNICAL.md** - Bypass appUpgrade check +- **SSL-CERTIFICATE-BYPASS.md** - Java layer SSL bypass (INCOMPLETE, read this doc instead) +- **GETTING-STARTED.md** - General APK building guide +- **RR3-ULTIMATE-EDITION-COMPLETE.md** - Complete v14 build process + +--- + +## ๐Ÿ™ Credits & Corrections + +**Original Analysis:** Copilot CLI (me) +**Correction Provided By:** Discord community member (thank you!) +**Finding:** Part 3 of SSL analysis was incomplete - native code and hardcoded URLs are the real challenge + +**This document supersedes SSL-CERTIFICATE-BYPASS.md for custom server setup.** + +--- + +## ๐Ÿš€ Next Steps + +### For Community Members + +**If you're testing custom servers:** + +1. โœ… **Easy:** Change hardcoded URLs in Smali +2. โœ… **Easy:** Build and sign APK +3. โœ… **Easy:** Install and test connection +4. โ“ **Unknown:** Test if native code accepts responses +5. โ“ **Unknown:** Debug response format issues +6. โ“ **Hard:** Patch native code if validation fails + +**Share your findings on Discord!** + +--- + +### For Server Developers + +**Your server should:** + +1. โœ… **Must:** Match EA's endpoint paths +2. โœ… **Must:** Return valid JSON with correct structure +3. โœ… **Must:** Calculate MD5 hashes for assets +4. โ“ **Maybe:** Handle authentication headers +5. โ“ **Maybe:** Sign responses (if native code checks) + +**ASP.NET Core server template already implements 1-3!** โœ… + +--- + +## ๐Ÿ“ž Community Support + +**Questions? Testing results?** + +Share on Discord: Project-Real-Resurrection-3 + +**Found what responses work?** +- Document JSON structure +- Share HTTP traffic captures +- Test different response formats + +**Got custom server working?** +- Write detailed steps +- Share server code +- Help others replicate + +--- + +**Last Updated:** February 20, 2026 +**Status:** โš ๏ธ Theoretical - Requires community testing +**Priority:** High - This is the real challenge for custom servers! + +๐ŸŽ๏ธ๐Ÿ’จ **Let's figure this out together!**