AutoIt - Pointer auslesen prob.

08/05/2012 13:54 LikEaScripT#1
Hallo Leute ! :D


Also komm ich mal gleich zum Punkt o.O

Ich hab versucht wie schon oben steht einen Pointer mit AutoIt auszulesen
klappte ja auch alles super... nur das die Vaule immer als 0 angezeigt wird und ich einfach nicht drauf komme was ich falsch gemacht habe :(

Also hier der Code für den Pointer :
Quote:
#RequireAdmin
#include <Pointer.au3>

While 1
$PID = ProcessExists("ZumHacken.exe")
$MemOpen = _MemoryOpen($PID)

Global $Offset[3]
$Offset[0] = 0
$Offset[1] = Dec ("0")
$Offset[2] = Dec("18")
$StaticOffset = Dec("000A86BC")

$BaseAddr = _MemoryGetBaseAddress($MemOpen, 1)
$Addr = "0x" & Hex($BaseAddr + $StaticOffset)

$Value = _MemoryPointerRead($Addr, $MemOpen, $Offset)

Tooltip ($Value[1])
WEnd
Schöne grüße
Philipp
08/05/2012 16:07 KDeluxe#2
Du verwendest das Handle ohne vorher zu prüfen, ob es überhaupt gültig ist. Das führt schnell mal zum Programmabsturz.
Die ganzen Konvertierungen zwischen Strings und Zahlen sind zum einen umständlich und verbrauchen zum anderen nur unnötig Rechenleistung.


Zum eigentlichen Problem:
ReadProcessMemory gibt einen Wert von 0 zurück, wenn die Funktion fehlschlägt (wird nicht von DllCall erkannt). Ein Grund dafür wären fehlende Leseberechtigung. Kann man eigentlich ausschließen.
Da dein aktuelles Script ja scheinbar funktioniert, sofern der Prozess schon gestartet wurde, sollte das Problem auch bei keinem Anti Hacking Tool liegen. Andernfalls würde das Script spätestens bei der Ausgabe des gelesen Werts abstürzen, da du auf ein Array zugreifen möchtest, das überhaupt kein Array ist.
Evtl. ist der Pointer einfach nicht der richtige.
08/06/2012 22:43 LikEaScripT#3
Hallo KDeluxe !
Ich hab dein Script ausprobiert - es startet aber es erscheint nicht mal ein ToolTip.
Der Pointer stimmt, beim Scannen meines Testprogrammes (Pointer - Level 1) ist das Offset immer 18.
08/07/2012 00:16 KDeluxe#4
Dann sollte eine 0 zu viel sein.

Wenn ich das jetzt richtig verstehe sollte es so sein:
Code:
Dim $dwOffset[2] = [0, 0x18]
Je nachdem was du unter "Level 1" verstehst. CE beginnt bei 0, Level 1 wäre also eigentlich das 2. Offset.

Wenn das Tooltip nie angezeigt wird, wird _MemoryPointerRead() nie ausgeführt, zur Fehlerfindung hättest du nur ein paar Tooltips (oder anderes) hinzufügen müssen.

08/07/2012 13:42 LikEaScripT#5
Jop...
Diesmal gehts, doch die Adresse ist immer noch 0 >.<


Bild : [Only registered and activated users can see links. Click Here To Register...]
08/07/2012 17:57 KDeluxe#6
Dann solltest du dem Script eigentlich entnehmen können, dass das Problem bei der Funktion _MemoryGetBaseAddress() liegt. Probier es doch einfach mal mit _MemoryGetModuleAddress() (oder so ähnlich) aus.
08/07/2012 23:48 LikEaScripT#7
Hallo KDeluxe...
Es will einfach nicht klappen, ich habe schon fast alles ausprobiert
das mit dem Pointen haut bei mir einfach nicht hin >.<
Entweder mag mich mein PC nicht oder ich bin einfach zu dumm ._.

Liegt es vllt. an meinem Betriebssystem ? (Windows 7 64 Bit)
08/08/2012 00:54 KDeluxe#8
Mach einfach mal einen Screenshot vom Pointeraufbau von CE.
08/08/2012 13:09 LikEaScripT#9
Hey KDeluxe...
Hier hast du den Screen :
[Only registered and activated users can see links. Click Here To Register...]
08/08/2012 13:54 mdna#10
Also nach erfolgreicher Fehlersuche per Skype konnte ich das Problem mit folgendem Script isolieren:
Code:
#RequireAdmin
#include <Pointer.au3>

$szProcessName = "TestProgramm.exe"
Dim $dwOffset[2] = [0, 0x18]
Dim $dwBaseAddress = 0, $dwStaticOffset = 0xA86BC

While Sleep(10)
	$dwProcessId = ProcessExists($szProcessName)
	$aHandle = _MemoryOpen($dwProcessId)
	If Not @error Then
		If Not $dwBaseAddress Then
			$dwAddress = _MemoryGetBaseAddress($aHandle, 1)
			If $dwAddress Then
				$dwBaseAddress = $dwAddress + $dwStaticOffset
			Else
				FileWrite("Adressen.txt", $dwProcessId & @CRLF & $aHandle & @CRLF)
			EndIf
		Else
			$dwValue = _MemoryPointerRead($dwBaseAddress, $aHandle, $dwOffset)
			If @error Then
				FileWrite("error.txt", "Error: " & @error &@CRLF)
			Else
				ToolTip("Value: " & $dwValue[1] &@CRLF)
			EndIf
		EndIf

		_MemoryClose($aHandle)
	Else
		Exit
	EndIf
 WEnd
Bei mir funktioniert das Script so wunderbar, bei Likeascript wird die Zeile 10 ($aHandle = _MemoryOpen($dwProcessId)) übersprungen --> warum weiss ich auch nicht so genau :o

Aber da liegt wohl das Problem.

(OS: Win7 64-bit Home Premium keine UAC)

Edit: Was mir grad noch einfällt - wenn ich ihm ne compiled version von exakt dem gleichen Script schicke gehts - wäre zwar unlogisch aber könnte das PRoblem an AutoIt selbst liegen? o.O
08/08/2012 15:26 lolkop#11
Quote:
Originally Posted by mdna View Post
Bei mir funktioniert das Script so wunderbar, bei Likeascript wird die Zeile 10 ($aHandle = _MemoryOpen($dwProcessId)) übersprungen --> warum weiss ich auch nicht so genau :o
zunächst einmal werden zeilen nicht übersprungen... es ist durchaus möglich das der funktionsaufruf der winapi in der udf fehlerhaft abläuft.

vergleiche die typisierung im aufruf nochmal mit der in msdn vorgegebenen von OpenProcess. ich nehme mal an das der fehler dort zu finden ist.
08/08/2012 17:23 LikEaScripT#12
Quote:
Originally Posted by lolkop View Post
zunächst einmal werden zeilen nicht übersprungen... es ist durchaus möglich das der funktionsaufruf der winapi in der udf fehlerhaft abläuft.

vergleiche die typisierung im aufruf nochmal mit der in msdn vorgegebenen von OpenProcess. ich nehme mal an das der fehler dort zu finden ist.
Mdna hat das gleiche Programm und Script.
Beim ihm funzt es... bei mir nicht
PS: Ich habe ihm das Script und das Test-programm per Skype
geschickt...

Hab AutoIt und Scite schonmal neu Installiert..
Geht trozdem noch nicht >.<
08/08/2012 23:12 lolkop#13
Quote:
Originally Posted by LikEaScripT View Post
Mdna hat das gleiche Programm und Script.
Beim ihm funzt es... bei mir nicht
PS: Ich habe ihm das Script und das Test-programm per Skype
geschickt...

Hab AutoIt und Scite schonmal neu Installiert..
Geht trozdem noch nicht >.<
und in wiefern hat das etwas mit dem zu tun was ich sagte? :o
08/08/2012 23:22 mdna#14
Nun ganz einfach --> bei mir funktioniert das Script mit exakt der GLEICHEN Pointer.au3 (Wo ja die API-Aufrufe gemacht werden) wunderbar aber bei likeascript nicht --> das ist das was er dir mitgeteilt hat :)
08/08/2012 23:49 lolkop#15
Quote:
Originally Posted by mdna View Post
Nun ganz einfach --> bei mir funktioniert das Script mit exakt der GLEICHEN Pointer.au3 (Wo ja die API-Aufrufe gemacht werden) wunderbar aber bei likeascript nicht --> das ist das was er dir mitgeteilt hat :)
das sagt nichts über das system aus... ein dll aufruf kann auf unterschiedlichen system selbstverständlich zu unterschiedlichen reaktionen führen...

mögliche fehlerquellen:
  • die dll existiert auf einem system überhaupt nicht
  • die dll befindet sich an einer anderen stelle
  • die dll wurde geupdated / verfügt über unterschiedliche parameter
  • man befindet sich auf x86 / x64 systemen -> integer, handles etc. sind nichtmehr 4 sondern 8byte lang, was bei der typisierung beachtet werden muss
  • viele mehr...

die häufigste fehlerquelle wird wohl die bereits angesprochene x64/x86 typisierungs-fehlerquelle sein...