43 / 43 / 4
Регистрация: 30.04.2011
Сообщений: 276
1

Запись в память нужного значения средствами VB.NET

23.01.2012, 16:39. Показов 2660. Ответов 12
Метки нет (Все метки)

Допустим, я просканировал некий процесс и нашел адрес нужного мне значения, например: 0012F4D1. Как изменить значение, находящиеся по этому адресу средствами VB.NET?
Если это средствами VB.NET невозможно, то подскажите, в какую сторону "копать"?

Добавлено через 1 час 58 минут
Нагуглил такое:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    <DllImport("kernel32.dll")> _
            Public Shared Function WriteProcessMemory( _
            ByVal hProcess As IntPtr, _
            ByVal lpBaseAddress As IntPtr, _
            ByVal lpBuffer As Byte(), _
            ByVal nSize As UInteger, _
            ByRef lpNumberOfBytesWritten As UInteger) As Boolean
    End Function
 
    Dim p As Process() = Process.GetProcessesByName("spider")
    Dim en1 As Byte() = {&HB8, &HFF, &HFF, &H0, &H0} 'Bytes de MOV EAX,0FFFF
 
 
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            WriteProcessMemory(p(0).Handle, &H1012F60, en1, en1.Length, 0) '4972A7 Es el Adress
            MsgBox("Memoria Editada Correctamente")
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
Процесс spider - это пасьянс паук, на нем проверяю код, пытаясь изменить счет. &H1012F60 - адрес значения счета. Счет меняется на число 16777144. Почему именно это число, ведь я его ни где не указывал?
Скажите, где в данном коде вставлять конкретное значение? Например, я хочу поменять счет на 777, как это сделать?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.01.2012, 16:39
Ответы с готовыми решениями:

Запись в память процесса целого значения и значения типа float
Есть функции чтения/записи в память процесса: &lt;DllImport(&quot;kernel32.dll&quot;, SetLastError:=True)&gt;...

Запись значения в память процесса
Здравствуйте, уважаемые Форумчане! Небольшое продолжение проблемы с данной темы:...

Запись значения из регистра во внешнюю память МК-51
Ребят, помогите пожалуйста, лабу надо сдать. Составить на ассемблере МК-51 и отладить программу...

Запись значения в память из внедренной dll
Есть в памяти процесса, например, адрес 0xAAAAAAAA в него надо записать нужное значение из...

12
65 / 39 / 3
Регистрация: 07.12.2010
Сообщений: 328
23.01.2012, 16:52 2
Цитата Сообщение от Dim1One Посмотреть сообщение
Dim en1 As Byte() = {&HB8, &HFF, &HFF, &H0, &H0} 'Bytes de MOV EAX,0FFFF
Здесь?
0
Заблокирован
23.01.2012, 16:58 3
Цитата Сообщение от Dim1One Посмотреть сообщение
Счет меняется на число 16777144. Почему именно это число, ведь я его ни где не указывал?
&HFFFFB8 = 16777144
первые три байта массива в обратном порядке
1
43 / 43 / 4
Регистрация: 30.04.2011
Сообщений: 276
23.01.2012, 17:06  [ТС] 4
Значит:
VB.NET
1
Dim en1 As Byte() = {&HB8, &HFF, &HFF, &H0, &H0}
эквивалентно:
VB.NET
1
Dim en1 As Byte() = {&HB8, &HFF, &HFF}
?
Выдает тоже самое число. А как переводить числа типа &HFFFFB8 в нормальные целые числа, или наоборот?
0
748 / 547 / 48
Регистрация: 17.06.2010
Сообщений: 1,041
Записей в блоге: 1
23.01.2012, 17:10 5
Цитата Сообщение от Dim1One Посмотреть сообщение
в нормальные целые числа, или наоборот?
Наоборот можно
VB.NET
1
Msgbox Hex(777)
0
43 / 43 / 4
Регистрация: 30.04.2011
Сообщений: 276
23.01.2012, 18:01  [ТС] 6
Цитата Сообщение от gitarillo Посмотреть сообщение
Msgbox Hex(777)
Вернуло 309.

