чтение данных с процесса

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

чтение данных с процесса

Сообщение Vadim_n » 08.12.2011 (Чт) 11:15

В нете нашел код тренера от игры и на его основании можно прочитать данные с процесса по конкретно указанному адресу, а адрес приходится вычислять с помощью программы арт монеу.

Код: Выделить всё
Private Sub ReadTimer_Timer()  'прочитать данные с процесса
    ' Объявляем некоторые необходимые моменты для таймера.
    Dim hwnd As Long ' удерживает управление, переданное функцией FindWindow.
    Dim pid As Long ' удерживает идентификатор процесса.
    Dim pHandle As Long ' удерживает управление процессом.
    Dim str As String * 20 ' параметр текстовой строки.
    Dim proce As String  ' название процеса
    Dim nomproce As Long  ' номер процеса
   
    ' Вначале ищем окно игры.
    'название процеса можно прочитать при нажатии кнобок альт + таб
    proce = Text2.Text    '(Text2-название процесса)
    hwnd = FindWindow(vbNullString, proce)
    If (hwnd = 0) Then
    List1.AddItem "error1 Не найдено окно процесса!" 'список выполняемых действий
    Exit Sub
    Else
    List1.AddItem "Найдено окно процесса " & Text2.Text & " !" 'список выполняемых действий
    End If
    ' Теперь можно определить идентификатор процесса.
    GetWindowThreadProcessId hwnd, pid
       ' Используем идентификатор для управления процессом.
    pHandle = OpenProcess(PROCESS_ALL_ACCESS, False, pid)
   
    'pHandle = OpenProcess(CONST PROCESS_ALL_ACCESS AS LONG, False, pid)
    If (pHandle = 0) Then
    List1.AddItem "error2 процес не открыт!" 'список выполняемых действий
    Exit Sub
    Else
    List1.AddItem "процес открыт! pHandle = " & pHandle  'список выполняемых действий
    List1.AddItem "идентификатор процесса = " & pid
    End If
    ' Теперь можно прочитать из памяти...
    'ReadProcessMemory pHandle, Text3.Text, str, 20, 0&   11CCE438
   
    nomproce = Text3.Text     'определить значение №1   '&H913F6BC
    If ReadProcessMemory(pHandle, nomproce, str, 20, 0&) Then Text5.Text = Asc(str)   
   
    nomproce = Text6.Text   'определить значение №2   '&H913F6BC
    If ReadProcessMemory(pHandle, nomproce, str, 20, 0&) Then Text7.Text = Asc(str)   
   
    nomproce = Text4.Text  'определить значение №3    '&H913F6BC
    If ReadProcessMemory(pHandle, nomproce, str, 20, 0&) Then Text8.Text = Asc(str) 
   
   
    ' Прекращаем управлять процессом.
    CloseHandle hProcess
    ReadTimer.Enabled = False
    End Sub


Мне нужно прочесть и вывести на форму все данные с процесса, может в цикле как-нибудь, без помощи сторонних программ типа арт монео.
Как вывести список всех идентификаторов процесса? Как вывести их значения?
Последний раз редактировалось Vadim_n 08.12.2011 (Чт) 12:03, всего редактировалось 1 раз.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: чтение данных с процесса

Сообщение Хакер » 08.12.2011 (Чт) 11:19

Автор, у тебя у самого как глаза переносят ту ужасную рябь, который ты натворил? И ведь надо же некоторым личностям использовать тег наш уникальный тег [icode], вместо везде присутствующего тега [code]...

Исправляй свой пост.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 08.12.2011 (Чт) 12:06

Извените исправил

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: чтение данных с процесса

Сообщение Хакер » 08.12.2011 (Чт) 13:12

Vadim_n писал(а):Мне нужно прочесть и вывести на форму все данные с процесса, может в цикле как-нибудь, без помощи сторонних программ типа арт монео.

Ну и в чём проблема это сделать? Ты читал текст в красной рамке вверху? Ты не думаешь, что к тебе это относится в той же степени как и к другим? Кто будет писать конкретный вопросы? Кто будет писать о том, какая работа уже проделана для решения проблемы?

