Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.58/19: Рейтинг темы: голосов - 19, средняя оценка - 4.58
 Аватар для Dimon_bogoduhov
127 / 62 / 2
Регистрация: 15.02.2012
Сообщений: 127

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

15.02.2012, 02:24. Показов 4048. Ответов 26
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята подскажите пожалуйста, как обратится к оперативной памяти, выделенной под указаный процес.
P.S.: Хочу сделать прогу типо артмани, но никак не могу найти про доступ к оперативной памяти. Буду очень благодарен за помощь.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.02.2012, 02:24
Ответы с готовыми решениями:

Отображение количества оперативной памяти, которое занимает указанный процесс
Как написать программу, которая будет показывать, сколько оперативной памяти занимает указанный процесс? Буду благодарен.)

Распределение оперативной памяти выделенной под программу
Здравствуйте. Помогите с объяснением некоторых тем, нигде не могу найти. №1 Целый тип данных. Даже не знаю, о чем там можно...

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

26
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
15.02.2012, 07:52
Тебе это нужно сделать на VB6?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
15.02.2012, 09:01
Лучший ответ Сообщение было отмечено как решение

Решение

Цитата Сообщение от Dimon_bogoduhov Посмотреть сообщение
очу сделать прогу типо артмани, но никак не могу найти про доступ к оперативной памяти.
Язык значения не имеет, хоть VB, хоть ещё какой, если можно юзать WIN API32!
И так, вот у нас аналог мини типо артмани. Запускаем Сапер и начинаем играть. Время неумолимо тикает, секунды идут. Запускаем наш код и нажимает кнопку Command1. Мессага покажет время, которое мы играем. После нажатия на кнопку "Ок" время сброситься в 1 сек и ты чемпион!

Visual Basic
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
Option Explicit
     
    Private Const PROCESS_VM_READ = &H10
    Private Const PROCESS_VM_WRITE = &H20
    Private Const PROCESS_VM_OPERATION = &H8
    Private Const PROCESS_VM = PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE
     
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, ByVal lpBuffer As Long, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
    Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
     
Private Sub Command1_Click()
Dim hW As Long, PId As Long, hP As Long, buf As Long, address As Long, NewTimer As Integer
      
      'Необходимо зппустить Сапер и начать играть
      hW = FindWindow("Сапер", "Сапер") ' если игра английская, то корректировать!
      Call GetWindowThreadProcessId(hW, PId)
     
      hP = OpenProcess(PROCESS_VM, 0&, PId)
      address = &H100579C ' По этому адресу у сапера время тикает
      Call ReadProcessMemory(hP, address, VarPtr(buf), 2, 0&)  'Считываем значение времени
      MsgBox buf  'после нажатия на кнопку вы увидите время игры в секундах.
      NewTimer = 1
      'А тут сбрасываем время на 1 сек - и ты  чемпион!
      Call WriteProcessMemory(hP, ByVal address, NewTimer, LenB(NewTimer), 0&)
     
End Sub

P.s. После того, как пройдут восторги от кода многие спрашивают, а как найти этот адрес, в нашем случае address = &H100579C. Вот как раз для этого и существуют программы типа артмани
Ну а если серьезно, то так же как и поступает артмани - сканировать всё адресное пространство игры, записывать в массив значения, отмечать адреса, по которым значения меняются в определённый момент времени и экспериментировать по их заморозке ( т.е. постоянной перезаписи определённого значения).
5
 Аватар для Dimon_bogoduhov
127 / 62 / 2
Регистрация: 15.02.2012
Сообщений: 127
15.02.2012, 21:02  [ТС]
Pro_grammer спасибо, ты меня очень выручил
Шарил по гуглу, одна фигня.

Добавлено через 10 часов 36 минут
Цитата Сообщение от Pro_grammer Посмотреть сообщение
address = &H100579C
Слушай, а как сделать что б считывать определённый байт?

