Flash Neopets Punkte Cheat

#1
Hallo erstmal...

Ich hab mich bei einer Spieleseite registriert und versuche nun, die URL die die dort erwendete SWF- bzw. FLV-Datei aufruft, zu modifizieren.

Ich möchte die gesendete Punktzahl erhöhen.
Seit Tagen probier ich schon herum, find aber keine Lösung...
Ich hab schon Google durchforstet, ich bekomme einige SourceCodes von Phyton und Java und auch ein bisschen VB.

Aber anscheinend funktionieren die meisten davon nicht mehr.
Deshalb wollte ich mal fragen, ob mir jemand helfen kann und mir vielleicht einen Snippet (am liebsten VB) geben kann, den man hierbei verwenden kann.

Ich danke schon mal im Vorraus!

Gruß Chris

// Hab jetzt auch den Code aus der SWF nachgebaut >> Immer noch kein Erfolg :(
 
Zuletzt bearbeitet:

Chromatin

Moderator
Mitarbeiter
#2
Hi Hacker.

Glaubst du wirklich, die Punktzahl wird bei diesem Spiel via "GET" rübergeschubst?
 

+++ATH0

Member of Honour
#3
Disassemble doch mal den Flash ActionScript P-Code (mit JPEXS oder den von sothink) und schau dir an wie die GET Url zusammengebaut wird. Bestimmt mit diversenen Session-Informationen, Hashes, Secrets und/oder Signaturen.
Diese Logik baust du dann nach.
 
#4
Glaubst du wirklich, die Punktzahl wird bei diesem Spiel via "GET" rübergeschubst?
So ungefähr.
Es wird der Username, die Zeit die man gespielt hat, die Spiel-ID multipliziert mit 300 und noch ein Hash als URL aufgerufen.

Gerade nochmal gespielt: Es ist kein GET somdern POST.
In "LiveHTTPHeaders" für Firefox steht:

POST /high_scores/process_flash_score.phtml?cn=120000&gd=206315&r=0.920586700085551&gmd_g=400&mltpl_g=0&gmdt_g=070082107111071109042066070067041121080049109119085068069037068076058052033080105117108064080051041105095125086116069087115108090071036087036040079038036033098053095125056103089044121043069071109063077111068040100122045044046049050104075115058050121036098042042068064116090059103121089080074072069036076049051&sh_g=1d4ec8b0c473aeaeb6ad&sk_g=524c989b687d58c8c85d&usrnm_g=[USERNAME]&dc_g=0&cmgd_g=89198&ddNcChallenge=0&fs_g=0 Referer: images(.)neopets(.)com/games/gaming_system/np8_include_v20.swf
Content-type: application/x-www-form-urlencoded
Content-length: 28

onData=%5Btype%20Function%5D
 
Zuletzt bearbeitet:

SchwarzeBeere

Moderator
Mitarbeiter
#5
Alternativ könntest du z.B. mit wireshark den Traffic mitschneiden und mit deinen Werten "nachbauen". Vorhandenes, legitimes Verhalten zu kopieren und leicht abzuändern ist meist einfacher, als sich einzelne Requests direkt aus dem generierten Code rauszusuchen und nur die außerhalb jeglichem Kontext neu zu senden.
 
#6
Alternativ könntest du z.B. mit wireshark den Traffic mitschneiden und mit deinen Werten "nachbauen". Vorhandenes, legitimes Verhalten zu kopieren und leicht abzuändern ist meist einfacher, als sich einzelne Requests direkt aus dem generierten Code rauszusuchen und nur die außerhalb jeglichem Kontext neu zu senden.
Wozu Wireashark? Ich benutze LiveHTTPHeaders.
So einfach nachbauen geht nicht. Ich hab versucht mit einem Tamper zu warten, bis das Spiel den Post abschicken will, hab diesen Post aufgehalten und wollte ihn abändern. Hab dort alledings festgestellt, dass der Score nicht im Klartext drinsteht. Dachte mir also, ich schick den Post unverändert ab. Aber schon diese Verzögerung von vielleicht 15 Sekunden hat ausgereicht, dass der Server von Neopets wahrscheinlich meint: "Timestamp stimmt nicht >> weg damit"
 
