Überlauf beim XORen...

-Pharao-

Grünschnabel
Hallo Leute, bin neu hier. ^^
Da ich C++ nur sehr schlecht beherrsche und Visual Basic dafür besser kann, wollte ich eine kleine Funktion von C++ nach VB 2005 umschreiben, damit ich mit ihr besser arbeiten kann. Das hab ich auch getan, allerdings bekomme ich immer einen Überlauf.

Zuerstmal, was die Funktion machen soll: Sie soll einen verschlüsselten hexadezimalen "Code" entschlüsseln. Beispiel:
Verschlüsselt:
address: 0xD935946C
value: 0xD758DF54

Nach dem Entschlüsseln:
address: 0x04225E98
value: 0x00630001

Das funktioniert ja auch, allerdings nur beim C++ Code. Die selbe Funktion bricht in VB 2005 mit einem Überlauf ab.

Hier die Funktion in C++ (bei der keine Fehler auftreten):
Code:
void DecryptGSACode(unsigned int address, unsigned int value) 
{
  unsigned int rollingseed = 0xC6EF3720;
  unsigned int seeds_v1[] =  { 0x09F4FBBD, 0x9681884A, 0x352027E9, 0xF3DEE5A7 }; 
  unsigned int seeds_v3[] = { 0x7AA9648F, 0x7FAE6994, 0xC0EFAAD5, 0x42712C57 };
  unsigned int *seeds = seeds_v3;
  
  int bitsleft = 32;
  while (bitsleft > 0) {
    value -= ((((address << 4) + seeds[2]) ^ (address + rollingseed)) ^
              ((address >> 5) + seeds[3]));
    address -= ((((value << 4) + seeds[0]) ^ (value + rollingseed)) ^
                ((value >> 5) + seeds[1]));
    rollingseed -= 0x9E3779B9;
    bitsleft--;
  }
  textBox1->Text = Convert::ToString(address);
  textBox2->Text = Convert::ToString(value);
}
Angezeigt werden "address" und "value" übrigens am Ende in Dezimal. In Hexadezimal rechne ich die noch um.

Umgeschrieben in VB 2005:
Code:
Private Function DecryptGSACode(ByVal address As ULong, ByVal value As ULong)
    Dim rollingseed As ULong
    Dim seeds0 As ULong
    Dim seeds1 As ULong
    Dim seeds2 As ULong
    Dim seeds3 As ULong
    Dim bitsleft As Integer

    rollingseed = 3337565984 'Nimmt den Wert in Hexadezimaler Form nicht an, daher Dezimal.
    seeds0 = &H7AA9648F
    seeds1 = &H7FAE6994
    seeds2 = 3236932309 'Siehe Kommentar oben
    seeds3 = &H42712C57
    bitsleft = 32

    While bitsleft > 0
        value -= ((((address << 4) + seeds2) Xor (address + rollingseed)) Xor _ 
            ((address >> 5) + seeds3))
        address -= ((((value << 4) + seeds0) Xor (value + rollingseed)) Xor _
            ((value >> 5) + seeds1))
        rollingseed -= &H9E3779B9
        bitsleft = bitsleft - 1
    End While

    TextBox1.Text = address
    TextBox2.Text = value
End Function

Was hab ich falsch gemacht? Ist es überhaupt möglich diese Funktion fehlerfrei nach VB 2005 umzuschreiben?
 
Zuletzt bearbeitet:
Das Problem mit den großen hexadezimalen Zahlen in VB ist, dass sie als negative Zahlen interpretiert werden, warum weiß ich nicht. Um das zu umgehen, solltest du hinter jeden Hexadezimalen Ausdruck das UI-Präfix für UnsignedInteger anhängen und die Variablen auf UInteger umfunktionieren. Z.B:

Code:
( ... )

Dim rollingseed As UInteger = &HC6EF3720UI

( ... )
Dann sollte es eigentlich auch mit den XOR-Ausdrücken klappen, da keine negativen Zahlen mehr vorhanden sind.

Gruß
PhoenixLoe
 