Добавлено через 23 минуты
И еще.
Подскажите в какой системе счислений выводится число в MsgBox????
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
15.02.2012, 23:27
Цитата Сообщение от Dimon_bogoduhov Посмотреть сообщение
лушай, а как сделать что б считывать определённый байт?
Что значит определенный? Если по этому адресу лежит 2-х байтовое число, то мы его считываем. Если будет лежать 4-х байтовое, то надо будет считать 4 байта.
Правильнее написать так
Visual Basic
1
Call ReadProcessMemory(hP, address, VarPtr(buf),[B] LenB(buf)[/B], 0&)  'Считываем значение времени
Т.е. 4-й параметр( DWORD dwSize, // число передаваемых байтов)
высчитывать в зависимости от того, сколько байт лежит по данному адресу
Цитата Сообщение от Dimon_bogoduhov Посмотреть сообщение
Подскажите в какой системе счислений выводится число в MsgBox
Именно в Сапере счетчик считает секунды, соответственно и выводится кол-во секунд, в десятичной.
1
 Аватар для Dimon_bogoduhov
127 / 62 / 2
Регистрация: 15.02.2012
Сообщений: 127
16.02.2012, 20:14  [ТС]
Pro_grammer, Спасибо за помощ))

Добавлено через 30 секунд
Ну все теперь со всем розобрался))

Добавлено через 1 минуту
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Сообщение от Dimon_bogoduhov
лушай, а как сделать что б считывать определённый байт?
Что значит определенный?
Это я имел ввиду например 2000 байт с начала памяти или типо того, но я понял что проще один раз считать всю выделенную память и занести в масив,
а потом шарится по нем)

Добавлено через 20 часов 39 минут
Ещё один вопрос....
Visual Basic
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
39
40
41
42
43
44
45
46
47
48
49
50
51
Option Explicit
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Const PROCESS_VM_READ = &H10
 
Dim MyBuffer() As Byte
 
Private Sub Command1_Click()
Text1.Text = ""
Dim WindowID As Long
Dim ThreadID As Long
Dim ProcessID As Long
Dim MemoryID As Long
Dim WBytes As Long
 
Dim basar As Long
Dim hndl As Long
Dim x As Long
Dim i As Integer
Dim sz As Long
     sz = 44000000
     ProcessID = 3804
     basar = &H200000
     ReDim MyBuffer(sz - 1)
     hndl = OpenProcess(PROCESS_VM_READ, True, ProcessID)
     MemoryID = ReadProcessMemory(hndl, ByVal basar, ByVal VarPtr(MyBuffer(0)), sz, WBytes)
     CloseHandle (hndl)
      Dim value As String
      Dim value1 As String
      Dim value2 As String
      Dim value3 As String
      Dim endvalue As String
     For x = 1 To 200000 - 3
 
          value1 = Hex(MyBuffer(x))
     value2 = Hex(MyBuffer(x + 1))
     value3 = Hex(MyBuffer(x + 2))
     value = value1 & value2 & value3
    endvalue = value
    End If
         If value = text2.text Then
       For i = 0 To len(text2.text)
              Text1.Text = Text1.Text & Chr(MyBuffer(x + i))
     Next i
     Exit Sub
     End If
     Next x
End Sub
Я сделал что бы значения оперативки заносило в масив но в масив выводится ограниченое количество байт и полностю все значения оперативки не просматривают.
как мне это исправить?
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
17.02.2012, 07:43
Цитата Сообщение от Dimon_bogoduhov Посмотреть сообщение
как мне это исправить?
Надо правильно определять границы в памяти для подопытного приложения и буфер. Для этого использовать VirtualQueryEx
Вот ещё один код. Он сканирует память запущенного калькулятора, находит строку "Backspace" и заменяет её на "VB-O-Matic", что и можно увидеть по изменившейся надписи на кнопке.
До запуска кода надо положить на форму 3 лабела в левый столбик, потом 3 Текстбокса в правый столбик и кнопку снизу.
В общем разбирайся:
Visual Basic
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
'Add 3 labels, 3 textboxes and 1 commandbutton on form
 
Option Explicit
 
Private Type OSVERSIONINFO
    dwOSVersionInfoSize As Long
    dwMajorVersion As Long
    dwMinorVersion As Long
    dwBuildNumber As Long
    dwPlatformId As Long
    szCSDVersion As String * 128
End Type
 
Private Type MEMORY_BASIC_INFORMATION ' 28 bytes
    BaseAddress As Long
    AllocationBase As Long
    AllocationProtect As Long
    RegionSize As Long
    State As Long
    Protect As Long
    lType As Long
End Type
 
Private Type SYSTEM_INFO ' 36 Bytes
    dwOemID As Long
    dwPageSize As Long
    lpMinimumApplicationAddress As Long
    lpMaximumApplicationAddress As Long
    dwActiveProcessorMask As Long
    dwNumberOrfProcessors As Long
    dwProcessorType As Long
    dwAllocationGranularity As Long
    wProcessorLevel As Integer
    wProcessorRevision As Integer
