Array of Byte oder Pattern suche

11/18/2013 17:53 Paraly#1
Heyho hat jemand ne Ahnung ob man mit Autoit nach bestimmten Pattern suchen kann, ich meine das gleiche wie bei Cheat Engine Array of Byte such methode
11/18/2013 20:21 lolkop#2
Quote:
Originally Posted by zocker5656 View Post
Heyho hat jemand ne Ahnung ob man mit Autoit nach bestimmten Pattern suchen kann, ich meine das gleiche wie bei Cheat Engine Array of Byte such methode
am besten das ganze module bzw file einlesen und per StringRegexp dann nach dem muster suchen...
11/19/2013 01:35 Paraly#3
ok darauf kam ich auch schon vorher nur ich dachte es gäbe evtl eine bequeme art wie ne fertige UDF aber ok :D

bisher ist mein code
Code:
#requireadmin
#include <Pointer.au3>
#include <Array.au3>

global $Memory_Map
global $Memory_Cache
$PID = ProcessExists("Aion.bin")
$MemOpen = _MemoryOpen($PID)



_Get_Memory_Map()
Func _Get_Memory_Map()
$i = 0
$GameBaseAddr = _MemoryModuleGetBaseAddress($PID, "Game.dll")
$CrySystemBaseAddr = _MemoryModuleGetBaseAddress($PID, "CrySystem.dll")
$CrySystemBaseAddr += 0x10000000
Do
$Memory_Cache = _MemoryRead($CrySystemBaseAddr, $MemOpen, "BYTE")
$CrySystemBaseAddr += 0x00000001
$i += 1
$Memory_Cache_Hex = hex($Memory_Cache,2)
$Memory_Map &= $Memory_Cache_Hex
$Memory_Cache = ""
Until $i = 429496729
EndFunc
$file = FileOpen("memorymap.map",10)
FileWrite($file,$Memory_Map)
FileClose($file)
$Memory_Entities = StringRegExp($Memory_Map, "886E02460000000000......000000000000....00000000000000000000803F010000002600000000000000......0AA186010001000000......4000CD..0064CD(.*?)00000000000000000000000000000000000", 3)
_ArrayDisplay($Memory_Entities)
nur naja das ist viel zu langsam gibts da eine schnellere Möglichkeit und sind meine StringRegExp Parameter richtig um
"88 6E 00 46 00 00 00 00 00 1C 6E 2B 00 00 00 00 98 15 39 43 00 00 00 00 00 00 00 00 00 00 80 3F 01 00 00 00 26 00 00 00 00 00 00 00 0A 47 1E 0A A1 86 01 00 01 00 00 00 70 3D EA 40 00 1C 38 00 64 7E"
[mit den .. meine ich zeichen die sich auch anders sein können und was hier nach kommt soll dann gefunden werden bis 00 00 kommt]
hoffe das hat man verstanden was ich hier will :D

wichtiger ist auchjedenfall mal den memoryscan schneller zu machen

