Посл.ответ |
Сообщение |
Ранг: 0.0 (гость) Активность: 0=0 Статус: Участник
|
Создано: 10 апреля 2005 12:38 · Личное сообщение · #1
Заранее извиняюсь если не туда пишу
Я немогу прочитать четырёх байтное целое из оперативной памяти неродного процесса. Только однобайтное и знаковое а этого мало. Если кто знает то подскажите как узнать offset процесса по его handle или как с помощью readprocessmemory прочитать четырёх байтное целое. Заранее спасибо.
| Сообщение посчитали полезным: |
|
![](img/s9.gif) Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 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
);
| Сообщение посчитали полезным: |
![](img/s8.gif) Ранг: 631.1 (!), 62thx Активность: 0.37↘0.01 Статус: Участник Автор VB Decompiler
|
Создано: 10 апреля 2005 22:09 · Личное сообщение · #3
Ara
тебя вроде человек просил на бейсике
----- Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе! | Сообщение посчитали полезным: |
![](img/s9.gif) Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник
|
Создано: 10 апреля 2005 22:25 · Поправил: Ara · Личное сообщение · #4
GPcH пишет:
тебя вроде человек просил на бейсике
Это типа такая подъебка? Где человек написал " Ара, как сделать..."? Он не меня просил, а задал вопрос для всех. Ну тебе ж недосуг потратить 30 секунд, чтобы ответить, хотя ты знаешь васик. И как знаток, просвяти всех тогда, что смешного ты узрил в моем посте??? Может в бейсике есть какая особая API ReadProcessMemory и вызывается она с другими параметрами, отличными от приведенных? LOL.
| Сообщение посчитали полезным: |
![](img/s8.gif) Ранг: 631.1 (!), 62thx Активность: 0.37↘0.01 Статус: Участник Автор VB Decompiler
|
Создано: 10 апреля 2005 22:50 · Личное сообщение · #5
Нет, просто думаю человек может не осилить это перевести с C++ на барсик. Вот и все. И не обижайся - я тебя не подъебывал, а лишь сказал свое мнение
----- Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе! | Сообщение посчитали полезным: |
Ранг: 2.2 (гость) Активность: 0.01↘0 Статус: Участник
|
Создано: 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...
| Сообщение посчитали полезным: |
![](img/s4.gif) Ранг: 78.6 (постоянный) Активность: 0.03↘0 Статус: Участник
|
Создано: 11 апреля 2005 08:39 · Личное сообщение · #7 |
Ранг: 0.0 (гость) Активность: 0=0 Статус: Участник
|
Создано: 11 апреля 2005 14:40 · Личное сообщение · #8
Люди конечно спасибо зп деклары на ЦПП и ВБ но мне надо не это так и я умею.
Например по адресу &H12D4BBF у меня находится переменная целого типа равная 1000. ReadProcessMemory прочитает это как 232. Как этого избежать?
| Сообщение посчитали полезным: |
Ранг: 45.7 (посетитель) Активность: 0.05↘0 Статус: Участник 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
Это был пример но дело в том что эта функция читает только один байт и со знаком. ![](img/smilies/s4.gif) А как по другому сделать я не знаю
| Сообщение посчитали полезным: |
Ранг: 45.7 (посетитель) Активность: 0.05↘0 Статус: Участник 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.05↘0 Статус: Участник EBFE
|
Создано: 12 апреля 2005 19:56 · Личное сообщение · #14
=Naos= пишет:
Принимаются предложения по оптимизации кода
переписать все на ассемблере
| Сообщение посчитали полезным: |
Ранг: 2.2 (гость) Активность: 0.01↘0 Статус: Участник
|
Создано: 13 апреля 2005 23:05 · Личное сообщение · #15
Нифига не понял что за код ты понаписал ![](img/smilies/s1.gif) Но думаю что вот это именно с указанной декларацией работать будет:
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.01↘0 Статус: Участник
|
Создано: 13 апреля 2005 23:09 · Личное сообщение · #16
PPS
Виной всему тип "Any" в декларации API, имхо. Если отсылать параметр ByVal param то будет в функцию передано значение, иначе (по умолчанию используется ByRef) параметр будет засчитан как указатель...
| Сообщение посчитали полезным: |
Ранг: 0.0 (гость) Активность: 0=0 Статус: Участник
|
Создано: 14 апреля 2005 10:45 · Личное сообщение · #17
2sne
Твоя функция почти работает ![](img/smilies/s5.gif) только вместо значения 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.05↘0 Статус: Участник EBFE
|
Создано: 14 апреля 2005 12:06 · Личное сообщение · #20
запросто
invoke ReadProcessMemory,pHandle,401000h, addr buffer, 4, NULL
| Сообщение посчитали полезным: |
Ранг: 2.2 (гость) Активность: 0.01↘0 Статус: Участник
|
Создано: 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.01↘0 Статус: Участник
|
Создано: 04 мая 2005 18:58 · Личное сообщение · #23
Рад за тебя
| Сообщение посчитали полезным: |
Ранг: 39.1 (посетитель) Активность: 0.03↘0 Статус: Участник
|
Создано: 05 мая 2005 04:34 · Личное сообщение · #24
ты никогда не поймёшь до конца как это работает, пока не начнёшь использовать ассемблер
| Сообщение посчитали полезным: |
![](img/s6.gif) Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 05 мая 2005 05:59 · Личное сообщение · #25
Столько любителей ВБ. Оказывается))
Автору топика отвечу:
1. Ты сколька байт считываеш?? Ты говариш целое число, но чило может быть Single, Integer, Long. По тому что ты написал сразу видно что ты считал первый байт четырех байтного числа.
----- have a nice day | Сообщение посчитали полезным: |
![](img/s6.gif) Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 05 мая 2005 06:00 · Поправил: Nimnul · Личное сообщение · #26
Мля не удержался вот и мои исходнткт на ВБ.))
В аттаче.
----- have a nice day | Сообщение посчитали полезным: |
![](img/s6.gif) Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 05 мая 2005 06:05 · Личное сообщение · #27
Когда правку делаеш помойму аттач нельзя делать ccff_mem.rar
----- have a nice day | Сообщение посчитали полезным: |
Ранг: 2.2 (гость) Активность: 0.01↘0 Статус: Участник
|
Создано: 05 мая 2005 22:40 · Личное сообщение · #28
2Nimnul, жаль тебя разочаровывать но помимо VB пишу активно c использованием пакета masm32, по работе юзаю дельфи, иногда VC/C++ Builder.
Скрывать не стану, больше всего люблю VB6 - быстрота разработки, удобство отладки, работа с COM - сделана лучше чем где-либо из вышеперечисленного!
| Сообщение посчитали полезным: |
Ранг: 2.2 (гость) Активность: 0.01↘0 Статус: Участник
|
Создано: 05 мая 2005 22:47 · Личное сообщение · #29
PS
Nimnul, для таких задач использовать VB.NET - извращение, имхо
| Сообщение посчитали полезным: |
![](img/s6.gif) Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet
|
Создано: 06 мая 2005 03:33 · Поправил: Nimnul · Личное сообщение · #30
Зря ты так думаеш, тама есть встроенные функции перечисления всех модулей, ихние базовые адреса и адреса точек входа и др. навороты оч. удобно. + ко всему проги .Net можна неплохо защитить, в отличии от VB6, С+ и Делфи ;)
----- have a nice day | Сообщение посчитали полезным: |