Что-то я вообще запутался ... Вообщем, я хочу прочитать значение по адресу, отнять от этого значения, например, 9, а потом записать результат. Вот что имею:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    Private Declare Function ReadProcessMemory Lib "kernel32" ( _
            ByVal hProcess As Integer, _
            ByVal lpBaseAddress As Integer, _
            ByRef lpBuffer As Single, _
            ByVal nSize As Integer, _
            ByRef lpNumberOfBytesWritten As Integer _
        ) As Integer
 
    <DllImport("kernel32.dll")> _
            Public Shared Function WriteProcessMemory( _
            ByVal hProcess As IntPtr, _
            ByVal lpBaseAddress As IntPtr, _
            ByVal lpBuffer As Byte(), _
            ByVal nSize As UInteger, _
            ByRef lpNumberOfBytesWritten As UInteger) As Boolean
    End Function
    Dim floatvalueinmemory As Single ' сюда должно записаться прочитанное значени(нормальное целое число)
    Dim p As Process() = Process.GetProcessesByName("spider")
    Dim en1 As Byte() = {} 'Bytes de MOV EAX,0FFFF
 
    'запись
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Try
            WriteProcessMemory(p(0).Handle, &H1012F60, en1, en1.Length, 0)
            MsgBox("Memoria Editada Correctamente")
        Catch ex As Exception
            MsgBox(ex.ToString)
        End Try
    End Sub
 
    'чтение
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim address As Integer
        address = &H1012F60
        Dim p As Process() = Process.GetProcessesByName("spider")
        ReadProcessMemory(p(0).Handle.ToInt32(), address, floatvalueinmemory, 4, 0)
        currenthpsTextBox.Text = CStr(floatvalueinmemory) 'возращает не понятное число
    End Sub
Проблема в том, что прочитанное значение возращается в не понятном виде, хотелось бы, чтоб, если значение = 500, то и возращалось тоже 500. Таже проблема с записью: нужно передавать записываемое число в массиве байтов, а не целое число. Может, какая-нибудь функция есть для преобразования целого числа в массив байт и обратно?
0
Заблокирован
23.01.2012, 18:40 7
Цитата Сообщение от Dim1One Посмотреть сообщение
Таже проблема с записью: нужно передавать записываемое число в массиве байтов, а не целое число. Может, какая-нибудь функция есть для преобразования целого числа в массив байт и обратно?
http://pinvoke.net/default.asp... MoveMemory
0
43 / 43 / 4
Регистрация: 30.04.2011
Сообщений: 276
23.01.2012, 18:58  [ТС] 8
Не до конца понял, что там. Нужно использовать эту функцию?:
VB.NET
1
2
Declare Auto Sub MoveMemory Lib "Kernel32.dll" _
    Alias "RtlMoveMemory" (ByVal dest As IntPtr, ByVal src As IntPtr, ByVal size As Integer)
не понял, как ее использовать. Можно примерчик?
0
Заблокирован
24.01.2012, 10:48 9
Забыл, что это неуправляемая память, здесь нужно через класс Marshal, но там совсем запутаетесь.(MoveMemory отлично работает в VB6, например)
Лучше самому написать функции преобразования массива байтов в число и наоборот.
0
Почетный модератор
Эксперт .NET
8700 / 3652 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
24.01.2012, 11:47 10
Лучший ответ Сообщение было отмечено как решение

Решение

VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Imports System.Runtime.InteropServices
Imports System.ComponentModel
 
Public Class Form1
    <DllImport("kernel32.dll", SetLastError:=True)> _
    Private Shared Function WriteProcessMemory( _
        <[In]()> hProcess As IntPtr, _
        <[In]()> lpBaseAddress As IntPtr, _
        <[In]()> lpBuffer As Byte(), _
        <[In]()> nSize As UIntPtr, _
        <Out()> ByRef lpNumberOfBytesWritten As UIntPtr _
        ) As <MarshalAs(UnmanagedType.Bool)> Boolean
    End Function
 
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Using proc = Process.GetProcessesByName("SpiderSolitaire")(0) ' Для Win7 - SpiderSolitaire
            Dim buff = BitConverter.GetBytes(999) ' Значение для записи
            Dim buffLen = CType(buff.Length, UIntPtr)
 
            If Not WriteProcessMemory(proc.Handle, CType(&H264564, IntPtr), buff, buffLen, buffLen) Then
                MessageBox.Show("Error: " & Marshal.GetLastWin32Error())
                ' Throw New Win32Exception(Marshal.GetLastWin32Error())
            End If
        End Using
    End Sub
End Class
6
43 / 43 / 4
Регистрация: 30.04.2011
Сообщений: 276
24.01.2012, 17:52  [ТС] 11
Спасибо, все работает. Еще вопрос по теме: есть такой код:
VB.NET
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        If ReadVarMem("testing", &H52754AC) <> 1 Then
            WriteVarMem("testing", &H52774AC, 1)
 
            ' WriteVarMem("testing", &H52774B0, ReadVarMem("testing", &H52774B0) - 1)
            WriteVarMem("testing", &H8017E25, ReadVarMem("testing", &H8017E25) - 1)
        End If
    End Sub
 
    Function ReadVarMem(ByVal ProcName As String, ByVal adress As Integer) As Integer
        Try
            Dim buff As Integer
            Dim proc As Process() = Process.GetProcessesByName(ProcName)
            ReadProcessMemory(proc(0).Handle.ToInt32(), CType(adress, IntPtr), buff, 4, 0)
            Return buff
        Catch
        End Try
    End Function
 
    Sub WriteVarMem(ByVal ProcName As String, ByVal adress As Integer, ByVal Var As Integer)
        Dim proc As Process() = Process.GetProcessesByName(ProcName)
        Dim buff = BitConverter.GetBytes(Var)
        Dim buffLen = CType(buff.Length, UIntPtr)
        If Not WriteProcessMemory(proc(0).Handle, CType(adress, IntPtr), buff, buffLen, buffLen) Then
            MessageBox.Show("Error: " & Marshal.GetLastWin32Error())
        End If
    End Sub
Интервал таймера - 100 мили секунд. Является ли код плохо воздействующим на приложение? Просто заметил, что через некоторое время работы программы, процесс, из которого читаются значения, начинает больше поедать оперативки. Может, частая запись в память процесса вредит ему?
0
Почетный модератор
Эксперт .NET
8700 / 3652 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
24.01.2012, 18:32 12
Цитата Сообщение от Dim1One Посмотреть сообщение
Интервал таймера - 100 мили секунд
Неужто такая скорость так необходима?
Цитата Сообщение от Dim1One Посмотреть сообщение
Является ли код плохо воздействующим на приложение?
Ваш код сам по себе плох:
  1. Постоянный вызов Process.GetProcessesByName - постоянный перебор всех процессов и частичный перебор информации в них. Зачем? Один раз получили нужный Вам экземпляр Process и работайте с ним, проверяя значение process.HasExited (чтобы знать когда процесс уничтожен), после того как он больше не нужен вызывать Dispose. А еще лучше один раз получить Handle и его использовать, таймер тормозить когда (Read-)WriteProcessMemory вернёт ошибку;
  2. ReadProcessMemory(proc(0).Handle.ToInt32() - сразу видно, неверный прототип функции, работать будет только под x32.
Цитата Сообщение от Dim1One Посмотреть сообщение
Может, частая запись в память процесса вредит ему?
В большинстве случаев нет. Только что проверил: запустил в бесконечном цикле запись, воздействия вообще никакого, изменений в потреблении памяти почти нет.
1
43 / 43 / 4
Регистрация: 30.04.2011
Сообщений: 276
24.01.2012, 18:54  [ТС] 13
Спасибо за советы, принял к сведению. Об оптимизации что-то вообще не подумал...

Добавлено через 1 минуту
Цитата Сообщение от SSTREGG Посмотреть сообщение
Неужто такая скорость так необходима?
Просто нужно отловить момент изменения значения.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.01.2012, 18:54

Работа с Excel средствами VB.net. Как перевести код из VBA в VB.net?
Коллеги, добрый день! Нужна помощь! В свое время был написан макрос для Excel, но прошло и...

Поиск нужного значения
Есть бд access с таблицей в которой есть 3 столбика NC | Timesud | Device 111111 |...

Вставка в запрос нужного значения
Всем привет, камрады! Пытаюсь выполнить простой запрос, к примеру: ADOQuery2.SQL.Text := 'SELECT...

Обрезать файл до нужного значения
Устанавливаем SetFilePointer на нужное место в файле. Всю информацию за указателем необходимо...

Парсинг нужного значения из html
ПРИвет помогите с задачей Получаю такой ответ после GET запроса ...

Выборка нужного значения <select> <option>
Ребят, возникла такая проблема, на сайте есть 2 товара, не получается написать код, чтобы в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.