Home of Gamehacking - Archiv

Normale Version: Trainermodul problem auf Prozess 64Bit
Sie sehen gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2 3
(29.11.2016, 17:11)iNvIcTUs oRCuS schrieb: [ -> ]Find ich jetzt eigentlich nicht allzu schwer...
Einfach zu jeder ausgelesenen Adresse ein weiteres Label oder Edit Feld in die Anwendung integriert und anzeigen lassen.
Genauso wie die Infos zur Prozess ID und die Basisadresse des Moduls.
Denn irgendwo in dieser Kette scheint ja ein Fehler drin zu sein und der Rückgabewert ist 0.
Könnte vielleicht auch sein das die Runtimes auf dem 2. Rechner nicht aktuell sind oder gänzlich fehlen.

Warum? Bei mir geht doch alles. Wie soll ich das ohne ihn sein Rechner Testen?
Auf seinen PC kommt der Wert 0 und nicht bei mir. Vor allem hatte er am ende den allergleichen Code kompiliert. Entweder an sein PC ist wirklich was faul, oder der Trainer bugt bei ihm und kommt mit seiner Hardware nicht richtig klar.
So mein Kollege ist heute on und wir haben über Teamviewer das versucht.
Wir haben darunter auch Solitaire getestet weil das auch 64bit ist um fehler auszuschliessen.
Da funktioniert das Pointern einwandfrei im Code und wird auch korrekt ausgelesen.
Bei 7 Days To Die so heisst das Spiel, da soll er ein Pointer auslesen. Da liest er nur bis zum vorletzten offset wenn er alle offsets mit baseadresse lesen soll, dann zeigt er den Wert 0 an. Was bei mir aber nicht der fall ist. Irgendwas stimmt bei ihm nicht.
Jedenfalls nach wie vor Cheat Engine arbeitet bei ihm korrekt und wir haben mehrfach auf fehlerhafte Eingabe geprüft und keine Fehler gehabt in der hinsicht.
Der Code ist genau gleich in die Pointer sind auch gleich gewesen dann haben wir andere Pointer geprüft die kleiner als 5 Offsets waren trotzdem sobald er den ganzen Pointer auslesen soll kommt wieder Wert 0 raus. Wir haben auch die direkte Adresse ausgelesen ohne Pointern, da kommt auch nur Wert 0 raus.

Zusätzlicher Test.
Wir haben andere Ziel Adressen ins Visier genommen, zb.: Lebenspunkte anzeige.
Wir haben festgestellt das komischerweise diese Adresse direkt und mit Pointer ausgelesen werden kann.
Könnte die andere Adresse ein Speicherschutz haben? Wenn das wirklich der fall ist, warum kann das dann mein PC lesen mit dem Trainermodul und Cheat Engine.
Bei mein Kollegen schafft das nur Cheat Engine, aber nicht das Trainermodul. Was fehlt bei ihm was ich habe... Visual C++ vielleicht nochmal drüber installieren? Was für ein Grund könnte es noch sein?
Hat er bei Visual Basic die gleiche .NET Framework Version eingestellt? Hatte damit auch schonmal Probleme.
(30.11.2016, 23:27)DNA schrieb: [ -> ]Hat er bei Visual Basic die gleiche .NET Framework Version eingestellt? Hatte damit auch schonmal Probleme.

ja wie bereits gesagt alles war gleich, das betrifft auch die Netframework Version.
Wir haben sogar mal kurz auf 2.0 runter geswitcht und wieder auf 4.0 zurück gesetzt damit der PC das frisch übernimmt, kann ja sein das es bugt da er ja von mir das projekt bekommen hat.
Leider gab es da keine Wirkung.
Hallo zusammen Smiling .
So ich habe jetzt was ganz blödes festgestellt. Das mein Trainermodul trotzdem das er auf 64Bit gestellt ist nur 32Bit Ziel Adressen lesen kann, was darüber liegt liest er immer den Wert 0.

So sieht derweile mein Code aus und möchte versuchen das es auch ohne probleme auf 64Bit Spiele ansprechen kann.

Könnt ihr mir bei der Umstellung behilflich sein?
DNA falls du mal Zeit hast könntest du mir da helfen?

Falls ich es selber hinbekomme, werde ich mich rechtzeitig melden.




Wäre echt dankbar, wenn jemand hilft den es gibt mittlerweile immer mehr Spiele die 64Bit fähig sind.
DNA hat gesagt damals es lohnt sich noch nicht soweit ich mal was gelesen habe, aber ich bin der meinung ab jetzt wäre der geeignete Zeitpunkt und wir würden alle hier profitieren.

mfg.
Xiantrius
Also wenn ich das richtig lese dann sind bei deinem Trainermodul sämtliche ProcessHandles als 32 Bit Integer definiert.
In erster Linie sind Process Handles nur positive Zahlen. Demzufolge also UInt32. Allerdings sind auf 64 Bit Betriebssystemen die Handles als UInt64 definiert bzw. können diese Größe annehmen.
Vielleicht hilft das schon hier diese Definitionen anzupassen...
Ansonsten wäre dann DNA hier wieder das Genie welcher sich mit VB am besten auskennt.
Du meinst sicherlich HProcess auf UInt64 stellen, wenn es sich um ein 64 Bit Prozess handelt oder?
Das habe ich gemacht und trotzdem kommt nur der Wert 0 raus bei höheren Ziel Adressen.

Visual Basic Code
    Private Declare Function RPM Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInt64, ByVal lpBaseAddress As Int64, ByRef lpBuffer As SByte, ByVal nSize As Int32, ByRef lpNumberOfBytesWritten As Int32) As SByte
   
   Private Declare Function RPM Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInt64, ByVal lpBaseAddress As Int64, ByRef lpBuffer As Byte, ByVal nSize As Int32, ByRef lpNumberOfBytesWritten As Int32) As Byte
   
   Private Declare Function RPM Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInt64, ByVal lpBaseAddress As Int64, ByRef lpBuffer As Int16, ByVal nSize As Int32, ByRef lpNumberOfBytesWritten As Int32) As Int16
   
   Private Declare Function RPM Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInt64, ByVal lpBaseAddress As Int64, ByRef lpBuffer As UInt16, ByVal nSize As Int32, ByRef lpNumberOfBytesWritten As Int32) As UInt16
   
   Private Declare Function RPM Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInt64, ByVal lpBaseAddress As Int64, ByRef lpBuffer As Int32, ByVal nSize As Int32, ByRef lpNumberOfBytesWritten As Int32) As Int32
   
   Private Declare Function RPM Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInt64, ByVal lpBaseAddress As Int64, ByRef lpBuffer As UInt32, ByVal nSize As Int32, ByRef lpNumberOfBytesWritten As Int32) As UInt32
   
   Private Declare Function RPM Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInt64, ByVal lpBaseAddress As Int64, ByRef lpBuffer As Int64, ByVal nSize As Int32, ByRef lpNumberOfBytesWritten As Int32) As Int64
   
   Private Declare Function RPM Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInt64, ByVal lpBaseAddress As Int64, ByRef lpBuffer As Single, ByVal nSize As Int32, ByRef lpNumberOfBytesWritten As Int32) As Single
   
   Private Declare Function RPM Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As UInt64, ByVal lpBaseAddress As Int64, ByRef lpBuffer As Double, ByVal nSize As Int32, ByRef lpNumberOfBytesWritten As Int32) As Double


Damit das bisschen veranschaulicht ist hab ich eine Listbox gemacht und möchte euch den Code posten wie ich das ausführe als kleines beispiel und ein Screenshot meiner Form zeigen wie es aussieht.

Visual Basic Code
    Private Function DoesProcessExists(ByVal PName As String) As Boolean
        Return System.Diagnostics.Process.GetProcessesByName(PName).Length >= 1
    End Function

    Public Const ProcName = "7DaysToDie"
    Dim BaseAddress_EXE As Int64
    Dim BaseAddress_DLL As Int64

    Public Function Does7DaysToDie_EXE(ByVal Test As Boolean) As Boolean
        BaseAddress_EXE = GetModuleBase_64Bit(ProcName, ProcName & ".exe")
        GetProcessId(ProcName)
        Return BaseAddress_EXE
    End Function

    Public Function Does7DaysToDie_DLL(ByVal Test As Boolean) As Boolean
        BaseAddress_DLL = GetModuleBase_64Bit(ProcName, "mono.dll")
        GetProcessId(ProcName)
        Return BaseAddress_DLL
    End Function

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        If DoesProcessExists("7DaysToDie") = True Then
            BaseAddress_EXE = GetModuleBase_64Bit(ProcName, ProcName & ".exe")
            GetProcessId(ProcName)
            ListBox1.Items.Clear()
            ListBox1.Items.Add("Processname:" & ProcName)
            ListBox1.Items.Add("ProcessID:" & GetProcessId(ProcName))
            Dim TestexeAddresse As Int64 = GetModuleBase_64Bit(ProcName, "7DaysToDie.exe")
            ListBox1.Items.Add("Process Adresse:" & Hex(TestexeAddresse))
            Dim TestdllAddresse As Int64 = (GetModuleBase_64Bit(ProcName, "mono.dll"))
            ListBox1.Items.Add("Process Adresse + DLL:" & Hex(TestdllAddresse))
            Dim Zieladresse32Bit As Int32 = &H7FFF3FEF
            ListBox1.Items.Add("Ist noch in den 32Bit Hexadresse=7FFF3FEF: Wert=" & Read_8Byte_Int64(Zieladresse32Bit))
            Dim Zieladresse64Bit As Int64 = &H80000002
            ListBox1.Items.Add("Ist schon über den 32Bit limit Hexadresse=80000002: Wert=" & Read_8Byte_Int64(Zieladresse64Bit))
        End If
    End Sub



[Bild: beispielj0p3laf1c5.png]

Ihr seht die Process Adresse wird ausgelesen, genauso die ID des Prozesses und eine DLL die eine sehr lange Hexzahl als Adresse hat. Ich weis nur nicht warum es bei direkten adressen immer Wert 0 ergibt wenn diese dann über die 32Bit schwelle kommen das selbe problem habe ich auch wenn es um eine Pointeradresse mit Offsets geht die eine Zieladresse anvisieren sollen da kommt der Wert ebenfalls auf 0.
HProcess habe ich auf UInt64 gemacht.

Nun weis ich auch warum es bei mir mal zufällig ging, weil er mal Adressen im Pointer als Ziel genommen hat die in der 32Bit schwelle waren. Bei mein kollegen war das dann halt immer Pech, bis es mich dann getroffen hat. Nun weis ich es...

Nur ich weis nicht was man an den Trainermodul noch ändern soll.

Hey, du musst im Trainermodul bei sämtlichen Schreib- und Lesefunktionen folgendes abändern
(gilt nur für 64bit!)


Public Function Read_1Byte_SByte(ByVal address As Int64) As SByte
       Dim process_handle As Int32, value As SByte
       process_handle = OpenProcess(ACCESS_RIGHTS_ALL, False, process_id)
       If process_handle <> 0 Then
           RPM(process_handle, address&, value, 1, 0)
       End If
       CloseHandle(process_handle)
       Return value
   End Function
(10.12.2016, 22:26)DNA schrieb: [ -> ]Hey, du musst im Trainermodul bei sämtlichen Schreib- und Lesefunktionen folgendes abändern
(gilt nur für 64bit!)


Public Function Read_1Byte_SByte(ByVal address As Int64) As SByte
       Dim process_handle As Int32, value As SByte
       process_handle = OpenProcess(ACCESS_RIGHTS_ALL, False, process_id)
       If process_handle <> 0 Then
           RPM(process_handle, address&, value, 1, 0)
       End If
       CloseHandle(process_handle)
       Return value
   End Function

Ok soviel ich verstanden hab soll das so aussehen >>> RPM(process_handle, address&, value, 1, 0) <<<
Allerdings meckert er mich voll das address& nicht deklariert ist verknüpft mit anderen Meldungen in einen Fehlerprotokoll.
Naja ehrlich gesagt wird das & zeichen nicht hinter dem variablename als ankettung akzeptiert.

Ich habe es auch schon so probiert.

Code:
RPM(process_handle, address&, value, 1, 0)

RPM(process_handle, address &, value, 1, 0)

RPM(process_handle, address & value, 1, 0)


Was willst du mir mit dem & Zeichen sagen?

Wie versprochen Smiling
So nach langer und harter Arbeit an den Trainermodul trägt es endlich langsam Früchte und ist nun zum vollen testen einsatzbereit. Ich habe soviel getestet wie ich konnte und Fehler hier und da ausgebügelt und Anpassungen gemacht.
Auch DNA war beteiligt und hat mit geholfen, daher geht mein dank auch an ihm.
Ich werde nun die erste Trainermodul_64Bit version für Spiele die über 64Bit Prozess laufen anbieten.
7 Days To Die ist eines davon und man kann dort den Trainermodul gut testen.
Wenn irgendwelche Fehler in mein Trainermodul noch sind, dann teilt sie hier bitte mit.
amsonsten wäre hier das Thema abgeschlossen, sollte die nexte Zeit kein nextes problem darüber anbahnen.


Hier ist der Download Link >>> Trainermodul_64Bit <<< Wünsche euch damit viel Spass. Wink

Ich gehe jetzt ins Bett hab bis heute früh durch geackert damit gute Nacht.


mfg.
Xiantrius
Seiten: 1 2 3