Seite 1 von 2

Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 18:56
von Scarabol
Hi,

ich bekomm immer nur die Meldun angezeigt:
Nur ein Teil der ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen.
Sonst scheint alles ok zu sein...

Wo hab ich den Fehler gemacht?

Code: Alles auswählen


Procedure.s GetLastErrorAsString(ErrorCode=-1)
   Protected message.s{1024}
   If ErrorCode = -1
      ErrorCode=GetLastError_()
   EndIf
   FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, ErrorCode, 0, @message, 1024, 0)
   ProcedureReturn message
EndProcedure


; tokenHandle = AllocateMemory(4)
; OpenProcessToken_(GetCurrentProcess_(), #TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY, tokenHandle)
; privilegeToken.TOKEN_PRIVILEGES
; LookupPrivilegeValue_(0, SE_DEBUG_NAME, privilegeToken\Privileges[0]\Luid)
; privilegeToken\PrivilegeCount = 1
; privilegeToken\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
; AdjustTokenPrivileges_(tokenHandle, 0, privilegeToken, SizeOf(TOKEN_PRIVILEGES), 0, 0)
; CloseHandle_(tokenHandle)


hwnd = FindWindow_(0, "Eigene Dateien")
If hwnd = 0
  Debug GetLastErrorAsString()
  End
EndIf

Debug "hwnd"
Debug hwnd

buffer = AllocateMemory(4)
If GetWindowThreadProcessId_(hwnd, buffer) = 0
  Debug GetLastErrorAsString()
  End
EndIf
hprocess = PeekL(buffer)

Debug "hprocess"
Debug hprocess

ohproc = OpenProcess_(#PROCESS_VM_READ, #False, hprocess)
If ohproc = 0
  Debug GetLastErrorAsString()
  End
EndIf

Debug "ohproc"
Debug ohproc

buffer = AllocateMemory(100)
target = AllocateMemory(4)
PokeL(target, 0)

If ReadProcessMemory_(ohproc, 0, buffer, 10, 0) = 0
  Debug GetLastErrorAsString()
  End
EndIf

Debug "buffer"
Debug PeekL(buffer)
MfG
Scarabol

Re: Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 19:04
von ts-soft
Ein Fenster "Eigene Dateien" kenne ich nicht, jedenfalls ist dort der hWnd 0, was auch sonst, und
das Programm beendet sich, wie es programmiert wurde.

Re: Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 19:15
von Scarabol
Dann öffne doch bitte deinen Ordner Eigene Dateien mit dem Explorer

MfG
Scarabol

Re: Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 19:24
von ts-soft
Eigene Dateien gibts ja nicht mehr, aber "Eigene Dokumente" hab ich geöffnet.
(c:\Users\username\Documents\)

Re: Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 19:30
von Scarabol
Willst mich wohl zum Narren halten oder?

Mach doch bitte einfach ein Explorer Fenster auf und gib den Namen oben ein. Ich verwende übrigens XP, aber mit Vista wirds wohl auch nicht klappen, oder haste schon Windows 7?

MfG
Scarabol

Re: Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 19:45
von ts-soft
Scarabol hat geschrieben:Willst mich wohl zum Narren halten oder?l
Morgen wieder :mrgreen:
Mit "Desktop" funktioniert es unter 7, jedenfalls kommt er jetzt etwas weiter.
Ich denke mal das Problem ist der allokierte Speicher. VirtualAlloc könnte helfen.

Re: Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 19:49
von Scarabol
Welches MEM_??? bzw. PAGE_??? sollte ich da verwenden?

Edit, so klappts bei mir leider auch nicht...

Code: Alles auswählen

Procedure.s GetLastErrorAsString(ErrorCode=-1)
   Protected message.s{1024}
   If ErrorCode = -1
      ErrorCode=GetLastError_()
   EndIf
   FormatMessage_(#FORMAT_MESSAGE_FROM_SYSTEM, 0, ErrorCode, 0, @message, 1024, 0)
   ProcedureReturn message
EndProcedure


; tokenHandle = AllocateMemory(4)
; OpenProcessToken_(GetCurrentProcess_(), #TOKEN_ADJUST_PRIVILEGES | #TOKEN_QUERY, tokenHandle)
; privilegeToken.TOKEN_PRIVILEGES
; LookupPrivilegeValue_(0, SE_DEBUG_NAME, privilegeToken\Privileges[0]\Luid)
; privilegeToken\PrivilegeCount = 1
; privilegeToken\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED
; AdjustTokenPrivileges_(tokenHandle, 0, privilegeToken, SizeOf(TOKEN_PRIVILEGES), 0, 0)
; CloseHandle_(tokenHandle)


hwnd = FindWindow_(0, "Eigene Dateien")
If hwnd = 0
  Debug GetLastErrorAsString()
  End
EndIf

Debug "hwnd"
Debug hwnd

buffer = AllocateMemory(4)
If GetWindowThreadProcessId_(hwnd, buffer) = 0
  Debug GetLastErrorAsString()
  End
EndIf
hprocess = PeekL(buffer)

Debug "hprocess"
Debug hprocess

ohproc = OpenProcess_(#PROCESS_VM_READ, #False, hprocess)
If ohproc = 0
  Debug GetLastErrorAsString()
  End
EndIf

Debug "ohproc"
Debug ohproc

buffer = VirtualAlloc_(0, 100, #MEM_COMMIT, #PAGE_EXECUTE_READWRITE)
If buffer = 0
  Debug GetLastErrorAsString()
  End
EndIf

If ReadProcessMemory_(ohproc, 0, buffer, 4, 0) = 0
  Debug GetLastErrorAsString()
  End
EndIf

Debug "buffer"
Debug PeekL(buffer)
MfG
Scarabol

Re: Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 20:00
von ts-soft
Bei ReadProcessMemory gibste an, Dein Buffer wäre 4 Byte gross? Der ist wohl 100 Byte groß.
Ansonsten weiß ich im moment auch nicht, weiß ja nicht was der Code überhaupt erreichen soll.

Re: Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 20:02
von Scarabol
Ich will einfach nur den Speicher manipulieren hab im Codearchiv ein Trainer Beispiel gefunden, da wird der Windows Taschenrechner modifiziert. Sieht sehr passend aus muss nur noch schauen, wie ich an eine bestimmte Speicheradresse springen kann. Falls du mir da helfen kannst, hier der Link ich blick noch nicht so ganz durch:
http://purearea.net/pb/CodeArchiv/Other ... Process.pb

MfG
Scarabol

Re: Problem mit ReadProcessMemory()

Verfasst: 01.01.2010 22:33
von Thorium
Klappt denn das allozieren des Speichers?
Bekommst du nen gültigen Pointer von dem Aufruf?

Normalerweise kannst du #MEM_COMMIT alleine nur verwenden, wenn der Speicher dort schon reserviert ist. Ist er nicht reserviert muss er erst reserviert werden, bzw. VirtualAlloc kann Reserve und Commit gleichzeitig.
Wäre dann so:

Code: Alles auswählen

buffer = VirtualAlloc_(0, 100, #MEM_COMMIT | #MEM_RESERVE, #PAGE_EXECUTE_READWRITE)
Die Größe des Speicherblocks sollte reichen. VirtualAlloc alloziert Minimum 0x1000 Bytes.