dwFindPattern Crash

08/02/2012 23:19 Zwawo#1
Warum crasht der Prozess sobald ich dwFindPattern über einen Adress Bereich laufen lasse, der zu keinem Modul gehört? Die Adressen existieren doch trotzdem.

Hier ein bisschen Code dazu:
Code:
HMODULE module = GetModuleHandle(L"hl2.exe"); 
DWORD Anfang = ((DWORD)module - 0x300000);

DWORD vtablesource = dwFindPattern(Anfang, 0x300000, (PBYTE)"\xB0\x71\xDD\x4F", "xxxx");
Der Bereich der gescannt wird ist also 0x00100000 - 0x00400000.
Bei anderen Adress-Bereichen crasht der Prozess nicht.
08/02/2012 23:34 link#2
Wenn nichts alloziert ist, gibt's ERROR_ACCESS_DENIED, also eine Access Violation (wenn was alloziert ist, aber die Berechtigungen fehlen, auf den entsprechenden Bereich zugreifen zu können, gibt's auch 'ne AV).

Der virtuelle Adressbereich umfasst die gesamten adressierbaren 4 GB (32-bit), allerdings ist dieser ja nur virtuell und muss auch auf einen physischen Bereich gemappt sein, du kannst ja keine 4 GB für jeden Prozess haben, die einfach immer da und ansprechbar sind.
08/02/2012 23:55 Zwawo#3
Und gibt es eine Möglichkeit dieses Problem zu lösen?

VirtualProtect lößt das Problem für kurze Zeit jedoch kommt dann eine Problemmeldung, trotzdem läuft das Programm noch normal weiter bis ich auf "schließen" im Fenster der Problemmeldung klicke.
08/03/2012 01:35 link#4
Eine offensichtliche Lösung wäre, dass du einfach nicht eine solche Reichweite angibst, sondern vorher sicher gehst, dass die Speicheradressen gemappt und lesbar sind bzw. die Reichweite auf eine komplett lesbare Region eingrenzt.

Du könntest den Call auch in ein try-Konstrukt packen und die Adressen, die Exception werfen, überspringen und auch die nächste verfügbare Adresse via VirtualQuery oder HeapWalk finden.

Wenn du allerdings irgendeinen VTable Ptr suchst, solltest du die Suche nicht auf ein Modul beschränken können?
Also dann die Base Adresse von z.B. hl2.exe, engine.dll, w/e holen, die Größe des Moduls auslesen und dann halt nur in diesem Bereich suchen.
08/03/2012 02:00 Zwawo#5
Ja, ich suche einen VTable Pointer jedoch gehört wie ich das sehe der Adress Bereich indem die vtable erstellt wird (Leider halt immer im Bereich von 0x00100000 - 0x00400000) zu keinem Modul. Wenn ich z.B. in Ollydbg das Stück Analysieren will kommt ja auch die Fehlermeldung dass dieses nicht ginge weil der Code zu keinem Modul gehört. Die VTable gibt es halt noch in der d3d9.dll, diese wird aber nicht verwendet.
Auch mit VirtualProtect kriege ich ein Access Violation Error?

//Der Bereich muss halt auch wirklich existieren, ich weiß aber nicht genau wie ich das eingrenzen könnte muss nich wohl nochmal mehr schauen.

//Das mit try und catch hört sich gut an aber da wird es Probleme mit access violations etc geben...
08/03/2012 22:57 MrSm!th#6
Dann scheint da ein Protector am Werke zu sein, VTables sind normalerweise immer statisch im Modul abgelegt.
08/04/2012 22:22 Zwawo#7
Oke, hab`s jetzt mit ner While Schleife dazu __try und __except und ein paar Veränderungen hinbekommen, den durchlöcherten Speicher nach Beliebigem zu durchsuchen.