Vadim_n писал(а):Как вывести список всех идентификаторов процесса?

Если имелись в виду идентификатороры процессов — то очень легко. EnumProcesses или снять снапшот и Process32First и Process32Next.
Если же имелись в виду идентификаторы процесса — то никак, потому что нет никаких идентификаторов процесса, у процесса есть только один числовой идентификатор (PID).
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 08.12.2011 (Чт) 16:23

Прошу прошения за не правильное создание темы.

У меня проблема вывести на форму не список процессов а все адреса конкретного процесса и их значение.
Код: Выделить всё
For I = 1 To UBound(Processes)
    'Определяем путь до файла процесса:
    'очищаем от нулевых символов
  If Left(Processes(I).szExeFile, InStr(Processes(I).szExeFile, Chr(0)) - 1) = List1 Then
   
    Buf = Left(Processes(I).szExeFile, InStr(Processes(I).szExeFile, Chr(0)) - 1)
    Text1.Text = Buf  'имя процесса
    Buf = Left(Processes(I).th32ProcessID, InStr(Processes(I).szExeFile, Chr(0)) - 1)
    Text2.Text = Buf  'номер процесса
    Buf = Left(Processes(I).th32ParentProcessID, InStr(Processes(I).szExeFile, Chr(0)) - 1)
    Text3.Text = Buf  'номер родительского процесса
    Buf = Left(Processes(I).cntThreads, InStr(Processes(I).szExeFile, Chr(0)) - 1)
    Text4.Text = Buf  'количество потоков в процессе
    Buf = Left(Processes(I).cntUsage, InStr(Processes(I).szExeFile, Chr(0)) - 1)
    Text5.Text = Buf  'сколько % сист рес использовано
    Buf = Left(Processes(I).dwFlags, InStr(Processes(I).szExeFile, Chr(0)) - 1)
    Text6.Text = Buf   'свойства процесса 
  End If
Next I


Я не найду где узнать адреса в памяти процесса, примерно выглядят так “&H913F6B8”

iGrok
Артефакт VBStreets
Артефакт VBStreets
 
Сообщения: 4272
Зарегистрирован: 10.05.2007 (Чт) 16:11
Откуда: Сетевое сознание

Re: чтение данных с процесса

Сообщение iGrok » 08.12.2011 (Чт) 18:18

Vadim_n писал(а):Я не найду где узнать адреса в памяти процесса, примерно выглядят так “&H913F6B8”

А нигде, в общем-то. Для всех, кроме этого самого процесса, его память выглядит как один сплошной массив, без какого-либо разделения.
Тот же ArtMoney либо использует свою готовую базу соответствий "адрес загрузки - адрес значения - за что отвечает", либо ищет в памяти то, что нужно по каким-то известным значениям.
label:
cli
jmp label

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 09.12.2011 (Пт) 9:57

свою готовую базу соответствий "адрес загрузки - адрес значения - за что отвечает",

Подскажите пожалуйста, как можно свою готовую базу сделать, как правильно сканер памяти организовать, как лучше поступить чтобы не пользоваться арт монео.

Код: Выделить всё
    For e = Text12.Text To Text13.Text                    'Text12 = 1356270 Text13 = 1456270  диапазон памяти в 10-тичной системе
    Label6.Caption = e
    Label13.Caption = "&H" & Hex(Label6.Caption)    'перевести c 10 в 16 систему
    nomproce = Label13.Caption  ' &H913F6B8
    If ReadProcessMemory(pHandle, nomproce, str, 20, 0&) Then Label14.Caption = Asc(str)
    List2.AddItem Label6.Caption & " - " & Label13.Caption & " - " & Label14.Caption      'вывести результат
    Next e

Как определить диапазон памяти для просмотра, который использует конкретный процесс ?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: чтение данных с процесса

Сообщение Хакер » 09.12.2011 (Пт) 10:07

Vadim_n писал(а):монео.

Каждый раз, когда кто-то пишет «монео» вместо Money, в мире умирает ни в чём неповинный ребёнок. :roll:

