Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Fingerboarder
Anmeldungsdatum: 09.12.2006 Beiträge: 37
|
Verfasst am: 01.05.2008, 21:18 Titel: Speedhack beim Spiel verhindern |
|
|
Hallo everyone!!
Bei einem Spiel das ich programmiert habe, geht es darum, in möglichst kurzer zeit objekte hintereinander anzuklicken. Die Spielgeschwindigkeit und die Reaktion wir mithilfe von timer ermittelt. Der score wird dann online gestellt.
vor ein paar tagen hat aber mein kumpel mit so einem Programm namens CheatEngine mein programm gespeedhacked. d.h. das spiel läuft dann langsamer. und das schärfste: die reaktionszeit ist auch viel kleiner und so erreicht der milliarden an punkten.
Nun die eigentliche Frage: wie kann ich das verhindern?
Mfg FBRider |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.05.2008, 22:01 Titel: |
|
|
gar nicht. es sei dem, du hackst dich selber in die winapi rein. kommt dann nur noch drauf an, wer von beiden stärker ist.
wer cheaten muss ist selber schuld, so meine devise... und baue deswegen selbst lustige cheats in meine spiele rein  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Fingerboarder
Anmeldungsdatum: 09.12.2006 Beiträge: 37
|
Verfasst am: 01.05.2008, 22:06 Titel: |
|
|
hi jojo.
ja das stimmt. aber ich find das nur bei einzelspielern gut.
die anderen spieler kommen sich halt vera....t vor, da der score online ist.
das stört mich halt. vielleicht some art punkbuster basteln
mfg fbrider |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 01.05.2008, 22:07 Titel: |
|
|
ich weiß nicht, ob das möglich ist, aber du kannst (falls du das noch nicht macht) versuchen, mit TIMER die wirklich benötigte zeit zu ermitteln. TIMER gibt nämlich die anzahl der sekunden zurück, die seit dem start des systems vergangen sind. und so ein cheatmodul sollte nicht das ganze system ausbremsen... _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 01.05.2008, 22:18 Titel: |
|
|
lokales cheating lässt sich leider nicht effektiv unterbinden. Der nutzer kann grundsätzlich und potientiell jede lokal gespeicherte information anzeigen und ändern lassen, alles was dessen pc dir zusendet kann gefälscht sein (aimbot zB) und alles was du ihm zusendest und was er sich daraus erschließen kann kann er sich anzeigen lassen (wall/maphacks zB). Einen effektiven schutz dagegen gibt es nicht, du kannst lediglich eine erkennung für bekannte signaturen von programmen, die solche eingriffe vornehmen einbauen, individualentwicklungen wirst du aber nie entdecken oder bekämpfen können. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Fingerboarder
Anmeldungsdatum: 09.12.2006 Beiträge: 37
|
Verfasst am: 01.05.2008, 22:30 Titel: |
|
|
@jojo: JA ich benutze bereits timer (siehe erster post). bei cheatengine kann man ka den process auswählen und dann den speed auf zB 0.1 stellen. da ich ja alles mit timer mache, muss also timer gehackt werden.
@misterD: dann kann ich ja gleich nen pb einbauen = zu aufwendig für dieses kleine prog. |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 01.05.2008, 23:44 Titel: |
|
|
selbst der gibt dir wie bereits gesagt keinen echten schutz.. _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 02.05.2008, 17:25 Titel: |
|
|
[vermutung]Das ist einfach ein ramcheat, also der bearbeitet den speicherbereich deines programms. Die Funktion Timer an sich muss dabei gar nicht verändert werden, sondern nur die Variable, in der dann was gespeichert wird. So ein programm muss dann nur noch die Variablen suchen, die innerhalb von einer Sekunde um 1 erhöht werden (ist bei double variablen komplizierter aber auch nicht unbedingt schwer).
Man könnte jetzt von dem Wert jeder Variable, die mit der Zeitrechnung zu tun hat, nen hash wert erstellen, der dann bei zugriff auf die Variable geprüft wird. Sobald da ein Unterschied ist, wurde gecheatet. Nachteil: Variablenzugriffe dauern länger, da immer geprüft werden muss.
Ich würde das dann z.B. so machen:
Code: |
#macro _type_(_datentyp_)
Type t_##_datentyp_
'Private:
variable As _datentyp_
hash As _datentyp_
Declare Function create_hash() As _datentyp_
Public:
Declare property wert(_wert_ as _datentyp_)
Declare property wert as _datentyp_
Declare Constructor ()
end type
Constructor t_##_datentyp_##
this.hash = create_hash()
End Constructor
Function t_##_datentyp_##.create_hash() As _datentyp_
Dim As Byte Ptr pvar, phash
Dim As _datentyp_ temp
'If len(this.variable) = 0 Then Print "...." : Return ""
temp = this.variable
#if _datentyp_ = String
pvar = cast(byte ptr, strptr(this.variable))
If pvar = 0 Then Return ""
phash = cast(byte ptr, strptr(temp))
#else
pvar = cast(byte ptr, @this.variable)
phash = cast(byte ptr, @temp)
#endif
phash[0] = pvar[0] xor 255
For i As Integer = 1 to Len(this.variable) - 1
phash[i] = (pvar[i] Xor 255) Xor phash[i-1]
Next i
Return temp
End Function
Property t_##_datentyp_##.wert(_wert_ As _datentyp_)
If this.hash <> create_hash() Then Print "Cheater!": End
this.variable = _wert_
this.hash = this.create_hash
End Property
Property t_##_datentyp_##.wert as _datentyp_
If this.hash <> create_hash() Then Print "Cheater!": End
Return this.variable
End Property
#endmacro
#macro _dim_(_name_, _datentyp_)
#ifndef t_##_datentyp_
_type_(_datentyp_)
#endif
Dim var_##_name_ As t_##_datentyp_
#define _name_ var_##_name_.wert
#endmacro
_dim_(test, string)
_dim_(muh, integer)
muh = 3
test = "hallo"
Print test
test = "..."
Print test
'zur simulation eins von beiden auskommentieren:
' var_test.variable = "asddd"
' var_muh.variable = 4
'
test = "2"
Print muh |
Ja, das is kein richtiger Hash. Soll nur darstellen, wie das machbar wäre. Ob es schutz bietet kann ich dir auch nicht sagen, aber eigentlich sollte das gegen ramcheat helfen.
[/vermutung] _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 02.05.2008, 18:38 Titel: |
|
|
Michael712, das glaub ich eher kaum. den systemtimer kann man sehr einfach verändern, was z.B. das capture-programm kkapture beweist. dabei werden die ganzen systeminternen befehle für die gestartete demo umgeleitet, sodass die demo auch brav wartet, bis das bild fertig gecaptured wurde.
Aber ich gehe jetzt nicht ins detail, wenn ihr mehr dazu erfahren wollt, schaut euch das Seminar von Ryg auf der BP08 an (ich hab's live gesehen ). _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 02.05.2008, 22:50 Titel: |
|
|
naja, wie gesagt, es war nur eine vermutung.
und mein code sollte gegen programme, die den ram verändern, helfen
aber man kann IMHO den speedhack auch umgehen. Man muss sich nur ne routine coden, die timer ersetzt
Hätte ich jetzt windows und das cheat programm, dann würde ich mal 5min was versuchen... _________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 02.05.2008, 23:04 Titel: |
|
|
naja, wenn man das ganz oldschool mit for...next löst (muss vorher kalibriert werden, ist aber trotzdem noch ungenau!), könnte man diese speedhacks eventuell verhindern. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 02.05.2008, 23:18 Titel: |
|
|
Du könntest das eventuell auf mit einer hörteren Lösung versuchen. Hierbei ist es nicht so einfach zu manipulieren. Jedcohmusst du sehr viele berechnungen im Spiel durchführen, um zu verhinden, das man Timing-Manipulationen vornimmt. (Verhindern kann man das wohl nie ganz, allerdings sehrwohl erschweren)
grundlage ist ein Getimter Spielablauf, desen Zeitabstand sich aus dem standard-Timerwert und dem CPU MIPS Count zusammensetzt. Diese beiden Werte kannst du so miteinader verrechnen, und über eine 2te Variable umrechnen, das du daraus die zeit beziehst. Dadurch reicht es nicht aus, nur den Timer zu ändenr, sondern auch den Wert der CPU Clocks. bzw das Ergebniss.
Um die CPU Clocks zu ermitteln, kannst du folgenden Code nutzen:
[C-DLL]
Code: | #include "dll.h"
void _stdcall cpuspeed(ULARGE_INTEGER *tsc)
{
ULARGE_INTEGER r_bef_tsc;
ULARGE_INTEGER r_aft_tsc;
LARGE_INTEGER t_bef_tsc;
LARGE_INTEGER t_aft_tsc;
LARGE_INTEGER t_freq_tsc;
QueryPerformanceFrequency(&t_freq_tsc);
QueryPerformanceCounter(&t_bef_tsc);
_asm
{
rdtsc
mov r_bef_tsc.HighPart,edx
mov r_bef_tsc.LowPart,eax
}
Sleep(1000);
_asm
{
rdtsc
mov r_aft_tsc.HighPart,edx
mov r_aft_tsc.LowPart,eax
}
QueryPerformanceCounter(&t_aft_tsc);
//t_bef_tsc.QuadPart = t_bef_tsc.QuadPart / t_freq_tsc.QuadPart;
//t_aft_tsc.QuadPart = t_aft_tsc.QuadPart / t_freq_tsc.QuadPart;
t_aft_tsc.QuadPart = t_aft_tsc.QuadPart - t_bef_tsc.QuadPart;
t_aft_tsc.QuadPart = t_aft_tsc.QuadPart - t_freq_tsc.QuadPart;
t_aft_tsc.QuadPart = (t_aft_tsc.QuadPart / t_freq_tsc.QuadPart) * 100;
r_aft_tsc.QuadPart = r_aft_tsc.QuadPart - r_bef_tsc.QuadPart;
r_aft_tsc.QuadPart = r_aft_tsc.QuadPart - (r_aft_tsc.QuadPart / t_aft_tsc.QuadPart );
*tsc = r_aft_tsc;
}
void _stdcall rdtsc_(ULARGE_INTEGER *tsc)
{
ULARGE_INTEGER t_tsc;
_asm
{
rdtsc
mov t_tsc.HighPart,edx
mov t_tsc.LowPart,eax
}
*tsc = t_tsc;
}
|
Das is aus einem meiner alten Kernel, mit dessenhilfe ich ebenfalls ein Timingmodel bzw. einen HighSpeed-Timer bauen wollte / habe).
Die Rückgaben sind die Realen Clockwerte der CPU. Allerdings weis ich nicht, ob das auf Multicore systeme arbeitet, ode überhaupt mit den aktuellen Prozessoren. Das ist schon sooo lange her, das ich dir da auch nicht mehr wirklich helfen kann. Leute, mit mehr ASM erfahrugn auf den neuen maschinen helfen dir aber sicher weiter.
Aufrufen kannste das dann aus VB so:
Code: | Private Type LARGE_INTEGER
LowPart As Long
HighPart As Long
End Type
Privatec Declare Sub rdtsc Lib "<NameDerDLL.dll" Alias "rdtsc_" (ByRef tsc As LARGE_INTEGER)
Public Function Get_MIPS_Count() As Currency
On Error Resume Next
Dim TD As LARGE_INTEGER
'Call rdtsc(TD)
'Get_MIPS_Count = int32x32_int64(TD.LowPart, TD.HighPart)
End Function
Public Function int32x32_int64(ByVal lLo As Long, ByVal lHi As Long) As Currency
On Error Resume Next
Dim dLo As Double
Dim dHi As Double
If lLo < 0 Then
dLo = (2 ^ 32) + lLo
Else: dLo = lLo
End If
If lHi < 0 Then
dHi = (2 ^ 32) + lHi
Else: dHi = lHi
End If
int32x32_int64 = (dLo + (dHi * (2 ^ 32)))
End Function
|
Alternativ kann ich dir auch die DLL (für win98se compiliert) geben.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 03.05.2008, 10:12 Titel: |
|
|
Meine Idee dazu:
Eine DLL...
Code: | declare function givetimer lib "timer" alias "givetimer" as double
declare function testtimer lib "timer" alias "testtimer" (byval mtime as double) as integer
dim shared as double thash
dim shared as integer rtrmode
thash = timer
if thash = 0 then end
function givetimer as double export
if thash = 0 then end
dim as double vtimer = timer
if vtimer < thash then
rtrmode + = 1
if rtrmode = 1 then sleep 500 : function = givetimer else end
end if
if vtimer = 1 then end
function = timer
end function
function testtimer (byval mtime as double) as integer export
if thash = 0 then end
if mtime > givetimer + 1 or mtime < givetimer - 1 or givetimer < thash then beep : function = -1 else function = 1
end function |
Und dann noch ein kleines Testprogramm dazu:
Code: | declare function givetimer lib "timer" alias "givetimer" as double
declare function testtimer lib "timer" alias "testtimer" (byval mtime as double) as integer
OPEN "TIMER.dll" FOR INPUT AS #1
IF LOF(1) < 7000 then print "FEHLER: DLL FAKED!" : SLEEP :END
close #1
DIM AS INTEGER PRGTIMER
do
PRGTIMER = GIVETIMER
'DER CHEAT:
'PRGTIMER = 1
IF TESTTIMER(PRGTIMER) = -1 THEN PRINT "CHEATER!":SLEEP:END
PRINT PRGTIMER
loop until inkey <> ""
|
_________________ Bis irgendwann... 
Zuletzt bearbeitet von AndT am 03.05.2008, 10:33, insgesamt 3-mal bearbeitet |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 03.05.2008, 10:17 Titel: |
|
|
AndT hat Folgendes geschrieben: | Meine Idee dazu:
Eine DLL...
Code: | ...
IF rtrmode = 1 THEN SLEEP 500 : FUNCTION = givetimer ELSE END
... |
|
Also .. den Sinn einer DLL hast du scheinbar noch nicht geanz verstande. In einer DLL verwendet man kein "END" das das Parent-Programm beendet. Das ist ein ganz schlechter Programmierstiel! Denn solltest du dir ganz schnell abgewöhnen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
AndT
Anmeldungsdatum: 02.04.2007 Beiträge: 481
|
Verfasst am: 03.05.2008, 11:14 Titel: |
|
|
Nicht ein "END" wird im Normalfall ausgelöst.. auch nicht beim Cheatversuch aber beim versuch die DLL zu hacken.
In meinem Beispiel reicht es eigendlich zwischendurch mal mit testtimer(programmtimer) zu prüfen ob -1 ausgegeben wird. wenn das der fall ist, ist die zeit dann unglütig. _________________ Bis irgendwann...  |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 03.05.2008, 12:18 Titel: |
|
|
Man führt GENERELL kein "END" in DLLs aus! ... DLL's sind Funktions-BIBLIOTEKEN! .. keine Programme! und eine Bibliotek wird nicht "Beendet" sondern "Entladen" .. udn das geschicht mit "DyLibUnload" und nicht mit "END" .. du führt zum beenden von Windows ja auch kein "ThreadExit(ThreadGet(GetDesktopHWND))" aus, sondern ein "ExitWindows"
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
stuner
Anmeldungsdatum: 29.06.2006 Beiträge: 45
|
Verfasst am: 03.05.2008, 14:26 Titel: |
|
|
Back to topic
Das Programm "Cheat Engine" schein nur den "Timer" Befehl zu manipulieren, nicht aber den "Time" Befehl. Um eine Manipulation zumindest mit diesem Programm zu erschweren kann man den "Time" Befehl benutzen (und man braucht dazu nicht einmal eine DLL ... )
Code: | Dim Shared As Double startzeit, startzeit2, akt_zeit, akt_zeit2
Declare Function getcheat As Integer
Declare Function gettime As Double
startzeit = timer
startzeit2 = gettime
Do
If getcheat Then 'Cheat entdeckt
Print "Haaaaaalt"
Sleep
end
EndIf
Sleep 10
Loop
Function getcheat As Integer
Dim As Double temp1, temp2
akt_zeit = Timer
akt_zeit2 = gettime
temp1 = Timer-startzeit 'Timer Zeit
temp2 = akt_zeit2 - startzeit2 'Time Zeit
If (temp1 - temp2) > 60*60*23 Then '24:00 Überschreitung kompensieren
Do Until (temp1 - temp2) < 60*60*23
temp1 -= 60*60*24
Loop
EndIf
if ABS(temp1-temp2) > 1 Then Return -1
Return 0
End Function
Function gettime As Double
Dim As String temp
temp = Time 'hh:mm:ss
Return Val(Left(temp,2))*60*60+Val(mid(temp,4,2))*60+Val(mid(temp,7,2))
End Function |
Edit: Michael712s Änderung übernommen.... _________________ MfG Stuner
Zuletzt bearbeitet von stuner am 05.05.2008, 21:34, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Fingerboarder
Anmeldungsdatum: 09.12.2006 Beiträge: 37
|
Verfasst am: 04.05.2008, 18:08 Titel: |
|
|
Also vielen Dank für die vielen Antworten. Damit werd ich es bestimmt schaffen zumindest die Cheat Engine oder auch andere Programme auszuschalten.
Mfg FBRider |
|
Nach oben |
|
 |
Michael712 aka anfänger, programmierer
Anmeldungsdatum: 26.03.2005 Beiträge: 1593
|
Verfasst am: 05.05.2008, 20:14 Titel: |
|
|
Wenn Time davon nicht beeinflusst wird, dann kann man das natürlich benutzen. Ist auf jeden Fall die einfachste Lösung (hab da gar nicht dran gedacht, da ich dachte, dass TIME intern auch Timer benutzt). Ansonsten hätte man auch noch am Anfang zählen können, wieviele durchläuft pro sekunde gemacht werden, und dann mit späteren zählungen verglichen. Das Cheat prog läuft IMHO ja nicht von anfang an.
Achja, mir ist da was unschönes aufgefallen
Code: | IF temp1 > temp2 + 1 OR temp1 < temp2 - 1 THEN RETURN -1 |
lässt sich so viel leichter lesen/verstehen:
Code: | IF ABS(temp1-temp2) > 1 THEN RETURN -1 |
_________________
Code: | #include "signatur.bi" |
|
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 05.05.2008, 20:39 Titel: |
|
|
Michael712 hat Folgendes geschrieben: | (hab da gar nicht dran gedacht, da ich dachte, dass TIME intern auch Timer benutzt). |
TIME holt sich ja die BIOS/Systemzeit. Ist eigentlich eher seltsam, die zu faken  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
|