Autoit Array Verändern :S

01/03/2012 02:58 freehuntx#1
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 MoepMeep#2
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 freehuntx#3
Quote:
Originally Posted by MoepMeep View Post
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 MoepMeep#4
Quote:
Originally Posted by freehuntx View Post
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.
[Only registered and activated users can see links. Click Here To Register...]

Quote:
3. 0x140 ^^
Na, dann rechne es drauf ;o
01/03/2012 05:18 freehuntx#5
Quote:
Originally Posted by MoepMeep View Post
Ich nutze gescheite Sprachen mit gescheiten Funktionen.


[Only registered and activated users can see links. Click Here To Register...]



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 lolkop#6
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:
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 freehuntx#7
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 jacky919#8
$Offset[1] += 0x140
;Auslesen
$Offset[1] += 0x140
;Auslesen
....

Meinst du sowas?
01/03/2012 12:47 lolkop#9
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 freehuntx#10
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 lolkop#11
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 freehuntx#12
Quote:
Originally Posted by lolkop View Post
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.