| Посл.ответ | 
Сообщение | 
 Ранг: 0.0 (гость) Активность: 0=0 Статус: Участник 
 
 | 
Создано: 10 апреля 2005 12:38   · Личное сообщение ·  #1 
Заранее извиняюсь если не туда пишу
 Я немогу прочитать четырёх байтное целое из оперативной памяти неродного процесса. Только однобайтное и знаковое а этого мало. Если кто знает то подскажите как узнать offset процесса по его handle или как с помощью readprocessmemory прочитать четырёх байтное целое. Заранее спасибо.
   | Сообщение посчитали полезным:  | 
 | 
  Ранг: 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
    );
   | Сообщение посчитали полезным:  | 
  Ранг: 631.1 (!), 62thx Активность: 0.37↘0.01 Статус: Участник Автор VB Decompiler 
 
 | 
Создано: 10 апреля 2005 22:09   · Личное сообщение ·  #3 
Ara
тебя вроде человек просил на бейсике   
----- Никогда не делай то, что возможно. Стремись сделать то что невозможно впринципе!  | Сообщение посчитали полезным:   | 
  Ранг: 1288.1 (!!!!), 273thx Активность: 1.29↘0 Статус: Участник 
 
 | 
Создано: 10 апреля 2005 22:25 · Поправил: Ara   · Личное сообщение ·  #4 
GPcH пишет:
 тебя вроде человек просил на бейсике
Это типа такая подъебка? Где человек написал " Ара, как сделать..."? Он не меня просил, а задал вопрос для всех. Ну тебе ж недосуг потратить 30 секунд, чтобы ответить, хотя ты знаешь васик. И как знаток, просвяти всех тогда, что смешного ты узрил в моем посте??? Может в бейсике есть какая особая API ReadProcessMemory и вызывается она с другими параметрами, отличными от приведенных? LOL.
   | Сообщение посчитали полезным:   | 
  Ранг: 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...
   | Сообщение посчитали полезным:  | 
  Ранг: 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 
Это был пример но дело в том что эта функция читает только один байт и со знаком.    А как по другому сделать я не знаю
   | Сообщение посчитали полезным:  | 
 Ранг: 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 
Нифига не понял что за код ты понаписал    Но думаю что вот это именно с указанной декларацией работать будет:
 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
 Твоя функция почти работает   только вместо значения 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 
ты никогда не поймёшь до конца как это работает, пока не начнёшь использовать ассемблер
   | Сообщение посчитали полезным:  | 
  Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet 
 
 | 
Создано: 05 мая 2005 05:59   · Личное сообщение ·  #25 
Столько любителей ВБ. Оказывается))
 Автору топика отвечу:
 1. Ты сколька байт считываеш?? Ты говариш целое число, но чило может быть Single, Integer, Long. По тому что ты написал сразу видно что ты считал первый байт четырех байтного числа.
 ----- have a nice day  | Сообщение посчитали полезным:  | 
  Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet 
 
 | 
Создано: 05 мая 2005 06:00 · Поправил: Nimnul   · Личное сообщение ·  #26 
Мля не удержался вот и мои исходнткт на ВБ.))
 В аттаче.
 ----- have a nice day  | Сообщение посчитали полезным:  | 
  Ранг: 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 - извращение, имхо
   | Сообщение посчитали полезным:  | 
  Ранг: 218.9 (наставник), 42thx Активность: 0.16↘0 Статус: Участник dotnet 
 
 | 
Создано: 06 мая 2005 03:33 · Поправил: Nimnul   · Личное сообщение ·  #30 
Зря ты так думаеш, тама есть встроенные функции перечисления всех модулей, ихние базовые адреса и адреса точек входа и др. навороты оч. удобно. + ко всему проги .Net можна неплохо защитить, в отличии от VB6, С+ и Делфи ;)
 ----- have a nice day  | Сообщение посчитали полезным:  |