End Type
 
Private Declare Function GetVersionEx Lib "kernel32" Alias "GetVersionExA" (LpVersionInformation As OSVERSIONINFO) As Long
Private Declare Function VirtualQueryEx& Lib "kernel32" (ByVal hProcess As Long, lpAddress As Any, lpBuffer As MEMORY_BASIC_INFORMATION, ByVal dwLength As Long)
Private Declare Sub GetSystemInfo Lib "kernel32" (lpSystemInfo As SYSTEM_INFO)
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal blnheritHandle As Long, ByVal dwAppProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, lpBaseAddress As Any, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
 
Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As Long) As Long
Private Declare Function GetParent Lib "user32" (ByVal hWnd As Long) As Long
Private Declare Function GetWindow Lib "user32" (ByVal hWnd As Long, ByVal wCmd As Long) As Long
Const GW_HWNDNEXT = 2
 
Private Declare Function InvalidateRect Lib "user32" (ByVal hWnd As Long, ByVal lpRect As Long, ByVal bErase As Long) As Long
Const PROCESS_VM_READ = (&H10)
Const PROCESS_VM_WRITE = (&H20)
Const PROCESS_VM_OPERATION = (&H8)
Const PROCESS_QUERY_INFORMATION = (&H400)
Const PROCESS_READ_WRITE_QUERY = PROCESS_VM_READ + PROCESS_VM_WRITE + PROCESS_VM_OPERATION + PROCESS_QUERY_INFORMATION
 
Const MEM_PRIVATE& = &H20000
Const MEM_COMMIT& = &H1000
 
 
Private Sub Command1_Click()
    Dim pid As Long, hProcess As Long, hWin As Long
    Dim lpMem As Long, ret As Long, lLenMBI As Long
    Dim lWritten As Long, CalcAddress As Long, lPos As Long
    Dim sBuffer As String
    Dim sSearchString As String, sReplaceString As String
    Dim si As SYSTEM_INFO
    Dim mbi As MEMORY_BASIC_INFORMATION
    sSearchString = Text2
    sReplaceString = Text3 & Chr(0)
    If IsWindowsNT Then 'NT store strings in RAM in UNICODE
       sSearchString = StrConv(sSearchString, vbUnicode)
       sReplaceString = StrConv(sReplaceString, vbUnicode)
    End If
    pid = Shell(Text1) 'launch application (calc.exe in this sample)
    hWin = InstanceToWnd(pid) 'get handle of launched window - only to repaint it after changes
'Open process with required access
    hProcess = OpenProcess(PROCESS_READ_WRITE_QUERY, False, pid)
    lLenMBI = Len(mbi)
'Determine applications memory addresses range
    Call GetSystemInfo(si)
    lpMem = si.lpMinimumApplicationAddress
'Scan memory
    Do While lpMem < si.lpMaximumApplicationAddress
        mbi.RegionSize = 0
        ret = VirtualQueryEx(hProcess, ByVal lpMem, mbi, lLenMBI)
        If ret = lLenMBI Then
            If ((mbi.lType = MEM_PRIVATE) And (mbi.State = MEM_COMMIT)) Then ' this block is In use by this process
                If mbi.RegionSize > 0 Then
                   sBuffer = String(mbi.RegionSize, 0)
'Read region into string
                   ReadProcessMemory hProcess, ByVal mbi.BaseAddress, ByVal sBuffer, mbi.RegionSize, lWritten
'Check if region contain search string
                   lPos = InStr(1, sBuffer, sSearchString, vbTextCompare)
                   If lPos Then
                      CalcAddress = mbi.BaseAddress + lPos
                      Me.Show
                      ret = MsgBox("Search string was found at address " & CalcAddress & "." & vbCrLf & "Do you want to replace it?", vbInformation + vbYesNo, "VB-O-Matic")
                      If ret = vbYes Then
'Replace string in virtual memory
                         Call WriteProcessMemory(hProcess, ByVal CalcAddress - 1, ByVal sReplaceString, Len(sReplaceString), lWritten)
'Redraw window
                         InvalidateRect hWin, 0, 1
                      End If
                      Exit Do
                   End If
                End If
            End If
'Increase base address for next searching cicle. Last address may overhead max Long value (Windows use 2GB memory, which is near max long value), so add Error checking
            On Error GoTo Finished
            lpMem = mbi.BaseAddress + mbi.RegionSize
            On Error GoTo 0
        Else
            Exit Do
        End If
    Loop
