- APK Adobe AIR / Flash, tutta la logica e' in
GachaWorld.swf(ActionScript 3) - Il DEX contiene solo runtime AIR, Google Play Services, AdMob
Meccanismo: Flash SharedObject chiamato saveslot1
Percorso file sul dispositivo (richiede root):
/data/data/air.com.lunime.gachaworld/app_#air.com.lunime.gachaworld/Local Store/#SharedObjects/saveslot1.sol
NON e' un link. E' un sistema username + password via server PHP di Lunime.
- Dispositivo A: registra account (nome + password) -> dati caricati sul server
- Dispositivo B: inserisci stessi nome + password -> dati scaricati dal server
- Limite: 20 trasferimenti massimi
| URL | Funzione |
|---|---|
https://lunime.com/worldgachadata/loginworldx.php |
Download save (login) |
https://lunime.com/worldgachadata/registerworldreplacex.php |
Upload save (register) |
https://lunime.com/worldgachadata/getfaction1.php |
Dati fazione |
https://lunime.com/worldgachadata/registerfaction.php |
Registra fazione |
https://lunime.com/worldgachadata/redeem.php |
Riscatta codici promo |
https://gachabaka.com/data/worldgetchat.php |
Chat |
https://gachabaka.com/data/worldsubmitchat.php |
Invia chat |
https://gachabaka.com/data/worldgetleaderboard.php |
Classifica |
https://gachabaka.com/data/worldsubmitleaderboard.php |
Invia punteggio |
- loginworldx.php: ONLINE, risponde correttamente
- registerworldreplacex.php: ONLINE, accetta richieste (200 OK)
- redeem.php: ERRORE 500
- getfaction1.php: ERRORE 500
- Metodo: POST
- Content-Type:
application/x-www-form-urlencoded - Formato risposta: URLEncoded (
chiave=valore&chiave2=valore2) - IMPORTANTE: usare HTTPS (HTTP fa redirect 301 e perde il body POST)
- IMPORTANTE: register e login devono avvenire sulla stessa connessione TCP (keep-alive)
| Codice | Significato |
|---|---|
| 1 | Successo (dati trovati e password corretta) |
| 2 | Account non trovato / dati vuoti |
| 3 | Parametri mancanti / errore connessione |
Quando si fa register e poi login sulla stessa connessione HTTPS:
- Register ritorna body vuoto (200 OK)
- Login ritorna
systemResult=2con tutti i campi (ma valori a 0)
Quando si fa login su una nuova connessione:
- Login ritorna
systemResult=3(parametri mancanti)
Questo suggerisce che il database potrebbe essere vuoto/resettato, ma il codice PHP funziona ancora.
Questi sono i campi POST inviati al register e ricevuti dal login:
xaccountx- usernamexpassx- passwordxnamex- nome visualizzato
xgender,xskincolor,xhair,xeyes,xmouthxhaircolor,xeyescolorxweapon,xarmor,xcape,xhat,xshades,xwallpaper
xlevelnum- livelloxxp- esperienzaxgold- oro/monetextutorial- tutorial completatoxworldmap- mappa mondo
xtotalpulls3axtotalpulls6- pull totali per rarita'
xwavescleared,xtotalxpobtained,xtotalgemsobtainedxtotalgoldobtained,xtotaltickets,xquestscompleted
xarenaxp,xarenawins,xarenalosesxarena1axarena10
xoldstats,xoldvitx,xoldstrx,xoldcritx,xoldsumx,xolddodgex
xgamemap,xspawnpos,xfirsttimexmutemusic,xmutesfx,xclosenews,xsquad,xraritypage
xelehp1axelehp6- HP elementalixeleatk1axeleatk6- ATK elementali
xhighscore1axhighscore10
xachievement1axachievement20
xtower1axtower10
xevent1axevent30
xboss1axboss20xbosshp1axbosshp20
xunit1axunit30- slot unita'xc1axc90- personaggi possedutixo1axo90- flags personaggixlv1axlv90- livelli personaggixxp1axxp90- XP personaggi
xhat1axhat90- cappellixshades1axshades90- occhialixarmor1axarmor50- armaturexweapon1axweapon50- armixcape1axcape50- mantelli
Stessi campi ma SENZA il prefisso x:
accountx, passx, namex, gender, skincolor, hair, eyes, mouth,
haircolor, eyescolor, weapon, armor, cape, hat, shades, wallpaper,
levelnum, gold, tutorial, worldmap, story,
totalpulls3-totalpulls6, wavescleared, totalxpobtained, totalgemsobtained,
totalgoldobtained, totaltickets, questscompleted,
arenaxp, arenawins, arenaloses, arena1-arena10,
oldstats, oldvitx, oldstrx, oldcritx, oldsumx, olddodgex,
gamemap, spawnpos, firsttime, mutemusic, mutesfx, closenews, squad, raritypage,
elehp1-elehp6, eleatk1-eleatk6,
highscore1-highscore10, achievement1-achievement20,
tower1-tower10, event1-event30,
boss1-boss30, bosshp1-bosshp30,
unit1-unit30, c1-c100, o1-o100, lv10-lv100, xp10-xp100,
hat1-hat93, weapon1-weapon50, cape1-cape50,
critchance, critchance1-critchance6, defaultparty, critical,
summonpower, dodgerate, bonusx, transferonce, cheaterx,
bossgems, bossgems1-bossgems30, droprate1-droprate6,
towerlvl, towerbattle, towerscreen, towerfloor
story- progresso storiacheaterx- flag anti-cheattransferonce- contatore trasferimenti usatibosspick- boss selezionatocritchance,critical,summonpower,dodgerate- stats battagliadefaultparty- party di defaultbonusx- bonusdroprate1-droprate6- drop rate elementalitowerlvl,towerbattle,towerscreen,towerfloor- stato torre
// Registrazione (upload)
phpVars = new URLVariables()
phpFileRequest = new URLRequest("https://lunime.com/worldgachadata/registerworldreplacex.php")
phpLoader = new URLLoader()
phpVars.xaccountx = saveslot1.data.accountx
phpVars.xpassx = saveslot1.data.passx
phpVars.xnamex = saveslot1.data.namex
// ... tutti i campi ...
phpFileRequest.method = URLRequestMethod.POST
phpFileRequest.data = phpVars
phpLoader.load(phpFileRequest)
// Login (download)
// Stessa struttura ma con URL loginworldx.php
// La risposta viene parsata e i valori scritti nel SharedObject locale
import http.client, ssl, urllib.parse
ctx = ssl.create_default_context()
conn = http.client.HTTPSConnection('lunime.com', timeout=30, context=ctx)
# REGISTER (upload)
fields = {
'xaccountx': 'mio_account',
'xpassx': 'mia_password',
'xnamex': 'MioNome',
'xlevelnum': '100',
'xgold': '999999',
# ... tutti gli altri campi ...
}
body = urllib.parse.urlencode(fields)
conn.request('POST', '/worldgachadata/registerworldreplacex.php',
body=body,
headers={'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': str(len(body))})
resp = conn.getresponse()
resp.read()
# LOGIN (download) - stessa connessione!
login_body = urllib.parse.urlencode({
'xaccountx': 'mio_account',
'xpassx': 'mia_password'
})
conn.request('POST', '/worldgachadata/loginworldx.php',
body=login_body,
headers={'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': str(len(login_body))})
resp2 = conn.getresponse()
data = resp2.read().decode()
# Parsare la risposta
params = urllib.parse.parse_qs(data, keep_blank_values=True)
print(params['systemResult']) # ['1'] = successo
print(params['xgold']) # ['999999']
conn.close()# Da dispositivo A
adb shell su -c "cat '/data/data/air.com.lunime.gachaworld/app_#air.com.lunime.gachaworld/Local Store/#SharedObjects/saveslot1.sol'" > saveslot1.sol
# Su dispositivo B
adb push saveslot1.sol /sdcard/
adb shell su -c "cp /sdcard/saveslot1.sol '/data/data/air.com.lunime.gachaworld/app_#air.com.lunime.gachaworld/Local Store/#SharedObjects/'"
adb shell su -c "chmod 666 '/data/data/air.com.lunime.gachaworld/app_#air.com.lunime.gachaworld/Local Store/#SharedObjects/saveslot1.sol'"Codice promozionale trovato nel gioco: 147,693,112 (gemme e monete)
- Google Play Games App ID:
936144228846 - CloudFront CDN:
dh8vjmvwgc27o.cloudfront.net - Fazioni: Team Duck, Team Salt, Team Whale
- SWF versione 42, compresso con zlib, ~93MB decompresso