Сейчас на форуме: Magister Yoda, rtsgreg1989 (+7 невидимых)

 eXeL@B —› Основной форум —› Microsoft Visual Basic vs ReadProcessMemory
. 1 . 2 . >>
Посл.ответ Сообщение

Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 10 апреля 2005 12:38
· Личное сообщение · #1

Заранее извиняюсь если не туда пишу
Я немогу прочитать четырёх байтное целое из оперативной памяти неродного процесса. Только однобайтное и знаковое а этого мало. Если кто знает то подскажите как узнать offset процесса по его handle или как с помощью readprocessmemory прочитать четырёх байтное целое. Заранее спасибо.




Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 10 апреля 2005 14:54
· Личное сообщение · #2

BOOL ReadProcessMemory(

HANDLE hProcess, // handle of the process whose memory is read
LPCVOID lpBaseAddress, // address to start reading
LPVOID lpBuffer, // address of buffer to place read data
DWORD nSize, // number of bytes to read
LPDWORD lpNumberOfBytesRead // address of number of bytes read
);




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 10 апреля 2005 22:09
· Личное сообщение · #3

Ara
тебя вроде человек просил на бейсике

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!





Ранг: 1288.1 (!!!!), 273thx
Активность: 1.290
Статус: Участник

Создано: 10 апреля 2005 22:25 · Поправил: Ara
· Личное сообщение · #4

GPcH пишет:
тебя вроде человек просил на бейсике

Это типа такая подъебка? Где человек написал " Ара, как сделать..."? Он не меня просил, а задал вопрос для всех. Ну тебе ж недосуг потратить 30 секунд, чтобы ответить, хотя ты знаешь васик. И как знаток, просвяти всех тогда, что смешного ты узрил в моем посте??? Может в бейсике есть какая особая API ReadProcessMemory и вызывается она с другими параметрами, отличными от приведенных? LOL.




Ранг: 631.1 (!), 62thx
Активность: 0.370.01
Статус: Участник
Автор VB Decompiler

Создано: 10 апреля 2005 22:50
· Личное сообщение · #5

Нет, просто думаю человек может не осилить это перевести с C++ на барсик. Вот и все. И не обижайся - я тебя не подъебывал, а лишь сказал свое мнение

-----
Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!




Ранг: 2.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 11 апреля 2005 00:19
· Личное сообщение · #6

Private Declare Function ReadProcessMemory Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long

Декларация-то я думаю затруднений не вызовет... Лучше бы ты показал код как вызываешь эту API...




Ранг: 78.6 (постоянный)
Активность: 0.030
Статус: Участник

Создано: 11 апреля 2005 08:39
· Личное сообщение · #7

вот пример
webfile.ru/253760

4205_ReadProcessMemory.rar



Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 апреля 2005 14:40
· Личное сообщение · #8

Люди конечно спасибо зп деклары на ЦПП и ВБ но мне надо не это так и я умею.
Например по адресу &H12D4BBF у меня находится переменная целого типа равная 1000. ReadProcessMemory прочитает это как 232. Как этого избежать?



Ранг: 45.7 (посетитель)
Активность: 0.050
Статус: Участник
EBFE

Создано: 11 апреля 2005 15:19 · Поправил: dMNt
· Личное сообщение · #9

232h=562
3E8h=1000
не оттуда ты переменную читаешь
да и вообще адрес на стек похож оч. сильно



Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 апреля 2005 16:19 · Поправил: =Naos=
· Личное сообщение · #10

Ты не так понял :
1000=3E8h
232=E8h
Тройка теряется я вообще подозреваю что тут причастна функция ReadValue но у меня не получается её правильно заюзать



Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 11 апреля 2005 16:40 · Поправил: =Naos=
· Личное сообщение · #11

Это был пример но дело в том что эта функция читает только один байт и со знаком. А как по другому сделать я не знаю



Ранг: 45.7 (посетитель)
Активность: 0.050
Статус: Участник
EBFE

Создано: 11 апреля 2005 17:28
· Личное сообщение · #12

нублин
читай 2 байта, а не 1



Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 12 апреля 2005 19:24 · Поправил: =Naos=
· Личное сообщение · #13

Решение было найдено!!!
Выглядит примерно так:

Function GetValue(pHandle As Long, lpBaseAdress As Long, nSize As Byte) As Long