Danke für die Antwort! :)
Allerdings funktioniert es trotzdem nicht...

Die Funktion sieht nun so aus:
Code:
Private Function DecryptGSACode(ByVal address As UInteger, ByVal value As UInteger)
    Dim rollingseed As UInteger = &HC6EF3720UI
    Dim seeds0 As UInteger = &H7AA9648FUI
    Dim seeds1 As UInteger = &H7FAE6994UI
    Dim seeds2 As UInteger = &HC0EFAAD5UI
    Dim seeds3 As UInteger = &H42712C57UI
    Dim bitsleft As Integer
    bitsleft = 32

    While bitsleft > 0
        value -= ((((address << 4) + seeds2) Xor (address + rollingseed)) Xor _ 
            ((address >> 5) + seeds3))
        address -= ((((value << 4) + seeds0) Xor (value + rollingseed)) Xor _
            ((value >> 5) + seeds1))
        rollingseed -= &H9E3779B9UI
        bitsleft = bitsleft - 1
    End While
    TextBox1.Text = address
    TextBox2.Text = value
End Function
 
Versuch's mal so:

Code:
Private Sub DecryptGSACode(ByVal address As Long, ByVal value As Long)
        Dim rollingseed As Long = &HC6EF3720
        Dim seeds0 As Long = &H7AA9648F
        Dim seeds1 As Long = &H7FAE6994
        Dim seeds2 As Long = &HC0EFAAD5
        Dim seeds3 As Long = &H42712C57
        Dim bitsleft As Integer
        bitsleft = 32

        Dim v As Long = value
        Dim a As Long = address

        While bitsleft > 0
            v -= ((CLng(address << 4) + seeds2) Xor (address + rollingseed)) Xor _
                (CLng(address >> 5) + seeds3)
            a -= ((CLng(value << 4) + seeds0) Xor (value + rollingseed)) Xor _
                (CLng(value >> 5) + seeds1)
            rollingseed -= &H9E3779B9
            bitsleft = bitsleft - 1
        End While
        TextBox1.Text = a
        TextBox2.Text = v
 End Sub

Bei mit funktioniert's jetzt!

Gruß
PhoenixLoe
 
Funktionieren tut es... Allerdings ist die Berechnung nicht mehr ganz korrekt xD
Durch Long werden einige Hexadzimalen Zahlen negativ, was aber nicht passieren darf. Dadurch kommt am ende irgendeine Zahl raus, die gar keinen Sinn macht =/
 
Zuletzt bearbeitet:
Dann häge zusätzlich an jede Hexadezimal-Zahl wieder das ein UI an, um die Zahlen positiv zu formatieren, und versuch's nochmal!

Gruß
PhoenixLoe
 
Na, das hatte ich gleich als erstes probiert ^_^
Allerdings liegt der Fehler darin, dass v und a als Long deklariert wurden und somit signed sind. Änder ich den Datentyp zu ULong gibt es wieder einen Überlauf... :(
 
Ich hab jetzt mal UL statt UI genommen... Es funktioniert aber mit beiden nicht.
Code:
Private Sub DecryptGSACode(ByVal address As Long, ByVal value As Long)
    Dim rollingseed As Long = &HC6EF3720UL
    Dim seeds0 As Long = &H7AA9648FUL
    Dim seeds1 As Long = &H7FAE6994UL
    Dim seeds2 As Long = &HC0EFAAD5UL
    Dim seeds3 As Long = &H42712C57UL
    Dim bitsleft As Integer
    bitsleft = 32

    Dim v As ULong = value
    Dim a As ULong = address

    While bitsleft > 0
        v -= ((CLng(address << 4) + seeds2) Xor (address + rollingseed)) Xor _
            (CLng(address >> 5) + seeds3)
        a -= ((CLng(value << 4) + seeds0) Xor (value + rollingseed)) Xor _
            (CLng(value >> 5) + seeds1)
        rollingseed -= &H9E3779B9UL
        bitsleft = bitsleft - 1
    End While
    TextBox1.Text = a
    TextBox2.Text = v
End Sub
 
Zuletzt bearbeitet:
Zurück