Finished:
   CloseHandle hProcess
End Sub
 
Private Sub Form_Load()
   Caption = "VB-O-Matic"
   Label1 = "Start application:"
   Label2 = "String to find:"
   Label3 = "Replace with:"
   Text1 = "Calc.exe"
   Text2 = "Backspace"
   Text3 = "VB-O-Matic"
   Command1.Caption = "&Launch It!"
End Sub
 
Private Function InstanceToWnd(ByVal target_pid As Long) As Long
  Dim test_hwnd As Long
  Dim test_pid As Long
  Dim test_thread_id As Long
  test_hwnd = FindWindow(ByVal 0&, ByVal 0&)
  Do While test_hwnd <> 0
   If GetParent(test_hwnd) = 0 Then
      test_thread_id = GetWindowThreadProcessId(test_hwnd, test_pid)
      If test_pid = target_pid Then
         InstanceToWnd = test_hwnd
         Exit Do
      End If
   End If
   test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
  Loop
End Function
 
Private Function IsWindowsNT() As Boolean
   Dim verinfo As OSVERSIONINFO
   verinfo.dwOSVersionInfoSize = Len(verinfo)
   If (GetVersionEx(verinfo)) = 0 Then Exit Function
   If verinfo.dwPlatformId = 2 Then IsWindowsNT = True
End Function
3
 Аватар для Dimon_bogoduhov
127 / 62 / 2
Регистрация: 15.02.2012
Сообщений: 127
19.02.2012, 00:20  [ТС]
У меня такой вопрос. Изза чего программа
Visual Basic
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
39
40
41
42
43
44
45
Public Function parol(ByVal adress As String,ByVal values As String, ByRef strparol As String) As Boolean
Dim WindowID As Long
Dim ThreadID As Long
Dim ProcessID As Long
Dim MemoryID As Long
Dim WBytes As Long
strparol = ""
Dim basar As Long
Dim hndl As Long
Dim x As Long
Dim i As Integer
Dim sz As Long
     sz = 300000
     Form1.lstProcId.ListIndex = 0
     ProcessID = Form1.lstProcId
     basar = "&H" & adress
     ReDim MyBuffer(sz - 1)
     hndl = OpenProcess(PROCESS_VM_READ, True, ProcessID)
     MemoryID = ReadProcessMemory(hndl, ByVal basar, ByVal VarPtr(MyBuffer(0)), sz, WBytes)
     CloseHandle (hndl)
     If WBytes = 0 Then
     Exit Function
     End If
      Dim value As String
      Dim value1 As String
      Dim value2 As String
      Dim value3 As String
     For x = 1 To WBytes - 3
          value1 = Hex(MyBuffer(x))
     value2 = Hex(MyBuffer(x + 1))
     value3 = Hex(MyBuffer(x + 2))
     value = value1 & value2 & value3
 
         If value = values Then
     x = x + 1094
     For i = 0 To 16
     If Hex(MyBuffer(x + i)) = 0 Then
     Exit Function
     End If
         strparol = strparol & Chr(MyBuffer(x + i))
     Next i
     Exit Function
     End If
     Next x
End Function
не видет некоторые адресов к примеру &h230000, а WinHex их видет, с чем это может быть связано???
1
19.02.2012, 01:00

Не по теме:

Цитата Сообщение от Dimon_bogoduhov Посмотреть сообщение
У меня такой вопрос. Изза чего программа
Цитата Сообщение от Dimon_bogoduhov Посмотреть сообщение
не видет некоторые адресов к примеру &h230000, а WinHex их видет, с чем это может быть связано???
Мля, люди, пишите по-русски, а то надоело уже читать это.

1
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
19.02.2012, 08:42
Цитата Сообщение от Dimon_bogoduhov Посмотреть сообщение
а их видет WinHex
Не путай мягкое с тёплым. Виртуальное адресное пространство, выделяемое для работы программы операционной системой, реальные адреса и адреса которые программа занимает на HDD - это разные вещи.
А лучше проси у автора WinHex, за $34.95 которые ты заплатил за программу ( ты ведь её не украл?) ты можешь задавать вопросы. У меня нет WinHex.
1
 Аватар для Dimon_bogoduhov