Dim bi As Byte
Dim sTemp As String * 1
Dim nValue As Long
For bi = 0 To nSize - 1
ReadProcessMemory pHandle, lpBaseAdress + bi, sTemp, 1, 0&
If bi > 0 Then
nValue = nValue + Asc(sTemp) * 16 ^ (bi + 1)
Else
nValue = Asc(sTemp)
End If
Next bi
GetValue = nValue
End Function


Принимаются предложения по оптимизации кода



Ранг: 45.7 (посетитель)
Активность: 0.050
Статус: Участник
EBFE

Создано: 12 апреля 2005 19:56
· Личное сообщение · #14

=Naos= пишет:
Принимаются предложения по оптимизации кода

переписать все на ассемблере



Ранг: 2.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 13 апреля 2005 23:05
· Личное сообщение · #15

Нифига не понял что за код ты понаписал Но думаю что вот это именно с указанной декларацией работать будет:

Private Declare Function ReadProcessMemory Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long

Function GetValue(ByVal pHandle As Long, ByVal lpBaseAdress As Long, ByVal nSize As Byte) As Long
Call ReadProcessMemory(pHandle, ByVal lpBaseAdress, GetValue, 4&, ByVal 0&)
End Function

В GetValue получаем по-любому число со знаком в VB иных нет...



Ранг: 2.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 13 апреля 2005 23:09
· Личное сообщение · #16

PPS
Виной всему тип "Any" в декларации API, имхо. Если отсылать параметр ByVal param то будет в функцию передано значение, иначе (по умолчанию используется ByRef) параметр будет засчитан как указатель...



Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 апреля 2005 10:45
· Личное сообщение · #17

2sne

Твоя функция почти работает только вместо значения 12345678 по адресу &H12E0BCC она мне вернула 0. Но в моей тоже есть ошибки. Скоро исправлю.

кста вот код для записи если кому надо

Function WriteValue(pHandle As Long, lpBaseAdress As Long, lValue As Long, bSize As Long)

Dim bi As Byte
Dim sTemp As String * 4
Dim sValue As String
sValue = Hex(lValue)
For bi = 0 To bSize - 1
If Len(sValue) - bi * 2 - 2 >= 0 Then
sTemp = Chr(Val("&H" + Mid(sValue, Len(sValue) - bi * 2 - 1, 2)))
ElseIf (Len(sValue) - bi * 2 = 1) Then
sTemp = Chr(Val("&H" + Mid(sValue, Len(sValue) - bi * 2, 1)))
Else
sTemp = Chr(0)
End If
WriteProcessMemory pHandle, lpBaseAdress + bi, sTemp, 1, 1&
Next bi
End Function


Принимаются предложения по оптимизации кода



Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 апреля 2005 10:48
· Личное сообщение · #18

2dMNt
Заманчивое предложение,может напишешь?



Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 14 апреля 2005 11:09
· Личное сообщение · #19

Первая функция изменена и работает значительно лучше(без глюков,кажется) вот новая

Function GetValue(pHandle As Long, lpBaseAdress As Long, bSize As Byte) As Long

Dim bi As Byte
Dim sTemp As String * 1
Dim sValue As String
Dim lValue As Long
For bi = 0 To bSize - 1
ReadProcessMemory pHandle, lpBaseAdress + bSize - bi - 1, sTemp, 1, 0&
If bi > 0 Then
sValue = sValue + Hex(Asc(sTemp))
Else
sValue = Hex(Asc(sTemp))
End If
Next bi
GetValue = Val("&H" + sValue)
End Function




Ранг: 45.7 (посетитель)
Активность: 0.050
Статус: Участник
EBFE

Создано: 14 апреля 2005 12:06
· Личное сообщение · #20

запросто
invoke ReadProcessMemory,pHandle,401000h, addr buffer, 4, NULL




Ранг: 2.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 14 апреля 2005 15:58
· Личное сообщение · #21

Вот я тоже попробовал запись... Замена текста BackSpace в калькуляторе на Hello, вот только адрес на разных компах разный

Option Explicit


Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef lpdwProcessId As Long) As Long

Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)

Private Declare Function OpenProcess Lib "kernel32.dll" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