ist es eventuell möglich einfach die .dll von cheatengine zu benutzen die er zum suchen benutzt?
cheat engine brauch für den suchvorgang nur 2-5 sekunden :(
11/19/2013 03:30 lolkop#4
Quote:
Originally Posted by zocker5656 View Post
ok darauf kam ich auch schon vorher nur ich dachte es gäbe evtl eine bequeme art wie ne fertige UDF aber ok :D

bisher ist mein code
Code:
#requireadmin
#include <Pointer.au3>
#include <Array.au3>

global $Memory_Map
global $Memory_Cache
$PID = ProcessExists("Aion.bin")
$MemOpen = _MemoryOpen($PID)



_Get_Memory_Map()
Func _Get_Memory_Map()
$i = 0
$GameBaseAddr = _MemoryModuleGetBaseAddress($PID, "Game.dll")
$CrySystemBaseAddr = _MemoryModuleGetBaseAddress($PID, "CrySystem.dll")
$CrySystemBaseAddr += 0x10000000
Do
$Memory_Cache = _MemoryRead($CrySystemBaseAddr, $MemOpen, "BYTE")
$CrySystemBaseAddr += 0x00000001
$i += 1
$Memory_Cache_Hex = hex($Memory_Cache,2)
$Memory_Map &= $Memory_Cache_Hex
$Memory_Cache = ""
Until $i = 429496729
EndFunc
$file = FileOpen("memorymap.map",10)
FileWrite($file,$Memory_Map)
FileClose($file)
$Memory_Entities = StringRegExp($Memory_Map, "886E02460000000000......000000000000....00000000000000000000803F010000002600000000000000......0AA186010001000000......4000CD..0064CD(.*?)00000000000000000000000000000000000", 3)
_ArrayDisplay($Memory_Entities)
nur naja das ist viel zu langsam gibts da eine schnellere Möglichkeit und sind meine StringRegExp Parameter richtig um
"88 6E 00 46 00 00 00 00 00 1C 6E 2B 00 00 00 00 98 15 39 43 00 00 00 00 00 00 00 00 00 00 80 3F 01 00 00 00 26 00 00 00 00 00 00 00 0A 47 1E 0A A1 86 01 00 01 00 00 00 70 3D EA 40 00 1C 38 00 64 7E"
[mit den .. meine ich zeichen die sich auch anders sein können und was hier nach kommt soll dann gefunden werden bis 00 00 kommt]
hoffe das hat man verstanden was ich hier will :D

wichtiger ist auchjedenfall mal den memoryscan schneller zu machen

ist es eventuell möglich einfach die .dll von cheatengine zu benutzen die er zum suchen benutzt?
cheat engine brauch für den suchvorgang nur 2-5 sekunden :(
zunächst einmal sagte ich du sollst entweder das ganze modul oder die ganze datei einlesen und dann suchen...

was du da machst ist beinahe 430millionen mal eine dll aufzurufen (da du clerverer weise nicht einmal ein handle dazu speicherst, wird die dll auch tatsächlich 430millionen mal von deiner festplatte eingelesen)... vorher liest du sinnlose, nie wieder verwendete moduladressen ein und führst nicht nachvollziehbare rechenoperationen durch...

abgesehen davon ist dein regex befehl schlecht formatiert und neben bei bemerkt absolut sinnlos... eine patternsuche basiert darauf, das man möglichst exakte muster mit vorhandenem vergleicht...
regex pattern wie ".*?" sind absolut unnwillkürlich und matchen beliebige muster...
11/19/2013 10:46 Shadow992#5
Quote:
Originally Posted by zocker5656 View Post
ok darauf kam ich auch schon vorher nur ich dachte es gäbe evtl eine bequeme art wie ne fertige UDF aber ok :D

bisher ist mein code
Code:
#requireadmin
#include <Pointer.au3>
#include <Array.au3>

global $Memory_Map
global $Memory_Cache
$PID = ProcessExists("Aion.bin")
$MemOpen = _MemoryOpen($PID)



_Get_Memory_Map()
Func _Get_Memory_Map()
$i = 0
$GameBaseAddr = _MemoryModuleGetBaseAddress($PID, "Game.dll")
$CrySystemBaseAddr = _MemoryModuleGetBaseAddress($PID, "CrySystem.dll")
$CrySystemBaseAddr += 0x10000000
Do
$Memory_Cache = _MemoryRead($CrySystemBaseAddr, $MemOpen, "BYTE")
$CrySystemBaseAddr += 0x00000001
$i += 1
$Memory_Cache_Hex = hex($Memory_Cache,2)
$Memory_Map &= $Memory_Cache_Hex
$Memory_Cache = ""
Until $i = 429496729
EndFunc
$file = FileOpen("memorymap.map",10)
FileWrite($file,$Memory_Map)
FileClose($file)
$Memory_Entities = StringRegExp($Memory_Map, "886E02460000000000......000000000000....00000000000000000000803F010000002600000000000000......0AA186010001000000......4000CD..0064CD(.*?)00000000000000000000000000000000000", 3)
_ArrayDisplay($Memory_Entities)
nur naja das ist viel zu langsam gibts da eine schnellere Möglichkeit und sind meine StringRegExp Parameter richtig um
"88 6E 00 46 00 00 00 00 00 1C 6E 2B 00 00 00 00 98 15 39 43 00 00 00 00 00 00 00 00 00 00 80 3F 01 00 00 00 26 00 00 00 00 00 00 00 0A 47 1E 0A A1 86 01 00 01 00 00 00 70 3D EA 40 00 1C 38 00 64 7E"
[mit den .. meine ich zeichen die sich auch anders sein können und was hier nach kommt soll dann gefunden werden bis 00 00 kommt]
hoffe das hat man verstanden was ich hier will :D

wichtiger ist auchjedenfall mal den memoryscan schneller zu machen

ist es eventuell möglich einfach die .dll von cheatengine zu benutzen die er zum suchen benutzt?
cheat engine brauch für den suchvorgang nur 2-5 sekunden :(
Hey natürlich gibt es dafür UDFs entweder diejenige Funktion, die sich ScanPattern nennt und in irgendeiner anderen UDF ist oder meine Funktion SearchForBytes in der CCInject.au3 logischerweise werde ich meine Funktion empfehlen, aber google einfach einmal nach beiden funktionen die haben beide ihr Vor- und Nachteile. ;)
11/19/2013 18:40 berkay2578#6
Code:
#include <NomadMemory.au3>

$MemOpen = _MemoryOpen(ProcessExists("nfsw.exe"))
_AOBScan($MemOpen, "AOB as string ex: 0F 74 - Also it doesn't support unknown bytes")

Func _AOBScan($handle, $sig)
	$sig = StringRegExpReplace($sig, "[^0123456789ABCDEFabcdef.]", "")
	$start_addr = 0x00400000
	$end_Addr = 0x0FFFFFFF
	For $addr = $start_addr To $end_Addr Step 51200 - (StringLen($sig) / 2)
		StringRegExp(_MemoryRead($addr, $handle, "byte[51200]"), $sig, 1, 2)
		If Not @error Then
			Return StringFormat("0x%.8X", $addr + ((@extended - StringLen($sig) - 2) / 2))
		EndIf
	Next
	Return 0
EndFunc   ;==>_AOBScan
11/19/2013 21:14 Paraly#7
Danke euch beiden:handsdown:
funktioniert perfekt :)
11/19/2013 22:32 KDeluxe#8
[Only registered and activated users can see links. Click Here To Register...] bietet ebenfalls eine entsprechende Funktion: _KDMemory_FindAddress()