#7
Ich hab mir jetzt JPEXS runtergeladen und die SMF dekompiliert.
Ich kenn mich zwar mit Java nicht so aus, hab aber zumindest schonmal die richtige Stelle gefunden.
Das Herzstück des Postgenerators ist in der Datei
np8_include_v20 DoAction_11.java
Die ich aus der np8_include_v20.swf extrahiert habe und in den Anhang gehängt habe.
Ich versteh nicht ganz wie der Hash zustande kommt. :confused:
Hoffe Ihr könnt mir da helfen...

Kennt vielleicht jemand eine Art Proxyserver bei dem man einstellen kann, dass er bestimmte Sachen ersetzen soll? Zum Beispiel "score=\d{1,5}" ersetzen durch "score=99999" oder sowas in die Richtung?
Der Score ist im Hash versteckt, wenn ich das richtig deute
 
Zuletzt bearbeitet:
#8
OK,
ich hab jetzt mal versucht, den Code nachzubauen, der in der SWF als AS-Dateien gespeichert ist (scheint JAVA zu sein).

Ich hab ja von JAVA keine ahnung, aber ich hoffe, dass der Code soweit richtig nachgebaut ist, den ich da in VB hab.

Bloß bekomme ich immer den Fehler, dass der Hash fehlen würde.

Ich hab während dem Programmierens eine Datei mit Notizen erstellt:

In
DoAction_6.as, Zeile 95
wird die Function ch() aufgerufen. Sofort danach heißt es, der Score sei gesendet worden. // Wo wurde "objSendScore" deklariert??
Die ch() befindet sich in
DoAction_3.as, Zeile 6.


In
DoAction_3.as, Zeile 30
wird eine Function aus classCrypt.as aufgerufen. initBin.
Die beiden Parameter sind doch laut
classGameData.as, Zeilen 27,28
beide "35ba379a5d920acb6f18" oder etwa nicht??


In
DoAction_3.as, Zeile 31
ensteht das hier:
var _loc7_ = "ssnhsh=" + _NP8_GAME_DATA.sHash + "&ssnky=" + _NP8_GAME_DATA.sSK + "&gmd=" + _NP8_GAME_DATA.iGameID + "&scr=" + _NP8_ScoringSystem._SCORE.show() + "&frmrt=" + _NP8_GAME_DATA.iAvgFramerate + "&chllng=" + _NP8_GAME_DATA.iChallenge + "&gmdrtn=" + String(getTimer() - _NP8_GAME_DATA.tLoaded);
Was in der nächsten Zeile in Hexadezimal umgewandelt wird; anschließend läuft noch escapeString() drüber...


In
DoAction_3.as, Zeile 33
wir eine Variable erstellt, die nicht benutzt wird.


In
classCrypt.as, Zeile 116
entsteht die function binary(s). die nicht benutzt wird.



Ich bekomme nur Fehler 17 (IDS_SM_ERR_MISSING_HASH)!
In der SWF steht aber der Hash 35ba379a5d920acb6f18 drin, den ich verwendet hab...

Hab ich vielleicht den Java-Code falsch interpretiert? Die darin verwendete Logik hab ich doch komplett nachgebaut??

Mein Code dazu:
Code:
Public Class Neopets
    Public Declare Function GetTickCount Lib "kernel32" () As Long

    Public Shared strDecimals(19) As String
    Public Shared intBinLen As Integer
    Public Shared strBin As String


    ''' <summary></summary>
    ''' <param name="iGame">Die ID des Spiels</param>
    ''' <param name="iScore">Die Punktezahl</param>
    ''' <param name="iTime">Sollte eigentlich heißen, wie lange man in ms gespielt hat??</param>
    ''' <param name="sHash">Der jeweilige Hash</param>
    ''' <param name="sKey"></param>
    ''' <param name="sUsername">Der Benutzername</param>
    Public Shared Function GenerateURL(ByVal iGame As Integer, _
                                       ByVal iScore As Integer, _
                                       ByVal iTime As Integer, _
                                       ByVal sHash As String, _
                                       ByVal sKey As String, _
                                       ByVal sUsername As String) As String
        Dim r As String
        Strings()
        InitBin(sHash, sKey)
        r = "http://www.neopets.com/high_scores/process_flash_score.phtml?" & _
            "cn=" & iGame * 300 & _
            "&gd=" & iTime & _
            "&r=0." & fR(111111111, 999999999) & fR(111111, 999999) & _
            "&gmd_g=" & iGame & _
            "&mltpl_g=0" & _
            "&gmdt_g=" & AddSlashes("ssnhsh=" & sHash & _
                                    "&ssnky=" & sKey & _
                                    "&gmd=" & iGame & _
                                    "&scr=" & iScore & _
                                    "&frmrt=24" & _
                                    "&chllng=0" & _
                                    "gmdrtn=" & iTime) & _
            "&sh_g=" & sHash & _
            "&sk_g=" & sKey & _
            "&usrnm_g=" & sUsername & _
            "&dc_g=0" & _
            "&cmgd_g=89198" & _
            "&ddNcChallenge=0" & _
            "&fs_g=0"

        Return r
    End Function

    Public Shared Sub Strings()
        strDecimals(0) = "$Et-*Bmy);MH:vqwdf&XU~=72PhbWp.}3rN_LZO,sonY(cFT9{a16@!keKIlQxjVJg5+iS%D^GA0?Cu4zR8"
        strDecimals(1) = "%xy1LRKsjn;6lgFA,8@{+fOM-}!DcUoav*e=(iZWQt4d$E:Yb_9kV30qB7zmP~h?)NH5CTJpI^wSr2&XG.u"
        strDecimals(2) = "F8T=sl3.vfMS?nJu^r)h%$gc{@I9kqB}_+2,o1U:Qj!HaZWKeibztEwOp*y-DP0RN(5&;4L6V~mCdYxAX7G"
        strDecimals(3) = "{8PjWUF_bsG+EtHv.O@0?i$~L,a2yNozQDh%=^eYx*dwV3B&7Zl;SM1nTI9(:6qC4pJ}fAgk)Kc!r-RuXm5"
        strDecimals(4) = "!3g@b_Gn1ENeS0xqzJDc*pU}X%)osMd-Qku{~:7RI;?fT$WhAi&m5+t69yVBa=.8FKjZYl,4wO(PLCH2rv^"
        strDecimals(5) = "oLEUbQMNpPA^J}=,u258rKZHmB(Y3q{etG$1!wDIRy;d?:j+FS.~49_fX6*kT70lxWOsg)@%-&aCihvcVnz"
        strDecimals(6) = "~loagX)8=r4{:-zWB1O(+?KEL9IS$^.Chj0TqdG2w%FeU}uypA*V&5!@Q7c,NZJ6Db;xt_PskRfmiY3HMnv"
        strDecimals(7) = "z5&=UhA)rd.;Im0bvS6?x@uZ9Gj(liR7q$NX:WaHTe{,Ok!^JyQFVscKg8nECoM+D%PY3~4L_t2w}f1-Bp*"
        strDecimals(8) = "$&,l}Gc.RDE:(BkhpIw;zHCs{56xgY!)7LjAd1%PX24VyMUbQ3rom_-9v~f8tN*^SWT?qZnieOK+ua=FJ0@"
        strDecimals(9) = "lvEbI4y+O1D8SH_fiLQY5Tk-2XW!^K.quJcnd7ja$x~om=Gp*r0:{A,CR}P@(MVtNw&hF3Z;?s%zB6)eUg9"
        strDecimals(10) = "Y$*GJwqt^ZN{:pu.v(;c2O30~aD!Vsmd1%7SiHjIe@A5glP}EMnbUWf+_&BQoCKh)RTx4-698Xzky,?Lr=F"
        strDecimals(11) = "ft2dMW~ncsZY:3-J%yhi{8j)*aQxA^!?z9bXpS+RuOFLwqk(B&P_HCrUl1},N@Em.TgoI547vDVGe0;$K=6"
        strDecimals(12) = "U;)=iw:6(uoR7!05VHC-BsyfAcSPG~3@ZmWF_tDX8}xOk1vpNET$Y?jb&*%492e.LJ,zglaMr{d+KQnh^Iq"
        strDecimals(13) = "?mF-P0Mb8,~5J(kQys$KzOL6^@2)V%w+9d}CN:n;lWjE.qH3x7RScYo!g={4teT_*iU&1GfXDBurhAIapvZ"
        strDecimals(14) = "&hlS9G(Qe?^!;%scB~4r+YFDPt$uj3Nm{:5v}861z=wAo0Ly@KROp.qM-HXZ*W,2_kUIJiECdVgxb)nfTa7"
        strDecimals(15) = "ZUu+NfclrKiRYAI;vM!O?L*et=~},)7@FQ:sPp$W5yEXbT8V(-qhmzw{J^nD2S.%j0da&xC1G_gBo6H943k"
        strDecimals(16) = "bWT?_fMev,HVmXyNSI2GR@&$Zt=O.uQ(gLErY3Ac!*jlD9kUqad~-P14%n8xsi6p7Fh{}Jz:KC;^+0o5)Bw"
        strDecimals(17) = "sy,X4O)(KS!0~{=+LbZD8edapAg%_v@:z-EuTh;xcMkVRri?F36$&tQHfl5nqIYNGj^PmUBCo.}Jw*2W719"
        strDecimals(18) = ")izKWhTc%4E-IrmJ,.MZ8+bjp;2Fwu7X{stl56S9_*D=C?0o}PQqAVBHRUNaey^!&f$kYOv3L1:dn~(g@xG"
        strDecimals(19) = "J=w%QM@4Ixt2!R&q0oBh*YakcXT6{g;K3CyZSFujfsEPUV,1vz.O-9(Li}_?Am+rN:bH5D$W7Gdp^~)l8ne"
    End Sub



    ''' <summary></summary>
    ''' <param name="sh">Hash</param>
    ''' <param name="sk">Key</param>
    Public Shared Sub initBin(ByVal sh As String, ByVal sk As String)
        strBin = sh & sk
        intBinLen = strBin.Length
    End Sub


    Public Shared Function addSlashes(ByVal s As String) As String
        Return EscapeString(Hex2Bin(s))
    End Function

    Public Shared Function Hex2Bin(ByVal s As String) As String
        'Diese Function stammt aus dem Internet. Der originale Bezeichner lautete Function Hex2Bin
        Dim lngRandom As Long = fR(0, 19) '_loc8_ in der SWF
        Dim intTemp(2) As Integer
        intTemp(0) = 0
        intTemp(1) = 0
        intTemp(2) = 0

        Dim strHex As String = strDecimals(CInt(lngRandom))
        Dim strReplace As String = ""

        For intTemp(1) = 0 To Len(s) - 1
            If intTemp(2) >= intBinLen Then
                intTemp(2) = 0
            End If

            intTemp(0) = InStr(1, strHex, Mid$(s, intTemp(1) + 1, 1))

            If intTemp(0) = 0 Then
                strReplace = strReplace & Mid$(s, intTemp(1) + 1, 1)
            Else
                intTemp(0) = (intTemp(0) + InStr(1, strHex, Mid$(strBin, intTemp(2) + 1, 1)) - 2) Mod 83
                strReplace = strReplace & Mid$(strHex, intTemp(0) + 1, 1)
            End If

            intTemp(2) = intTemp(2) + 1
        Next intTemp(1)

        If lngRandom >= 10 Then
            strReplace = strReplace & CStr(lngRandom)
        Else
            strReplace = strReplace & "0" & CStr(lngRandom)
        End If

        Return strReplace
    End Function

    Public Shared Function escapeString(ByVal s As String) As String
        Dim strReplace As String = ""
        Dim strTemp As String

        For i As Integer = 1 To s.Length
            strTemp = CStr(Asc(Mid$(s, i, 1))) 'Entspricht classCrypt.as, Zeile 104

            For intTemp2 As Integer = 3 - strTemp.Length To 1 Step -1
                strTemp = "0" & strTemp 'Entspricht classCrypt.as, Zeile 108
            Next

            strReplace &= strTemp 'Entspricht classCrypt.as, Zeile 111
        Next

        Return strReplace
    End Function

    Public Shared Function fR(ByVal lL As Long, ByVal lH As Long) As Long
        Randomize(GetTickCount)
        lH = lH + 1
        lL = lL - 1

gR:
        fR = CLng(Rnd() * (lH - lL) + lL)
        If fR = lH Then GoTo gR
        If fR = lL Then GoTo gR
    End Function
End Class
Ich versteh´s nicht...
 
Oben