Private Declare Function WriteProcessMemory Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpBaseAddress As Any, ByRef lpBuffer As Any, ByVal nSize As Long, ByRef lpNumberOfBytesWritten As Long) As Long
Private Declare Function VirtualQueryEx Lib "kernel32.dll" (ByVal hProcess As Long, ByRef lpAddress As Any, ByRef lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long) As Long

Private Type MEMORY_BASIC_INFORMATION
BaseAddress As Long
AllocationBase As Long
AllocationProtect As Long
RegionSize As Long
State As Long
Protect As Long
lType As Long
End Type

Private Const STANDARD_RIGHTS_REQUIRED As Long = &HF0000
Private Const SYNCHRONIZE As Long = &H100000
Private Const PROCESS_ALL_ACCESS As Long = (STANDARD_RIGHTS_REQUIRED Or SYNCHRONIZE Or &HFFF)

Sub Main()
Dim hwnd As Long, _
hProcess As Long, _
sStr As String

Dim MI As MEMORY_BASIC_INFORMATION

sStr = StrConv("Hello", vbUnicode) & vbNullChar

hwnd = FindWindow(vbNullString, "Калькулятор")

If hwnd = 0& Then
MsgBox "calc.exe не запущен..."
Exit Sub
End If

Call GetWindowThreadProcessId(hwnd, hProcess)
hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0&, hProcess)

Call VirtualQueryEx(hProcess, ByVal &H959E2, MI, Len(MI))
Call WriteProcessMemory(hProcess, ByVal &H959E2, ByVal sStr, Len(sStr), ByVal 0&)

Call CloseHandle(hProcess)
End Sub




Ранг: 0.0 (гость)
Активность: 0=0
Статус: Участник

Создано: 02 мая 2005 10:38
· Личное сообщение · #22

Ты читаешь строку и пишешь строку с этим проблем не возникало, да и немного подумав над оргонизацией озу во всём разобрался, не зря естьправило "младший байт по старшему адресу"



Ранг: 2.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 04 мая 2005 18:58
· Личное сообщение · #23

Рад за тебя



Ранг: 39.1 (посетитель)
Активность: 0.030
Статус: Участник

Создано: 05 мая 2005 04:34
· Личное сообщение · #24

ты никогда не поймёшь до конца как это работает, пока не начнёшь использовать ассемблер




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 05 мая 2005 05:59
· Личное сообщение · #25

Столько любителей ВБ. Оказывается))

Автору топика отвечу:
1. Ты сколька байт считываеш?? Ты говариш целое число, но чило может быть Single, Integer, Long. По тому что ты написал сразу видно что ты считал первый байт четырех байтного числа.

-----
have a nice day





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 05 мая 2005 06:00 · Поправил: Nimnul
· Личное сообщение · #26

Мля не удержался вот и мои исходнткт на ВБ.))
В аттаче.

-----
have a nice day





Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 05 мая 2005 06:05
· Личное сообщение · #27

Когда правку делаеш помойму аттач нельзя делать

ccff_mem.rar

-----
have a nice day




Ранг: 2.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 05 мая 2005 22:40
· Личное сообщение · #28

2Nimnul, жаль тебя разочаровывать но помимо VB пишу активно c использованием пакета masm32, по работе юзаю дельфи, иногда VC/C++ Builder.

Скрывать не стану, больше всего люблю VB6 - быстрота разработки, удобство отладки, работа с COM - сделана лучше чем где-либо из вышеперечисленного!



Ранг: 2.2 (гость)
Активность: 0.010
Статус: Участник

Создано: 05 мая 2005 22:47
· Личное сообщение · #29

PS
Nimnul, для таких задач использовать VB.NET - извращение, имхо




Ранг: 218.9 (наставник), 42thx
Активность: 0.160
Статус: Участник
dotnet

Создано: 06 мая 2005 03:33 · Поправил: Nimnul
· Личное сообщение · #30

Зря ты так думаеш, тама есть встроенные функции перечисления всех модулей, ихние базовые адреса и адреса точек входа и др. навороты оч. удобно. + ко всему проги .Net можна неплохо защитить, в отличии от VB6, С+ и Делфи ;)

-----
have a nice day



. 1 . 2 . >>
 eXeL@B —› Основной форум —› Microsoft Visual Basic vs ReadProcessMemory
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати