|
You last visited: Today at 20:44
Advertisement
Autoit Array Verändern :S
Discussion on Autoit Array Verändern :S within the AutoIt forum part of the Coders Den category.
01/03/2012, 02:58
|
#1
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
Autoit Array Verändern :S
Hi leute.
Ich habe mir gerade die playerstructs von css besorgt, und wollte zum testen ein script machen, welches mir von allen möglichen 64 spielern im raum, alle werte liefert.
Nun habe ich ein Paar arrays gesetzt.
Code:
Global Const $NameOff[2] = [0x0, 0x38]
Global Const $HPOff[2] = [0x0, 0x5c]
Global Const $TeamOff[2] = [0x0, 0x58]
Global Const $XOff[2] = [0x0, 0x60]
Global Const $YOff[2] = [0x0, 0x64]
Global Const $ZOff[2] = [0x0, 0x68]
Global Const $PitchOff[2] = [0x0, 0x6C]
Global Const $YawOff[2] = [0x0, 0x70]
Global Const $RollOff[2] = [0x0, 0x74]
So.
Diese offsets gelten für den ersten spieler.
Für den zweiten spieler, muss jeder offset mit 140 addiert werden.
Nur wie mache ich das?
Ich brauche es in diesem abschnitt.
Code:
$Name = _MemoryPointerRead($Base,$OPEN,$NameOff,"Char[32]")
GUICtrlSetData($Input2,$Name[1])
Das ist für Spieler 1.
Aber wie lese ich es für spieler 2 aus?
$NameOff (der 2. array) muss mit 0x140 addiert werden, aber bei mir funktioniert es nicht.
Hier das momentane Script.
Code:
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <NomadMemory.au3>
$Base = 0x5EFB8098
Global Const $NameOff[2] = [0x0, 0x38]
Global Const $HPOff[2] = [0x0, 0x5c]
Global Const $TeamOff[2] = [0x0, 0x58]
Global Const $XOff[2] = [0x0, 0x60]
Global Const $YOff[2] = [0x0, 0x64]
Global Const $ZOff[2] = [0x0, 0x68]
Global Const $PitchOff[2] = [0x0, 0x6C]
Global Const $YawOff[2] = [0x0, 0x70]
Global Const $RollOff[2] = [0x0, 0x74]
#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Test", 859, 107, 192, 124)
$Label1 = GUICtrlCreateLabel("ID", 8, 8, 15, 17)
$Input1 = GUICtrlCreateInput("", 8, 32, 33, 21)
$Label2 = GUICtrlCreateLabel("PlayerName", 56, 8, 61, 17)
$Input2 = GUICtrlCreateInput("", 56, 32, 137, 21)
$Label3 = GUICtrlCreateLabel("Team", 200, 8, 31, 17)
$Input3 = GUICtrlCreateInput("", 200, 32, 49, 21)
$Label4 = GUICtrlCreateLabel("HP", 256, 8, 19, 17)
$Input4 = GUICtrlCreateInput("", 256, 32, 33, 21)
$Label5 = GUICtrlCreateLabel("X-Coord", 312, 8, 42, 17)
$Input5 = GUICtrlCreateInput("", 304, 32, 97, 21)
$Label6 = GUICtrlCreateLabel("Y-Coord", 408, 8, 42, 17)
$Input6 = GUICtrlCreateInput("", 408, 32, 97, 21)
$Label7 = GUICtrlCreateLabel("Z-Coord", 512, 8, 42, 17)
$Input7 = GUICtrlCreateInput("", 512, 32, 97, 21)
$Label8 = GUICtrlCreateLabel("Pitch", 616, 8, 28, 17)
$Input8 = GUICtrlCreateInput("", 616, 32, 97, 21)
$Label9 = GUICtrlCreateLabel("Yaw", 720, 8, 25, 17)
$Input9 = GUICtrlCreateInput("", 720, 32, 97, 21)
$Label10 = GUICtrlCreateLabel("Roll", 824, 8, 22, 17)
$Input10 = GUICtrlCreateInput("", 824, 32, 25, 21)
$Button1 = GUICtrlCreateButton("Get", 8, 72, 75, 25)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
ReadThem()
EndSwitch
WEnd
Func ReadThem()
$pid = ProcessExists("hl2.exe")
SetPrivilege("SeDebugPrivilege",1)
$OPEN = _MemoryOpen($pid)
;while 1
$Name = _MemoryPointerRead($Base,$OPEN,$NameOff,"Char[32]")
$HP = _MemoryPointerRead($Base,$OPEN,$HPOff)
$Team = _MemoryPointerRead($Base,$OPEN,$TeamOff)
$X = _MemoryPointerRead($Base,$OPEN,$XOff,"float")
$Y = _MemoryPointerRead($Base,$OPEN,$YOff,"float")
$Z = _MemoryPointerRead($Base,$OPEN,$ZOff,"float")
$Pitch = _MemoryPointerRead($Base,$OPEN,$PitchOff,"float")
$Yaw = _MemoryPointerRead($Base,$OPEN,$YawOff,"float")
$Roll = _MemoryPointerRead($Base,$OPEN,$RollOff)
GUICtrlSetData($Input1,"1")
GUICtrlSetData($Input2,$Name[1])
GUICtrlSetData($Input3,$Team[1])
GUICtrlSetData($Input4,$HP[1])
GUICtrlSetData($Input5,$X[1])
GUICtrlSetData($Input6,$Y[1])
GUICtrlSetData($Input7,$Z[1])
GUICtrlSetData($Input8,$Pitch[1])
GUICtrlSetData($Input9,$Yaw[1])
GUICtrlSetData($Input10,$Roll[1])
;wend
;MsgBox(0,"","die hp ist: " &$HP[1])
EndFunc
Ich dachte mir, dass man es in einer for schleife sogar viel kürzer machen könnte.
Also dass er die 64 playerinfos runterrattert.
Aber habe so wenig erfahrung mit arrays, habe keine ahnung wie ich den array verändere.
|
|
|
01/03/2012, 03:37
|
#2
|
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
|
base + 0x0, sehr sinnvoll ;o
lolkop hat übrigens etwas zu MemoryPointerRead geschrieben, solltest du dir mal durchlesen.
Und entscheid dich, 140 oder 0x140?
|
|
|
01/03/2012, 03:43
|
#3
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
Quote:
Originally Posted by MoepMeep
base + 0x0, sehr sinnvoll ;o
lolkop hat übrigens etwas zu MemoryPointerRead geschrieben, solltest du dir mal durchlesen.
Und entscheid dich, 140 oder 0x140?
|
1. Bei Pointerread muss doch der erste array immer 0x0 sein 0.0 oder irre ich mich?
2. Werde ich mir mal anschauen wenn ich es finde.
3. 0x140 ^^
|
|
|
01/03/2012, 05:15
|
#4
|
elite*gold: 42
Join Date: Jun 2008
Posts: 5,425
Received Thanks: 1,888
|
Quote:
Originally Posted by freehuntx
1. Bei Pointerread muss doch der erste array immer 0x0 sein 0.0 oder irre ich mich?
|
Ich nutze gescheite Sprachen mit gescheiten Funktionen.
Quote:
|
2. Werde ich mir mal anschauen wenn ich es finde.
|
Quote:
Na, dann rechne es drauf ;o
|
|
|
01/03/2012, 05:18
|
#5
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
Quote:
Originally Posted by MoepMeep
Ich nutze gescheite Sprachen mit gescheiten Funktionen.
Na, dann rechne es drauf ;o
|
Mit seinem kommentar weiß ich nichts anzufangen.
Es geht mir nur darum, dass ich nicht weiß, wie ich die MemoryPointer func aufrufe, mit verändertem array.
Ich weiß halt nicht, wie ich dem array 0x140 addieren kann.
Edit: Ich könnte das ganze auch in c++ machen, aber:
C++ und VAC :S Ich trau mich nicht meinen account zu riskieren. Autoit ist mir sicherer.
|
|
|
01/03/2012, 06:42
|
#6
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
ob du nun c++ oder autoit nutzt macht doch überhaupt keinen unterschied, da letztendlich beide auf die winapis zugreifen.
in dem verlinkten post ging es darum, das die pointer funktion, welche hier aus einem mit unbekannten grund alle so gerne zugreifen, jedes mal folgendes tut:
Code:
$pointer = GetDWORD($pointer+$offsetArray[$i])
und das für alle elemente des offset arrays.
dh es in deinem beispiel wird folgendes gemacht:
Code:
$pointer = GetDWORD(0x5EFB8098+0)
$Name = GetString($pointer + 0x38)
$pointer = GetDWORD(0x5EFB8098+0)
$HP = GetDWORD($pointer + 0x5C)
$pointer = GetDWORD(0x5EFB8098+0)
$Team = GetDWORD($pointer + 0x58)
$pointer = GetDWORD(0x5EFB8098+0)
$X = GetFloat($pointer + 0x60)
$pointer = GetDWORD(0x5EFB8098+0)
$Y = GetFloat($pointer + 0x64)
$pointer = GetDWORD(0x5EFB8098+0)
$Z = GetFloat($pointer + 0x68)
$pointer = GetDWORD(0x5EFB8098+0)
$Pitch = GetFloat($pointer + 0x6C)
$pointer = GetDWORD(0x5EFB8098+0)
$Yaw = GetFloat($pointer + 0x70)
$pointer = GetDWORD(0x5EFB8098+0)
$Roll = GetDWORD($pointer + 0x74)
die wird sicher auffallen, das es keinen sinn macht $pointer jedes mal erneut auszulesen...
aber genau das macht diese funktion.
da es sich in deinem beispiel anscheinend abgesehen vom name um eine reine 4byte struct handelt, kannst du den pointer einmalig auslesen, dann den name einzeln, und den rest in einer einfachen for schleife.
was genau du mit diesen 0x140 addieren meinst habe ich nicht wirklich verstehen können. ich denke du meinst das hier der basepointer 0x140 weiter hinten liegt.
in diesem falle addierst du einfach die 0x140 auf den pointer. auch dies lässt sich wieder in einer schleife erlediggen.
letzendlich würde dein code so aus 2 schleifen und somit ca. 7 zeilen bestehen.
|
|
|
01/03/2012, 09:13
|
#7
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
Nein ich meine folgendes.
Diese Base Addresse, zeigt auf die werte, des ersten spielers im raum.
Und exakt 140 bytes liegen die werte des zweiten spielers.
Wieder 140 bytes weiter liegen die werte des dritten spielers.
Und immer so weiter, bis zum 64. spieler.
|
|
|
01/03/2012, 10:03
|
#8
|
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
|
$Offset[1] += 0x140
;Auslesen
$Offset[1] += 0x140
;Auslesen
....
Meinst du sowas?
|
|
|
01/03/2012, 12:47
|
#9
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
na dann brauchst du das doch nur etwa so aufbauen:
Code:
dim $name[64], $data[64][8], $type[8]=['dword','dword','float','float','float','float','float','dword']
$base = read($baseAdress)
for $player=0 to 63
$base+=$player*0x140
$name[$player] = read($base+0x38, 'string')
for $i=0 to 7
$data[$player][$i]=read($base+0x58+$i*4, $type[$i])
next
next
das data-array sieht dann so aus:
Code:
$data[player][0] <-- Team
$data[player][1] <-- HP
$data[player][2] <-- X
$data[player][3] <-- Y
$data[player][4] <-- Z
$data[player][5] <-- Pitch
$data[player][6] <-- Yaw
$data[player][7] <-- Roll
|
|
|
01/03/2012, 21:15
|
#10
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
Hey danke
Jetzt kann ich nen triggerbot, nen Radar, und esp machen ^^
(esp in c++ ^^)
Ich weiß nicht was alle haben :P
triggerbots in autoit sind möglich, und der speed ist meiner meinung nach auch passabel.
Kann closed werden
|
|
|
01/03/2012, 21:30
|
#11
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
wichtig wäre mir, das du den hintergrund jetzt verstehst, und warum man niemals die pointerfunktion aus der udf nutzen sollte, welche hier wohl irgendwo in umlauf gebracht wurde.
ein pointer ist schließlig nichts anderes als ein zeiger, und sollte immer einzeln bestimmt werden, da er in der regel mehr als nur einmal benötigt wird.
vorallem wenn die struct auf welche man zugreifen möchte über mehrere pointer erreicht werden muss, so steigt die anzahl nutzloser funktionsaufrufe pro pointerebene mit der udf exponentiell...
|
|
|
01/04/2012, 20:34
|
#12
|
elite*gold: 0
Join Date: Dec 2009
Posts: 1,622
Received Thanks: 2,070
|
Quote:
Originally Posted by lolkop
wichtig wäre mir, das du den hintergrund jetzt verstehst, und warum man niemals die pointerfunktion aus der udf nutzen sollte, welche hier wohl irgendwo in umlauf gebracht wurde.
ein pointer ist schließlig nichts anderes als ein zeiger, und sollte immer einzeln bestimmt werden, da er in der regel mehr als nur einmal benötigt wird.
vorallem wenn die struct auf welche man zugreifen möchte über mehrere pointer erreicht werden muss, so steigt die anzahl nutzloser funktionsaufrufe pro pointerebene mit der udf exponentiell...
|
Ich habe mir jetzt eine eigene Pointer funktion geschrieben ^^
Ist im prinzip nichts anderes als von der base die addy + 1offset, davon die addresse der wert +2offfet usw.
Dieses prinzip war mir vorher nicht bewusst.
|
|
|
Similar Threads
|
AutoIt Geschwindigkeit verändern - Programmierhilfe gesucht !!!
05/13/2011 - Last Chaos - 35 Replies
hi leute,
ich habe einige Schwierigkeiten mit dem verändern der Value der Geschwindigkeit !
Es gibt einige ansätze wie z.B.
#include <NomadMemory.au3>
$PID = ProcessExists("Nksp.exe")
$Handle = _MemoryOpen($PID)
$Base = 0x106445A8
While 1
|
Autoit and array of bytes
12/22/2010 - AutoIt - 1 Replies
Does anyone here know if NomadMemory.au3 can search for array of bytes or write an array of bytes to memory? Just asking because it would be useful for some trainers im thinking of making in Autoit.
|
All times are GMT +1. The time now is 20:44.
|
|