127 / 62 / 2
Регистрация: 15.02.2012
Сообщений: 127
19.02.2012, 13:51  [ТС]
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Виртуальное адресное пространство, выделяемое для работы программы операционной системой, реальные адреса и адреса которые программа занимает на HDD - это разные вещи.
Всё, я с этим благополучно розобрался. В програме есть цикл который проганяет каждый байт и заносит их в масив. По такому алгоритму программа видет все
Visual Basic
1
2
3
4
5
6
7
8
9
10
     sz = 1
     Form1.lstProcId.ListIndex = 0
     ProcessID = Form1.lstProcId
For i = 0 To 20000000
nextItem:
     adress = 2097152 + i
     hndl = OpenProcess(PROCESS_VM_READ, True, ProcessID)
     MemoryID = ReadProcessMemory(hndl, ByVal basar, ByVal VarPtr(MyBuffer(0)), sz, WBytes)
     CloseHandle (hndl)
next i
Еще раз хочу выразить свою благодарность Pro_grammerу за предложеный им исходник))
0
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 1
15.04.2024, 01:56
Код рабочий из #7, но чудное там. Не мало времени убил, чтобы понять. Во первых юникодные строки конвертируются опять же в юникод из чего получается тже юникод, только 4байтный. Память процесса считывается тоже в строку в виде 4 байтного юникода. Так происходит когда юникодная строка копируется в строку, объявленную ByVal и по пути дополнительно конвертируется в юникод.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
15.04.2024, 09:50
String нужно использовать когда работаем с utf-16 юникодом. В иных случаях нужно использовать массив байтов. Если Ansi строка передаётся по значению то можно использовать ByVal String, но это только в определённых случаях. В остальных случаях это может приводить к проблемам вот например Класс для COM-порта с поддержкой событий
1
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 1
15.04.2024, 13:34
Цитата Сообщение от The trick Посмотреть сообщение
В иных случаях нужно использовать массив байтов.
Вот допустим, надо найти значение типа Double искать также инстром? При использовании Instr с байтовыми массивами, подозреваю, будут издержки на конвертацию в строку.
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
15.04.2024, 14:07
Цитата Сообщение от Pro_grammer Посмотреть сообщение
за $34.95 которые ты заплатил за программу ( ты ведь её не украл?)
что за бред, интересно кто покупает вообще лицензионные программы? конечно все люди ставят себе пиратские копии

Добавлено через 1 минуту
testuser2, хватит апать темы
1
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
15.04.2024, 22:23
Цитата Сообщение от testuser2 Посмотреть сообщение
При использовании Instr с байтовыми массивами, подозреваю, будут издержки на конвертацию в строку.
Есть InStrB который не конвертирует.
3
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
15.04.2024, 22:26
Цитата Сообщение от The trick Посмотреть сообщение
При использовании Instr с байтовыми массивами
да, я как-то тестировал, были проблемы с этим, даже зависало по моему
2
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 1
16.04.2024, 07:38
The trick, не подскажешь, мжно как-то по одному элементу массива определить где начала массива. Я сделал код который находит указатель на Double занчение в ячейке Эксель. На сколько я понимаю (проверял это с помощью ArtMoney) все числовые значения (double) хранятся в едином массиве, как определить его начало?
Кликните здесь для просмотра всего текста
Visual Basic
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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Sub testDbl()
    Dim pDbl&
    
    pDbl = GetCellDblPtr(Cells(1, "D")) 'получаем указатель числового значения, в ячейке D1
End Sub
Private Function GetCellDblPtr(oCell As Range) As Long
    Dim pid As Long, hProcess As Long
    Dim lpMem As Long, ret As Long, lLenMBI As Long
    Dim lWritten As Long, lPos As Long, CalcAddress As Long
    Dim sBuffer As String
    Dim si As SYSTEM_INFO
    Dim mbi As MEMORY_BASIC_INFORMATION
    Dim lMaxAppAddr As Long, c& ', prevRegionSize As Long
    Dim Dbl#, Dbl2#, sDbl$, pDbl&, psDbl& 'lArrRes() As Long
    
    Dbl = RandomDouble(1563, 6567)
    Dbl2 = 1234.5678
    sDbl = String(Len(Dbl) \ 2, vbNullChar)
    pDbl = VarPtr(Dbl): psDbl = StrPtr(sDbl)
    CopyMemory ByVal psDbl, Dbl, Len(Dbl)
    oCell.Value = Dbl                 'помещаем в ячейку случайное число
    
    pid = GetCurrentProcessId
    hProcess = OpenProcess(PROCESS_READ_WRITE_QUERY, False, pid) 'Открытый процесс с необходимым доступом
    lLenMBI = Len(mbi)
    GetNativeSystemInfo si            'Определить диапазон адресов памяти приложений (по факту только начало диапазона)
    lpMem = si.lpMinimumApplicationAddress
    lMaxAppAddr = &H7FFFF1C0          'около 2Гб (макс. предела Long)
 
    'Сканирование памяти
    Do While lpMem < lMaxAppAddr
        DoEvents
