Code archives/User Libs/Read/Write to an app/process's local memory

This code has been declared by its author to be Public Domain code.

Download source code

Read/Write to an app/process's local memory by skn3[ac]
(Posted 22 years ago)
you need the following userlib:

.lib " "
GetProcessId%(name$)
GetWindowProcessId%(name$)
OpenProcessMemory(class$,name$,access%)
WriteProcessByte(process%,offset%,value%)
WriteProcessShort(process%,offset%,value%)
WriteProcessInt(process%,offset%,value%)
ReadProcessByte(process%,offset%)
ReadProcessShort(process%,offset%)
ReadProcessInt(process%,offset%)
CloseProcessMemory(process%)

.lib "user32.dll"
Pmem_FindWindow%(class%,name$):"FindWindowA"
Pmem_GetWindowThreadProcessId%(hwnd%,processid*):"GetWindowThreadProcessId"
Pmem_GetClassName%(hwnd%,classname*,max%):"GetClassNameA"

.lib "Kernel32.dll"
Pmem_OpenProcess%(access%,inherit%,processid%):"OpenProcess"
Pmem_ReadProcessMemory%(process%,address%,buffer*,size%,numberofbytesread%):"ReadProcessMemory"
Pmem_WriteProcessMemory%(process%,address%,buffer*,size%,numberofbytesread%):"WriteProcessMemory"
Pmem_CloseHandle%(object%):"CloseHandle"
Pmem_GetLastError%():"GetLastError"
Pmem_CreateToolhelp32Snapshot%(flags%,processid%):"CreateToolhelp32Snapshot"
Pmem_Process32First%(snapshot%,entry*):"Process32First"
Pmem_Process32Next%(snapshot%,entry*):"Process32Next"


Example:
Include "ProcessMemory.bb"
process = OpenProcessMemory(GetProcessId("someapp.exe"))
For i=0 To 255
	WriteProcessByte(process,$20222E8,i)
	Delay 10
Next
CloseProcessMemory(process)
Make a blitz file called "ProcessMemory.bb":

Global pmem_bank = CreateBank(4)
Global pmem_proc32 = CreateBank(296) : PokeInt(pmem_proc32,0,296)

Function GetWindowProcessId(name$)
	Local hwnd,bank
	
	hwnd = Pmem_FindWindow(0,name$)
	If hwnd = 0 Return False
	Pmem_GetWindowThreadProcessId(hwnd,pmem_bank)
	Return PeekInt(pmem_bank,0)	
End Function

Function GetProcessId(name$)
	Local snapshot,processid,offset,processname$,char
	
	snapshot = Pmem_CreateToolhelp32Snapshot(2,0)
	If snapshot = 0 Return False
	
	If Pmem_Process32First(snapshot,pmem_proc32)
		While Pmem_Process32Next(snapshot,pmem_proc32)
			processid = PeekInt(pmem_proc32,8)
			processname$ = ""
			offset = 36
			char = PeekByte(pmem_proc32,offset)
			If char <> 0
				While char <> 0
					processname$ = processname$ + Chr$(char)
					offset = offset + 1
					char = PeekByte(pmem_proc32,offset)
				Wend
				If Lower(processname$) = Lower(name$)
					Pmem_CloseHandle(snapshot)
					Return processid
				End If
			End If
		Wend
	End If
	
	Pmem_CloseHandle(snapshot)
	Return False
End Function

Function OpenProcessMemory(processid,access=983040 Or 1048576 Or 4095)
	Return Pmem_OpenProcess(access,False,processid)
End Function

Function WriteProcessByte(process,offset,i)
	PokeByte(pmem_bank,0,i)
	If Pmem_WriteProcessMemory(process,offset,pmem_bank,1,0) = 0 Return False
	Return True
End Function

Function WriteProcessShort(process,offset,i)
	PokeShort(pmem_bank,0,i)
	If Pmem_WriteProcessMemory(process,offset,pmem_bank,3,0) = 0 Return False
	Return True
End Function

Function WriteProcessInt(process,offset,i)
	PokeInt(pmem_bank,0,i)
	If Pmem_WriteProcessMemory(process,offset,pmem_bank,4,0) = 0 Return False
	Return True
End Function

Function ReadProcessByte(process,offset)
	If Pmem_ReadProcessMemory(process,offset,pmem_bank,1,0) = 0 Return False
	Return PeekByte(pmem_bank,0)
End Function

Function ReadProcessShort(process,offset)
	If Pmem_ReadProcessMemory(process,offset,pmem_bank,2,0) = 0 Return False
	Return PeekShort(pmem_bank,0)
End Function

Function ReadProcessInt(process,offset)
	If Pmem_ReadProcessMemory(process,offset,pmem_bank,4,0) = 0 Return False
	Return PeekInt(pmem_bank,0)
End Function

Function CloseProcessMemory(process)
	Pmem_CloseHandle(process)
End Function