|
You last visited: Today at 21:19
Advertisement
Array of Byte oder Pattern suche
Discussion on Array of Byte oder Pattern suche within the AutoIt forum part of the Coders Den category.
11/18/2013, 17:53
|
#1
|
elite*gold: 27
Join Date: Sep 2009
Posts: 5,609
Received Thanks: 1,597
|
Array of Byte oder Pattern suche
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
|
#2
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by zocker5656
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
|
#3
|
elite*gold: 27
Join Date: Sep 2009
Posts: 5,609
Received Thanks: 1,597
|
ok darauf kam ich auch schon vorher nur ich dachte es gäbe evtl eine bequeme art wie ne fertige UDF aber ok
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
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
|
#4
|
elite*gold: 280
Join Date: May 2007
Posts: 2,818
Received Thanks: 3,483
|
Quote:
Originally Posted by zocker5656
ok darauf kam ich auch schon vorher nur ich dachte es gäbe evtl eine bequeme art wie ne fertige UDF aber ok
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
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
|
#5
|
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
|
Quote:
Originally Posted by zocker5656
ok darauf kam ich auch schon vorher nur ich dachte es gäbe evtl eine bequeme art wie ne fertige UDF aber ok
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
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
|
#6
|
elite*gold: 15
Join Date: Aug 2012
Posts: 3,041
Received Thanks: 6,397
|
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
|
#7
|
elite*gold: 27
Join Date: Sep 2009
Posts: 5,609
Received Thanks: 1,597
|
Danke euch beiden 
funktioniert perfekt
|
|
|
11/19/2013, 22:32
|
#8
|
elite*gold: 0
Join Date: Mar 2009
Posts: 7,260
Received Thanks: 33,149
|
 bietet ebenfalls eine entsprechende Funktion: _KDMemory_FindAddress()
|
|
|
All times are GMT +2. The time now is 21:19.
|
|