I have no idea what are you doing wrong.
Anyway, i just made this code and it is working like a charm. Remember Blackd address list always uses Tibia's baseaddress as &H400000.
Code:
Imports System.Runtime.InteropServices
Public Class Form1
Public Shared Function ReadProcessMemory(ByVal hProcess As IntPtr, _
ByVal lpBaseAddress As IntPtr, _
<Out()> ByVal lpBuffer As Byte(), _
ByVal dwSize As IntPtr, _
ByRef lpNumberOfBytesRead As IntPtr) As Boolean
End Function
'
Public ProcessID As IntPtr
Public ProcessHandle As IntPtr
Public ProcessBase As Long
'
Public Const HealthAdr As Long = &HAD1030 - &H400000
Public Const ManaAdr As Long = &H933688 - &H400000
Public Const XorAdr As Long = &H933658 - &H400000
Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
Dim p As Process = Nothing
'
Dim xorVlr As Long
Dim hpVlr As Long
Dim mpVlr As Long
'
p = Process.GetProcessesByName("tibia")(0)
'
If Not p Is Nothing Then
'
ProcessID = p.Id
ProcessHandle = p.Handle
ProcessBase = p.MainModule.BaseAddress
'
xorVlr = ReadMemoryLong(ProcessID, ProcessBase, XorAdr)
hpVlr = ReadMemoryLong(ProcessID, ProcessBase, HealthAdr)
mpVlr = ReadMemoryLong(ProcessID, ProcessBase, ManaAdr)
'
hpVlr = hpVlr Xor xorVlr
mpVlr = mpVlr Xor xorVlr
'
Label1.Text = "Health: " & hpVlr
Label2.Text = "Mana:" & mpVlr
'
p = Nothing
End If
'
End Sub
Public Function ReadMemoryLong(ByVal idProcess As IntPtr, ByVal baseaddress As Long, ByVal address As Long) As Long
Dim realaddress As Long
Dim buffer() As Byte
Dim handleproc As IntPtr
'
ReDim buffer(3)
'
handleproc = Process.GetProcessById(idProcess).Handle
'
realaddress = baseaddress + address
'
ReadProcessMemory(handleproc, realaddress, buffer, buffer.Length, Nothing)
'
Return BitConverter.ToInt32(buffer, 0)
'
End Function
End Class