Vadim_n писал(а):Как определить диапазон памяти для просмотра, который использует конкретный процесс ?

Блин. Откуда берутся люди, которые хотят что-то делать, не желая изучать матчасть, как всё устроено, как всё работает и что вообще к чему?
Каждый процесс имеет своё изолированное адресное пространство от 0x00000000 до 0xFFFFFFFF. Хотя технически процесс может обращаться по любому адресу из этого диапазона, не всё адресное пространство действительно доступно процессу. Потому что адресное пространство делится на страницы размером 4кб, и как минимум каждая страница может быть либо не-занята, либо занята. Доступ к не-занятым страницам однозначно невозможен. Доступ к занятым страницам возможен, если такой доступ разрешён атрибутами доступа конкретно взятой страницей. О том, какие страница процесса свободны, какие заняты, какие атрибуты у каждой интересующей страницы, можно получить с помощью функции VirtualQuery.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 13.12.2011 (Вт) 17:19

Растолкуйте мне пожалуйста! С 16-ричной системы в 10 и обратно переводить я разобрался.
&H14AF5C - в 16-ричной системе, 1355612 – в 10,
А это в какой - 0x00000000 до 0xFFFFFFFF?
мне по формуле нужно найти адрес
$98B460 = адрес1
? = адрес1+$1C+$20+$464 – а, б, с переводить в 10-тичную?
Формула [адрес1]+а+б+с не означает, что к [адрес1] нужно прибавлять сумму (а+б+с).
По адресу [адрес1] лежит указатель на переменную в области памяти, к ней и прибавляй "а",
по новому указателю лежит другая переменная, к которой плюсуешь "б".....

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: чтение данных с процесса

Сообщение Хакер » 13.12.2011 (Вт) 17:28

Vadim_n писал(а):А это в какой - 0x00000000 до 0xFFFFFFFF?

В 16-ричной.

Vadim_n писал(а):? = адрес1+$1C+$20+$464 – а, б, с переводить в 10-тичную?

Если нечем больше заняться — можно переводить.

Vadim_n писал(а):Формула [адрес1]+а+б+с не означает, что к [адрес1] нужно прибавлять сумму (а+б+с).
По адресу [адрес1] лежит указатель на переменную в области памяти, к ней и прибавляй "а",
по новому указателю лежит другая переменная, к которой плюсуешь "б"....

Тогда это не записывается как [x]+a+b+c. Это записывается как *(*(*((*x)+a) + b)+c)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 13.12.2011 (Вт) 18:16

Если нечем больше заняться — можно переводить.

Если бы мне было чем заняться я бы и не спрашивал бы.

&H14B1F4 = CDec(1356276)
0x00000000 = CDec(error)
как 0x00000000 и 0xFFFFFFFF записать в формате &H?

адрес1+$1C+$20+$464 - Я так понимаю $ это &H? Есле да то как мне к указателю на переменную в области памяти прибавить "&H1C"?

Это записывается как *(*(*((*x)+a) + b)+c)

Если не трудно пожалуйста напишите пример с любыми адресами, мне легче будет разобраться.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: чтение данных с процесса

Сообщение Хакер » 13.12.2011 (Вт) 19:21

Vadim_n писал(а):как 0x00000000 и 0xFFFFFFFF записать в формате &H?

&h0 и &hFFFFFFFF. Это так сложно?

Vadim_n писал(а):Если не трудно пожалуйста напишите пример с любыми адресами, мне легче будет разобраться.

viewtopic.php?f=68&t=42926
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 13.12.2011 (Вт) 19:33

Vadim_n писал(а):&H14B1F4 = CDec(1356276)
0x00000000 = CDec(error)
как 0x00000000 и 0xFFFFFFFF записать в формате &H?

:shock: :shock: :shock:

0x - префикс Си, &H - префикс VB. B то и другое hex-константы.

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 24.12.2011 (Сб) 10:47

0x - префикс Си, &H - префикс VB. B то и другое hex-константы.

&h0 и &hFFFFFFFF. Это так сложно?

Спасибо теперь будет немного проще.

