VB.Net:
Using structs for memory layout
Başlık gibi bir bellek düzeni için bir yapı kullanıyor diyor. Ben normalde bu yöntemi kullanan insanlar görmüyorum ama her şey için readprocessmemory kullanmaktan biraz daha temiz görünümlü bir kod için yapar.
Yani bu örnekte League of Legends kullanacağım
VB.Net:
<StructLayout(LayoutKind.Explicit)> _
Public Structure lolObject
<FieldOffset(0)> _
Public type As Byte
<FieldOffset(4)> _
Public Object_Ptr As Integer
<FieldOffset(&HC)> _
Public Object_Ptr2 As Integer
<FieldOffset(&H1C)> _
Public Team As Integer
<FieldOffset(&H20)> _
Public Flags As Integer
<FieldOffset(&H28)> _
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=60)> _
Public Name As String
<FieldOffset(&H64)> _
Public X As Single
<FieldOffset(&H68)> _
Public Y As Single
<FieldOffset(&H6C)> _
Public Z As Single
<FieldOffset(&H124)> _
Public Current_Health As Single
<FieldOffset(&H134)> _
Public Max_Health As Single
<FieldOffset(&H4F4)> _
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=60)> _
Public Champion As String
<FieldOffset(&H578)> _
Public isPlayer As Byte
End Structure
Yani belirterek
Aradığınız "ofset" 'i belirtebilirsiniz (* Bu, ofsetler arasında boş dolgu oluşturur)
VB.Net:
<MarshalAs(UnmanagedType.ByValTStr, SizeConst:=60)> _
Bu, 60 karakterlik dizeyi belirtir. (bu önemlidir, çünkü o olmadan dizeler başarısız olur ve yapı boyutu doğru olmadığından tüm kurulum başarısız olur)
VB.Net:
<FieldOffset(4)> _
Public Object_Ptr As Integer
<FieldOffset(&HC)> _
Public Object_Ptr2 As Integer
Yani bu 2 özellik arasında 4 baytlık dolgu (boş alan) var
object_ptr 0x4 ve 4 bayt uzunluğunda (tamsayı) başladığından ve bir sonraki ofset 0xC .... 'da başladığından, yapınızı nasıl kurarsınız.
VB.Net:
Private ObjManager As Integer = &H1DBAA84
Private LocalPlayer As Integer = &H2A361AC
Bu örnekte, nesne yöneticisine nesne için işaretçi 4 bayt yineleyin. (Bu, bunu neden gönderiyorum ile tam olarak ilgili değil, ancak bu yapıyla oynamak için kullanabilirsiniz)
VB.Net:
Dim lobj As lolObject = New lolObject
Dim local_player As lolObject = New lolObject
lobj = byteArraytoStruct(lobj, Memory.readInt(objMgrBase))
local_player = byteArraytoStruct(local_player, Memory.readInt(lolBase + LocalPlayer))
Dim nametype As Integer = 0
While lobj.type <> 0
'do stuff
CurrentObj += 4
lobj = byteArraytoStruct(lobj, Memory.readInt(objMgrBase + CurrentObj))
End While
Şimdi verileri mareşal kullanarak yapıya sokmak
VB.Net:
Private Function byteArraytoStruct(ByVal obj As Object, ByVal address As Long) As Object
Try
Dim Current_Object_Byte_Array() As Byte = Memory.readByteArray(address, Marshal.SizeOf(obj)) 'read the byte array (size of your structure)
Dim ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(obj)) 'Allocate some memory the size of your object and get a pointer to it.
Marshal.Copy(Current_Object_Byte_Array, 0, ptr, Marshal.SizeOf(obj)) 'copy the byte array into it.
obj = Marshal.PtrToStructure(ptr, obj.GetType) 'do magic... pretty self explanatory marshal function.
Marshal.FreeHGlobal(ptr) 'free the memory at pointer.
Return obj 'return the newly set structure
Catch ex As Exception
Console.WriteLine(ex.StackTrace)
Console.WriteLine(ex.Message)
Return Nothing
End Try
End Function
Rehberim Nasıldı ? Mesajlarınızı bekliyom