'        prevRegionSize = mbi.RegionSize
        mbi.RegionSize = 0
        ret = VirtualQueryEx(hProcess, ByVal lpMem, mbi, lLenMBI) 'Извлечение сведения о диапазоне страниц в виртуальном адресном пространстве указанного процесса.
        If ret = lLenMBI Then
            If mbi.lType = MEM_PRIVATE Then
                If mbi.State = MEM_COMMIT Then                    'этот блок используется этим процессом
                    If mbi.RegionSize > 0 Then
                        sBuffer = String(mbi.RegionSize \ 2 + 1, vbNullChar)
                        'считывание региона в строку
                        ReadProcessMemory hProcess, ByVal mbi.BaseAddress, ByVal StrPtr(sBuffer), mbi.RegionSize, lWritten
                        
                        lPos = InStr(1, sBuffer, sDbl) * 2
'                        lPos = InStrB(1, sBuffer, sDbl)              'v2
                        If lPos Then
                            CalcAddress = mbi.BaseAddress + lPos - 2
'                            CalcAddress = mbi.BaseAddress + lPos - 1 'v2
                            If CalcAddress <> psDbl Then  'StrPtr(sDbl)
                            If CalcAddress <> pDbl Then   'VarPtr(Dbl)
                                ReDim Preserve lArrRes(c)
'                                lArrRes(c) = CalcAddress
                                CopyMemory ByVal CalcAddress, Dbl2, 8
                                c = c + 1 'счетчик замен
                                If oCell.Value = Dbl2 Then Exit Do
'                            Else: Stop
                            End If
'                            Else: Stop
                            End If
                        End If
                    End If
                End If
            End If
            'Увеличение базового адреса для следующего цикла поиска. Последний адрес может превышать максимальное длинное значение (Windows использует 2 ГБ памяти, что близко к максимальному длинному значению), поэтому добавлена проверка ошибок
            On Error GoTo Finished
            lpMem = mbi.BaseAddress + mbi.RegionSize
            On Error GoTo 0
        Else: Exit Do
        End If
    Loop
 
Finished:
   CloseHandle hProcess
   GetCellDblPtr = CalcAddress 'lArrRes
   Debug.Print c 'счетчик замен
End Function
Function RandomDouble(lw&, sz&) As Double 
    Static init As Boolean
    Dim sz1&
    If init Then Else init = True: Randomize
    RandomDouble = lw + sz * Rnd
End Function
0
1382 / 838 / 89
Регистрация: 08.02.2017
Сообщений: 3,510
Записей в блоге: 1
16.04.2024, 14:58
Кстати, похоже такой возможности нет. Я думал сначала просто использовать GlobalSize или HeapSize, но если указатель указывает не на начало хипа, происходит сбой. Но я кажется понял, как можно: получить массив хипов (GetProcessHeaps) и среди них выбрать ниближайший к элементу массива..
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
16.04.2024, 15:01
Это невозможно в общем случае.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.04.2024, 15:01
Помогаю со студенческими работами здесь

Процесс explorer.exe съедает 99% оперативной памяти
Приветствую, подскажите, пожалуйста, в чем может быть дело. По не понятной для меня причине время от времени процесс explorer.exe начинает...

Процесс explorer.exe съедает 99% оперативной памяти
Приветствую, подскажите, пожалуйста, в чем может быть дело. По не понятной для меня причине время от времени процесс explorer.exe начинает...

Процесс explorer.exe съедает 99% оперативной памяти
Приветствую, подскажите, пожалуйста, в чем может быть дело. По не понятной для меня причине время от времени процесс explorer.exe начинает...

Освобождение памяти, выделенной под массив
Выделяю память под массив: int (*array_1) = new int; как освободить то, что выделил? И еще вопрос: как указателю...

Очистка памяти, выделенной под небинарное дерево
Здравствуйте, реализовал небинарное дерево. Проблема с очисткой памяти. По отладчику пробегался, функция clear вроде как удаляет каждый...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru