SDHP442 Ответов: 1

Нужна помощь [readwritingmemory]


Обновление:
я могу изменить имя,но не читать его..

я получаю эту ошибку (при чтении памяти):
Ошибка 1 значение типа "1-мерный массив байтов" не может быть преобразовано в "строку".

Что я уже пробовал:

Public Shared Function ReadMemory(Of T)(ByVal address As Integer) As T
        Return MemoryModule.ReadMemory(Of T)(address, 0, False)
    End Function

    Public Shared Function ReadMemory(ByVal address As Integer, ByVal length As Integer) As Byte()
        Return MemoryModule.ReadMemory(Of Byte())(address, length, False)
    End Function

    Public Shared Function ReadMemory(Of T)(ByVal address As Integer, ByVal value As Object, ByVal unicodeString As Boolean)
        Dim buffer As Byte()
        If (GetType(T) Is GetType(String)) Then
            If unicodeString Then
                buffer = Encoding.Unicode.GetBytes(value.ToString)
            Else
                buffer = Encoding.ASCII.GetBytes(value.ToString)
            End If
        ElseIf (GetType(T) Is GetType(Byte())) Then
            buffer = Encoding.Unicode.GetBytes(value.ToString)
        Else
            buffer = Encoding.ASCII.GetBytes(value.ToString)
        End If
        If Not MemoryModule.UpdateProcessHandle Then
            Return CType(Nothing, T)
        End If
        Dim lpBaseAddress As New IntPtr(address)
        Dim dwSize As New IntPtr(buffer.Length)
        If Not MemoryModule.ReadProcessMemory(MemoryModule.ProcessHandle, lpBaseAddress, buffer, dwSize, IntPtr.Zero) Then
            Return CType(Nothing, T)
        End If
        If (GetType(T) Is GetType(Byte())) Then
            Return Conversions.ToGenericParameter(Of T)(buffer)
        End If
        Dim handle As GCHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned)
        Dim local2 As T = Conversions.ToGenericParameter(Of T)(RuntimeHelpers.GetObjectValue(Marshal.PtrToStructure(handle.AddrOfPinnedObject, GetType(T))))
        handle.Free()
        Return local2
    End Function

    Public Shared Function WriteMemory(ByVal address As Integer, ByVal value As Object, ByVal [unicode] As Boolean) As Boolean
        Dim bytes As Byte()
        If Not MemoryModule.UpdateProcessHandle Then
            Return False
        End If
        If TypeOf value Is String Then
            If [unicode] Then
                bytes = Encoding.Unicode.GetBytes(value.ToString)
            Else
                bytes = Encoding.ASCII.GetBytes(value.ToString)
            End If
        Else
            bytes = MemoryModule.GetObjectBytes(RuntimeHelpers.GetObjectValue(value))
        End If
        Dim lpBaseAddress As New IntPtr(address)
        Dim nSize As New IntPtr(bytes.Length)
        Return MemoryModule.WriteProcessMemory(MemoryModule.ProcessHandle, lpBaseAddress, bytes, nSize, IntPtr.Zero)
    End Function

 Public Shared Function WriteMemory(ByVal address As Integer, ByVal value As Object) As Boolean
        Return MemoryModule.WriteMemory(address, RuntimeHelpers.GetObjectValue(value), False)
    End Function


And when trying to read the memory with that (HERE I GET THE ERROR)
Label2.Text = MemoryModule.ReadMemory(&H234BFD4, AscW((ChrW(0))))


and this is how i write memory:
MemoryModule.WriteMemory(&H234BFD4, (CrystalClearTextBox9.Text & ChrW(0)), False)
the write one is working fine

Tomas Takac

Значит, это исключение времени выполнения? На какой именно линии он брошен?

Ralf Meier

Я предполагаю, что ошибка возникает, когда вы пытаетесь присвоить результат из ReadMemory Label2.Text.
Если я прав, то Errormessage ясен : вы доставляете массив байтов, но метка ждет строку - так что вам нужно только создать строку из вашего байтового массива ... или добавьте это преобразование к вашему ReadMemory-методу ...

Проверяли ли вы с помощью отладчика, какой метод действительно вызывается (первый или второй)?
Получаете ли вы правильную информацию типа внутри Т-объекта ?

SDHP442

может быть, вы поможете мне с этим обращением?

1 Ответов

Рейтинг:
0

CHill60

Преобразуйте массив байтов в строку перед назначением его тексту метки:

Label2.Text = System.Text.Encoding.Unicode.GetString(MemoryModule.ReadMemory(&H234BFD4, AscW((ChrW(0)))))


SDHP442

Попробовал этот: Метка2.Текст = Система.Текст.Кодирование.ASCII.GetString(MemoryModule.ReadMemory(& H234BFD4, AscW ((ChrW(0)))))

Он показывает только первые 2 буквы имени, есть идеи ?

@CHill60

CHill60

Если вы отладите и изучите результат MemoryModule.ReadMemory(& H234BFD4, AscW ((ChrW(0))) Я предполагаю, что массив байтов содержит только первые 2 буквы имени?

SDHP442

Да, есть ли какой-нибудь способ показать полное имя?
например, если имя TEST, то оно показывает только TE

CHill60

Возможно, передать более длинную длину функции ReadMemory? Отладьте свою функцию ReadMemory и выясните, почему она останавливается после 2 символов?

SDHP442

Действительно понятия не имею как это сделать xD
Модуль памяти.ReadMemory(& H234BFD4, AscW ((ChrW (200)))
изменено, что Chrw от 0 до 50-200 теперь можно видеть 3 буквы названия

CHill60

Э... случайное изменение параметров - не очень хороший способ отладки.
Попробуйте эту статью : Освоение отладки в Visual Studio 2010 - руководство для начинающих[^]. Вам нужно войти в эту функцию и выяснить, почему она не считывает память до ChrW (0).

Ralf Meier

Другой вопрос :
Вы уверены, что знаете, что делают эти методы ?
Я полагаю, что они написаны не вами.
Если вы пытаетесь работать с отладчиком (как это уже было предложено CHill), вы должны посмотреть, какой буфер(его размер) вы получаете из параметра AscW (ValueXYZ) ...

Ralf Meier

Информация :
Мы все уже используем этот метод :
"Общедоступный ReadMemory функция(адрес, бывал как целое число, длина бывал как целое) Как Байт()"

Так... почему бы вам не использовать этот метод, изначально запланированный ?

SDHP442

Братан, я его не записывал, это публичный модуль памяти для чтения и записи
я просто пытаюсь построить программу и застрял с этим

SDHP442

и не могу этим воспользоваться
Метод охлаждения является самым близким до сих пор
нужна помощь с исправлением того, что всего 3 буквы

Ralf Meier

Хорошо ... как я понимаю, метод (по его названию) :
"Общедоступный ReadMemory функция(адрес, бывал как целое число, длина бывал как целое) Как Байт()"
С параметром "адрес" вы говорите, откуда читать ...
С параметром "длина" вы говорите, сколько читать ...
Возвращаемое значение-это массив байтов (я полагаю, с той длиной, которую вы запросили ...
Изменения кода от CHill показывают вам, как построить строку из такого массива байтов.
Если теперь вы хотите прочитать более 2 букв, вы должны использовать этот метод и дать параметру Length значение (в виде целого числа), которое вы хотите прочитать. Вы пробовали это ?..
Мой 2-й вопрос :
Вы пытались проверить, что делает ваш код с помощью отладчика ? Обратите внимание: отладчик-это очень грязный инструмент ... это может показать вам, что происходит ...

CHill60

Виртуальная 5 за этот комментарий и сердечное спасибо за помощь мне теперь, когда мы ушли ваааай от темы первоначального вопроса :-)

Ralf Meier

Добро пожаловать ...
и спасибо за ваш виртуальный голос :)
Но я не думаю, что мы действительно отклонились от темы - это не зависит от "Инкуайрера"...