|
You last visited: Today at 19:41
Advertisement
"Virtuelle Klasse" - Hack - Wie verwenden?
Discussion on "Virtuelle Klasse" - Hack - Wie verwenden? within the C/C++ forum part of the Coders Den category.
03/04/2012, 22:53
|
#1
|
elite*gold: 14
Join Date: May 2011
Posts: 2,671
Received Thanks: 818
|
"Virtuelle Klasse" - Hack - Wie verwenden?
Hallo, mich beschäftigt diese Frage schon seit längerem.
Ich habe eine Klasse die anscheinend der original Klasse nachgebaut wurde, und möchte diese nun in meinem GTA IV Hack verwenden.
Die Informationen über die Klasse (CWeaponInfo) habe ich von hier:
Code:
[LEFT]class CWeaponInfo // size: 0x110 (1.0.7.0) { // weapontype (index of array element) int weapontype; // 0x0 | 0 // slottype (index of array element) int slot; // 0x4 | 4 // firetype (index of array element) int firetype; // 0x8 | 8 // damagetype (index of array element) int damagetype; // 0xC | 12 // group (index of array element) int group; // 0x10 | 16 float targetrange; // 0x14 | 20 float weaponrange; // 0x18 | 24 int stattype; // 0x1C | 28 // Weaponflags stored as bitflags. Refer to corresponding array. (if n-th bit is 1, array element n is true) DWORD weaponflags; // 0x20 | 32 DWORD modelhash; // 0x24 | 36 float aimaccuracy; // 0x34 | 52 float aimaccuracyfps; // 0x38 | 52 float offset_x; // 0x40 | 64 float offset_y; // 0x44 | 68 float offset_z; // 0x48 | 72 float crouchoffset_x; // 0x50 | 80 float crouchoffset_y; // 0x54 | 84 float crouchoffset_z; // 0x58 | 88 float reticule_standing; // 0x64 | 100 float reticule_ducked; // 0x68 | 104 float reticule_scale; // 0x6C | 108 int rumbleduration; // 0x70 | 112 float rumbleintensity; // 0x74 | 116 int pickup_regentime; // 0x78 | 120 short pickup_ammoonstreet; // 0x80 | 124 // damage: short damage; // 0x82 | 130 short damagefps; // 0x84 | 132 short clipsize // 0x86 | 132 short ammomax; // 0x88 | 136 int timebetweenshots; // 0x8C | 140 float physicsforce; // 0x90 | 144 int reloadtime_normal; // 0x94 | 150 int reloadtime_fast; // 0x98 | 154 int reloadtime_crouch; // 0x9C | 160 int projectiletype; // 0xA0 int projectilefusetime; // 0xA4 float projectilephysicsexplodeimpactthreshold // 0xD0 float projectilephysicsexplodeimpactwithvehiclethreshold // 0xD4 float projectilephysicsvehiclevelocity // 0xD8 // damage, continued: float networkplayermod; // 0xF0 | 240 float networkpedmod; // 0xF4 | 244 float aimingaccuracytime; // 0xF8 int aimingpellets; // 0xFC };
[/LEFT]
Es steht auch da:
Quote:
|
Array of CWeaponInfo's can be found at GTAIV.exe+0x1540A20 (1.0.7.0).
|
Somit muss ich der Klasse irgendwie die Adresse 0x1540A20 "zuweisen".
Wenn ich das richtig verstehe, kann man dann auf jeden Member, den man definiert hat, ohne deren Adresse zu wissen, zugreifen? (Nur durch die Addy der Klasse)?
Hat jemand ein Beispiel, wie soetwas funktioniert?
Lg, Head.
|
|
|
03/05/2012, 02:03
|
#2
|
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
|
Code:
DWORD base = GetModuleHandle("GTAIV.exe");
CWeaponInfo* weapons = base + 0x1540A20;
int length = sizeof(weapons) / sizeof(weapons[0]);
for(int i = 0; i < length; i++) {
(weapons+i)->damage = 9000;
}
Edit: So auf eine Addresse im Spielprozess zu zeigen funktioniert natürlich auch nur wenn du es vom Prozess aus machst.
|
|
|
03/05/2012, 12:42
|
#3
|
elite*gold: 9
Join Date: Dec 2005
Posts: 621
Received Thanks: 365
|
Quote:
Originally Posted by SmackJew
Edit: So auf eine Addresse im Spielprozess zu zeigen funktioniert natürlich auch nur wenn du es vom Prozess aus machst.
|
Warum versuchst du anderen zu helfen wenn man an deinem code voller fehler sieht, dass du kaum coden kannst?
|
|
|
03/05/2012, 13:10
|
#4
|
elite*gold: 0
Join Date: Oct 2008
Posts: 1,637
Received Thanks: 1,119
|
der einzige fehler den ich grad sehe is:
Code:
CWeaponInfo* weapons = base + 0x1540A20;
in dem fall wäre das besser:
Code:
CWeaponInfo* weapons = (CWeaponInfo*)base + 0x1540A20;
|
|
|
03/05/2012, 13:48
|
#5
|
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
|
Quote:
Originally Posted by sd333221
Warum versuchst du anderen zu helfen wenn man an deinem code voller fehler sieht, dass du kaum coden kannst? 
|
Hab ich ja Glück, dass es dann doch noch zum Anwendungsentwickler gereicht hat.
Quote:
Originally Posted by HeavyHacker
der einzige fehler den ich grad sehe is:
Code:
CWeaponInfo* weapons = base + 0x1540A20;
in dem fall wäre das besser:
Code:
CWeaponInfo* weapons = (CWeaponInfo*)base + 0x1540A20;
|
Code:
(CWeaponInfo*)(base + 0x1540A20);
Mal davon abgesehen wird die Längenberechnung so auch nicht funktionieren, bevor du dem Compiler nicht mitteilst, dass weapons als Array behandelt wird. Sollte auch eher als Anregung gelten.
|
|
|
03/05/2012, 14:02
|
#6
|
elite*gold: 9
Join Date: Dec 2005
Posts: 621
Received Thanks: 365
|
Quote:
Originally Posted by SmackJew
Hab ich ja Glück, dass es dann doch noch zum Anwendungsentwickler gereicht hat.
|
Wahrscheinlich der Grund warum es so viele Programme gibt die nicht funktionieren
Code:
DWORD base = GetModuleHandle("GTAIV.exe"); <- Casting von HModule zu dword fehlt
CWeaponInfo* weapons = base + 0x1540A20; <- Casting fehlt
int length = sizeof(weapons) / sizeof(weapons[0]); <- kompletter Unsinn
for(int i = 0; i < length; i++) {
(weapons+i)->damage = 9000;
}
sizeof(weapons) wird 4 sein, da weapons nur ein pointer ist, weapons[0] ist die größe der Struktur, daher ist die variable length bei dir immer mit "0" belegt, die Schleife wird also nie ausgeführt.
|
|
|
03/05/2012, 15:02
|
#7
|
elite*gold: 14
Join Date: May 2011
Posts: 2,671
Received Thanks: 818
|
Danke für eure Hilfe, ich werds jetzt gleich mal versuchen
|
|
|
03/05/2012, 16:00
|
#8
|
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
|
Quote:
Originally Posted by sd333221
Wahrscheinlich der Grund warum es so viele Programme gibt die nicht funktionieren
Code:
DWORD base = GetModuleHandle("GTAIV.exe"); <- Casting von HModule zu dword fehlt
CWeaponInfo* weapons = base + 0x1540A20; <- Casting fehlt
int length = sizeof(weapons) / sizeof(weapons[0]); <- kompletter Unsinn
for(int i = 0; i < length; i++) {
(weapons+i)->damage = 9000;
}
sizeof(weapons) wird 4 sein, da weapons nur ein pointer ist, weapons[0] ist die größe der Struktur, daher ist die variable length bei dir immer mit "0" belegt, die Schleife wird also nie ausgeführt.
|
Schonmal daran gedacht, dass SmackJew das einfach verdammt lustig findet?
|
|
|
03/05/2012, 17:22
|
#9
|
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
|
Quote:
Originally Posted by sd333221
Wahrscheinlich der Grund warum es so viele Programme gibt die nicht funktionieren 
|
Ich hab nun seit über einem Jahr sogut wie gar nicht aktiv mit C gearbeitet, über ein Jahr ausschließlich Java. Ich hab meine Programmiererseele für eine 20 Stunden Woche im Schlafanzug verkauft.
Quote:
Originally Posted by sd333221
Code:
DWORD base = GetModuleHandle("GTAIV.exe"); <- Casting von HModule zu dword fehlt
CWeaponInfo* weapons = base + 0x1540A20; <- Casting fehlt
int length = sizeof(weapons) / sizeof(weapons[0]); <- kompletter Unsinn
for(int i = 0; i < length; i++) {
(weapons+i)->damage = 9000;
}
sizeof(weapons) wird 4 sein, da weapons nur ein pointer ist, weapons[0] ist die größe der Struktur, daher ist die variable length bei dir immer mit "0" belegt, die Schleife wird also nie ausgeführt.
|
Mir ist wie geschrieben schon klar was da nicht funktioniert, aber ich erwarte vom OP schon, dass er es hinkriegt nen HMODULE nach DWORD und ne Summe aus zwei DWORDS in ein CWeaponInfo* zu casten. Das mit der Array Länge ist zugegeben ein Lapsus meinerseits (Hello Java, array.length), nur hat die ohnehin nur etwas mit der Schleife zu tun, der Zugriff, und wie die Zuweisung aussieht, das geht aus dem Code wunderbar hervor.
|
|
|
03/05/2012, 17:43
|
#10
|
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,909
Received Thanks: 25,409
|
Quote:
Originally Posted by SmackJew
Hab ich ja Glück, dass es dann doch noch zum Anwendungsentwickler gereicht hat.
Code:
(CWeaponInfo*)(base + 0x1540A20);
Mal davon abgesehen wird die Längenberechnung so auch nicht funktionieren, bevor du dem Compiler nicht mitteilst, dass weapons als Array behandelt wird. Sollte auch eher als Anregung gelten.
|
Wird nur leider nicht gehen, einem Array kannst du keine Adresse zuweisen :<
Der Compiler wüsste ja auch gar nicht, wie viele Elemente es haben soll.
Du musst wohl oder übel wissen, wie viele Elemente das Array hat.
|
|
|
03/06/2012, 21:20
|
#11
|
elite*gold: 14
Join Date: May 2011
Posts: 2,671
Received Thanks: 818
|
Quote:
Originally Posted by MrSm!th
Wird nur leider nicht gehen, einem Array kannst du keine Adresse zuweisen :<
Der Compiler wüsste ja auch gar nicht, wie viele Elemente es haben soll.
Du musst wohl oder übel wissen, wie viele Elemente das Array hat.
|
Ja ich habe die Größe des Arrays.
Die ist 0x110.
Wie sieht es denn nun aus, wenn ich die Größe habe?
|
|
|
03/06/2012, 23:52
|
#12
|
elite*gold: 0
Join Date: Jul 2010
Posts: 388
Received Thanks: 196
|
Quote:
Originally Posted by Headpuster
Ja ich habe die Größe des Arrays.
Die ist 0x110.
Wie sieht es denn nun aus, wenn ich die Größe habe?
|
Das ist die Summe der Größen der Datentypen der CWeaponInfo Member, nicht die Länge des Arrays.
Quote:
|
CWeaponInfo g_weaponInfos[60];
|
->
Code:
DWORD base = (DWORD)GetModuleHandle("GTAIV.exe");
CWeaponInfo* weapons = (CWeaponInfo*)(base + 0x1540A20);
for(int i = 0; i < 60; i++) {
(weapons+i)->damage = 9000;
}
Bezweifle allerdings anhand deiner Frage nach einer Seite voller Rumgequatsche leicht, dass dies deine letzte Frage im Thread ist.
|
|
|
All times are GMT +1. The time now is 19:42.
|
|