Код: Выделить всё
Dim str As String * 20        ' Может тут нужно 256 поставить или 2048 или массив

proce = "Прочитай память"
hwnd = FindWindow(vbNullString, proce)
GetWindowThreadProcessId hwnd, pid
pHandle = OpenProcess(PROCESS_ALL_ACCESS, 0&, pid)

    nomproce = Text1.Text                                                    ' &H913F6B8  1355372
If ReadProcessMemory(pHandle, nomproce, str, 20, 0&) Then
    Text2.Text = Asc(str)
    Text3.Text = str
End If


Этот код я так понял выводит 1 байт, если значение в памяти 50 то выводит правильно. Но есле значение 11000 то выводит короткое число, в то время как ArtMoney по то муже адресу в памяти находит это же короткое число как 1 байт, и если поставить свойства 4 байта то ArtMoney выводит как и нужно 11000.
Как прочитать 4байта, что бы вывести 11000?

В Text3.Text выводит непонятные символы иногда прорезаются отдельные слова или части слов, но не полностью нужный текст.

1355788 &H14B00C @ > 3 0
1355789 &H14B00D > 3 0
1355790 &H14B00E > 3 0
1355791 &H14B00F 3 0
1355792 &H14B010 3 0
1355793 &H14B011 0
1355794 &H14B012 0

Как прочитать текст?

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 29.12.2011 (Чт) 21:02

помогите прочитать значение в 4 байта с адресу &H14AF5C
ArtMoney (с настройкой "искать 4 байта") нашло по адресу &H14AF5C число 9589864
код который у меня находит:
&H14AF5C = 104
&H14AF5D = 84
&H14AF5E = 146
&H14AF5F = 0

помогите пожалуйста склеить эти числа чтобы получилось 9589864
или как прочитать сразу с адресу &H14AF5C число 9589864 ?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.12.2011 (Пт) 0:02

(((0*256)+146)*256+84)*256+104 = 9589864
А почему бы тебе вместо этого сразу 4 байта не читать?

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: чтение данных с процесса

Сообщение ger_kar » 30.12.2011 (Пт) 5:57

Vadim_n писал(а):помогите пожалуйста склеить эти числа чтобы получилось 9589864 или как прочитать сразу с адресу &H14AF5C число 9589864 ?
Как склеить Qwertiy тебе показал, а что касается того, как прочитать сразу, то необходимо воспользоваться ф-цией GetMem4.
Примерно так:

Код: Выделить всё
Public Declare Function GetMem4 Lib "msvbvm60" (ByVal pSrc As Long, ByVal pDst As Long) As Long

Public Function ReadMem(lngAddress) As Long
    GetMem4 lngAddress, VarPtr(ReadMem)
End Function

Вызов ф-ции, что-бы прочитать значение по адресу &H14AF5C будет следующим:
НужнаяПеременная = ReadMem(&H14AF5C)
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.12.2011 (Пт) 13:07

ger_kar писал(а):а что касается того, как прочитать сразу, то необходимо воспользоваться ф-цией GetMem4

А она может читать адресное пространство другого процесса?

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.12.2011 (Пт) 13:12

ReadProcessMemory.
Один из аргументов - число читаемых байт, вот и читай все 4 сразу.

Думаю, так:
Код: Выделить всё
Public Declare Function ReadToLong Lib "kernel32" Alias "ReadProcessMemory" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Long, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long

Public Function ReadLong(ByVal hProcess As Long, ByVal lpBaseAddress As Long) As Long
  Dim Bytes As Long, Result As Long
  ReadToLong(hProcess, lpBaseAddress, Result, 4, Bytes)
  If Bytes = 4 Then ReadLong = Result
End Function

PS: Код писал прямо тут, поэтому могут быть ошибки.
Последний раз редактировалось Qwertiy 30.12.2011 (Пт) 13:19, всего редактировалось 1 раз.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: чтение данных с процесса

Сообщение ger_kar » 30.12.2011 (Пт) 13:14

Qwertiy писал(а):А она может читать адресное пространство другого процесса?
Нет конечно. Но в вопросе
Vadim_n писал(а):или как прочитать сразу с адресу &H14AF5C число 9589864
, про то, в каком это процессе ничего не указано, по умолчанию имеется обычно свой процесс, ну по крайней мере я думал именно так.
Бороться и искать, найти и перепрятать

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 30.12.2011 (Пт) 13:21

ger_kar писал(а):по умолчанию имеется обычно свой процесс, ну по крайней мере я думал именно так.

Из названия темы же ясно. Да и из кода во всей теме...

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: чтение данных с процесса

Сообщение ger_kar » 30.12.2011 (Пт) 16:35

Qwertiy писал(а):Из названия темы же ясно.
:oops:

Ну теперь будут примеры и для своего процесса и для чужого ;)
Бороться и искать, найти и перепрятать

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 01.01.2012 (Вс) 14:13

Я сначала написал вот так:
Код: Выделить всё
Dim y1 As String
    Dim y2 As String
    Dim y3 As String
    Dim y4 As String
    Dim yk As String
If Check1.Value = 1 Then
    nomproce = Text3.Text                                                        'определить &H14AF5C = 104
    If ReadProcessMemory(pHandle, nomproce, str, 1, 0&) Then
    y1 = Asc(str)
    End If
    nomproce = "&H" & Hex(Val(CDec(Text3.Text)) + Val(1))        'определить &H14AF5D = 84
    If ReadProcessMemory(pHandle, nomproce, str, 1, 0&) Then
    y2 = Val(Asc(str)) * Val(256)
    End If
    nomproce = "&H" & Hex(Val(CDec(Text3.Text)) + Val(2))       'определить &H14AF5E = 146
    If ReadProcessMemory(pHandle, nomproce, str, 1, 0&) Then
    y3 = Val(Asc(str)) * Val(65536)
    End If
    nomproce = "&H" & Hex(Val(CDec(Text3.Text)) + Val(3))      'определить &H14AF5F = 0
    If ReadProcessMemory(pHandle, nomproce, str, 1, 0&) Then
    y4 = Val(Asc(str)) * Val(16777216)
    End If
    yk = Val(y1) + Val(y2) + Val(y3) + Val(y4)      'сложить всё и получилось 9589864
    Text5.Text = yk
End If



На счет nSize прочитал по ссылке ReadProcessMemory.
[in] Число байтов, которое читается из заданного процесса.

ставил я там 4 но неполучилось ReadProcessMemory pHandle, nomproce, str, 4, 0&
и str ставил разные Single,String,Long
Но сейчас переписал спасибо за подсказку читает хорошо 4 байта код намного короче стал!
Код: Выделить всё
nomproce = &H14AF5C
  ReadToLong pHandle, nomproce, Result, 4, Bytes
  If Bytes = 4 Then Text5.Text = Result

А вот с текстом проблемы, как прочитать текст? Ну для пробы нашел пример, чуть подправил и экспериментирую, конечно нужно читать с другого процесса не со своего.
Код: Выделить всё
Dim chislo As Long
Dim tekst As String
Dim flag As Boolean
Private Sub Command1_Click()
    Me.Caption = Text3.Text  '"proc"
    chislo = Text1.Text                     'уже прочитаное число 9589864 4байта
    Text2.Text = VarPtr(chislo)
    Text4.Text = Hex(Text2.Text)     'перевести c 10 в 16
tekst = Text5.Text                      'Text5.Text = "Test" как его прочитать? если читаю через ReadToLong то выходит 1386260
Text7.Text = VarPtr(tekst)
Text8.Text = Hex(Text7.Text)     'перевести c 10 в 16
    If Check1.Value = 1 Then flag = True Else flag = False
    Text9.Text = VarPtr(flag)
    Text10.Text = Hex(Text9.Text)     'перевести c 10 в 16 
End Sub

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 01.01.2012 (Вс) 16:10

Попробуй передавать как ByRef lpBuffer As Integer начальный элемент массива Integer'ов, а число байт в 2 раза больше количества элементов в нём. Потом используй ChrW для каждого элемента и получи строку. Думаю, должно работать.

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 05.01.2012 (Чт) 9:50

Попробуй передавать как ByRef lpBuffer As Integer

Спасибо получилось!
Код: Выделить всё
Private Declare Function ReadToLong Lib "kernel32" Alias "ReadProcessMemory" _
(ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Long, _
ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long

Private Declare Function ReadToInteger Lib "kernel32" Alias "ReadProcessMemory" _
(ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Integer, _
ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long

Private Declare Function ReadToSingle Lib "kernel32" Alias "ReadProcessMemory" _
(ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByRef lpBuffer As Single, _
ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long

Public Function ReadLong1(ByVal hProcess As Long, ByVal lpBaseAddress As Long) As Long
  Dim Result As Long
  ReadToLong hProcess, lpBaseAddress, Result, 1, Bytes
  If Bytes = 1 Then ReadLong1 = Result
End Function
Public Function ReadInteger1(ByVal hProcess As Long, ByVal lpBaseAddress As Long) As Integer
  Dim Result As Integer
  ReadToInteger hProcess, lpBaseAddress, Result, 1, Bytes
  If Bytes = 1 Then ReadInteger1 = Result
End Function
Public Function ReadSingle1(ByVal hProcess As Long, ByVal lpBaseAddress As Long) As Single
  Dim Result As Single
  ReadToSingle hProcess, lpBaseAddress, Result, 1, Bytes
  If Bytes = 1 Then ReadSingle1 = Result
End Function

Public Function ReadLong(ByVal hProcess As Long, ByVal lpBaseAddress As Long) As Long
  Dim Result As Long
  ReadToLong hProcess, lpBaseAddress, Result, 4, Bytes
  If Bytes = 4 Then ReadLong = Result
End Function
Public Function ReadInteger(ByVal hProcess As Long, ByVal lpBaseAddress As Long) As Integer
  Dim Result As Integer
  ReadToInteger hProcess, lpBaseAddress, Result, 4, Bytes
  If Bytes = 4 Then ReadInteger = Result
End Function
Public Function ReadSingle(ByVal hProcess As Long, ByVal lpBaseAddress As Long) As Single
  Dim Result As Single
  ReadToSingle hProcess, lpBaseAddress, Result, 4, Bytes
  If Bytes = 4 Then ReadSingle = Result
End Function

      nomproce = Text38.Text 
      Text40.Text = CDec(Text38.Text)
      Text39.Text = ""
      For e = 1 To 999
      DoEvents
      name = ReadInteger(pHandle, nomproce) 'прочитать 4 байтa
      Text39.Text = Text39.Text & ChrW(name)
      Text40.Text = Val(Text40.Text) + Val(2)
      nomproce = "&H" & Hex(Text40.Text)
      If 0 = ReadLong1(pHandle, nomproce) Then Exit For 'прочитать 1 байтa
      Next e


Только не найду байт указывающий количество символов в строке, в цикле читаю до пустого пока не разберусь.
Подскажите пожалуйста, как объявить и правильно вызвать функцию для записи в 1 байт и сразу в 4 байта WriteProcessMemory, и нужна для разных типов ByRef lpBuffer As Long, Integer, Single?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: чтение данных с процесса

Сообщение Хакер » 05.01.2012 (Чт) 11:45

Это верх глупости, так делать.

Надо:
Код: Выделить всё
Private Declare Function ReadProcessMemoryLib "kernel32" _
(ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, _
ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long


Vadim_n писал(а):Только не найду байт указывающий количество символов в строке, в цикле читаю до пустого пока не разберусь.

Строки — штуки сложные. Читать до посинения.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 05.01.2012 (Чт) 12:21

lpBuffer As Any,

Сейчас попробую, поэкспериментирую, спасибо за замечание.
Строки — штуки сложные. Читать до посинения.

Ну я так понял что 0 и означает конец строки

Зная значения 4х байтов по 1му байту я уже умею получить 4 байта
'4б = Val(1й) + Val(2й* 256) + Val(3й* 65536) + Val(4й* 16777216)
а вот 4х байтное значение не могу разложить и записать по одному байту.
Но в коде мне нужно писать и по 1му байту.

Как же всё таки мне поменять значение в памяти 1 байтное и 4х байтное Long, Integer, Single?

Тока пожалуйста не перенаправляйте меня на страницы с примерами на других языках типа С++ и на страницы с описание рассчитанных на профессиональных программистов или профессоров, мне трудно в них разобраться.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: чтение данных с процесса

Сообщение Хакер » 05.01.2012 (Чт) 13:27

Vadim_n писал(а):Ну я так понял что 0 и означает конец строки

Ты понимаешь фразу «читать до посинения»? Если нет, то лучше выброси свой компьютер в окно.

Vadim_n писал(а):Зная значения 4х байтов по 1му байту я уже умею получить 4 байта
'4б = Val(1й) + Val(2й* 256) + Val(3й* 65536) + Val(4й* 16777216)

Этот код неправильный. Этот подход неправильный. Правильный подход: читать сразу 4-байтовое значение, а не склеивать его побайтно. Но даже если нужно склеивать (случай 1 на 1000) — то делать это надо не так.

Vadim_n писал(а):а вот 4х байтное значение не могу разложить и записать по одному байту.

Обоснуй, зачем оно тебе нужно.

Vadim_n писал(а):Тока пожалуйста не перенаправляйте меня на страницы с примерами на других языках типа С++ и на страницы с описание рассчитанных на профессиональных программистов или профессоров, мне трудно в них разобраться.

Можно разговаривать с некомпетентным человеком.
С человеком, не проявляющим качеств, позволяющих стать компетентным, никакого разговора быть не может.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Vadim_n
Новичок
Новичок
 
Сообщения: 31
Зарегистрирован: 06.07.2009 (Пн) 17:17

Re: чтение данных с процесса

Сообщение Vadim_n » 05.01.2012 (Чт) 15:18

Ты понимаешь фразу «читать до посинения»? Если нет, то лучше выброси свой компьютер в окно.

Статью по ссылке правда не дочитал, но обязательно дочитаю.
Но даже если нужно склеивать (случай 1 на 1000) — то делать это надо не так.

Я не спорю поскольку как надо сам не знаю, но так как смог написать тоже работает, код выше был.
С человеком, не проявляющим качеств, позволяющих стать компетентным, никакого разговора быть не может.

Если человек не обладаю таким уровнем знаний в программировании и тд как у Вас, то это не значит что человек некомпетентный.
У каждого пользователя свои методы обучения, зависящие от времени и возможностей.
Всем спасибо за помощь.

ger_kar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1957
Зарегистрирован: 19.05.2011 (Чт) 19:23
Откуда: Кыргызстан, Иссык-Куль, г. Каракол

Re: чтение данных с процесса

Сообщение ger_kar » 05.01.2012 (Чт) 19:14

Vadim_n писал(а):Если человек не обладаю таким уровнем знаний в программировании и тд как у Вас, то это не значит что человек некомпетентный.У каждого пользователя свои методы обучения, зависящие от времени и возможностей.Всем спасибо за помощь.
Вставлю свои пять копеек. На мой взгляд вообще вопрос компетентности это как раз уровень знаний в какой либо области. Но каждый может достичь его разными путями и времени на это у каждого уйдет по разному, до некоторых это доходит очень быстро, а до некоторых ну очень долго, но самое главное это конечно желание эти знания получать. Что касается программирования, то как мне кажется, что программисты (настоящие) это все больные люди в хорошем смысле этого слова, потому, что если этим не заболеть, то вряд ли из человека получится программист. Нечто программирующий конечно может получиться, но не программист. Если нет определенного уровня знаний в данной области, то человек в этой области некомпетентный, и ничего обидного в этом слове нет, я сам такой и не пытаюсь этого отрицать, но как могу пытаюсь ликвидировать свои пробелы и с удовольствием читаю, правда пока только на русском, все статьи, ссылки на которые дают профессионалы. А вот игнорировать подобного рода информацию и пытаться стать профи точно не получится.
Бороться и искать, найти и перепрятать

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 19

    TopList  
cron