Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Как получить TVM_GETITEM дерева 64-битного процесса

10.05.2023, 16:14. Показов 1797. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как получить TVM_GETITEM дерева 64-битного процесса? Из своего 32-битного процесса на VB6.
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.05.2023, 16:14
Ответы с готовыми решениями:

Получить список модулей 64-битного процесса из 32-битной программы
Всех с наступившим Новым Годом! В своей программе мне нужно получить список модулей загруженных в любой другой процесс. Сама программа...

Как прочитать командную строку запуска 64-битного процесса, кодом на VB6
Помогите, пожалуйста, разобраться с очень непростой задачей. Мне необходимо из своего приложения на VB6 считывать командные строки запуска...

Определить разрядность windows из 32-битного процесса
нужно определить разрядность операционной системы из 32-битного процесса нашел такой кусок кода, но он показывает 32 бита в 64битной...

32
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
10.05.2023, 16:18  [ТС]
Итак, запускаю 64-битный regedit это первое. Второе структуру поменял на:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Type TVITEM   ' was TV_ITEM
  mask As Long
  hItem As Long
  State As Long
  stateMask As Long
  pszText As Currency
  cchTextMax As Long
  iImage As Long
  iSelectedImage As Long
  cChildren As Long
  lParam As Long
End Type
На As Currency вместо As Long как раньше. Потом (короче вот весь листинг):

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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
Option Explicit
' *--------------------------------------------*
' | Программа RegJumpHack                      |
' | Версия 1.2                                 |
' | Copyright (c) 10.05.2023 by HackerVlad     |
' | e-mail: vladislavpeshkov@ya.ru             |
' *--------------------------------------------*
 
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function ShellExecute Lib "shell32" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) 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 WaitForInputIdle Lib "user32" (ByVal hProcess As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function VirtualAllocEx Lib "kernel32.dll" (ByVal hProcess As Long, lpAddress As Any, ByRef dwSize As Long, ByVal flAllocationType As Long, ByVal flProtect As Long) As Long
Private Declare Function WriteProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function ReadProcessMemory Lib "kernel32" (ByVal hProcess As Long, ByVal lpBaseAddress As Long, lpBuffer As Any, ByVal nSize As Long, lpNumberOfBytesWritten As Long) As Long
Private Declare Function VirtualFreeEx Lib "kernel32.dll" (ByVal hProcess As Long, ByVal lpAddress As Long, ByRef dwSize As Long, ByVal dwFreeType As Long) As Long
Private Declare Function SendMessageW Lib "user32" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Sub PutMem4 Lib "msvbvm60" (Destination As Any, Value As Any)
 
Private Const INFINITE = -1
Private Const MEM_COMMIT = &H1000&
Private Const PAGE_READWRITE = 4&
Private Const PROCESS_QUERY_INFORMATION = 1024
Private Const PROCESS_VM_OPERATION = &H8
Private Const PROCESS_VM_READ = 16
Private Const PROCESS_VM_WRITE = &H20
Private Const MEM_RELEASE = &H8000&
Private Const TVIS_EXPANDED = &H20
 
Private Type TVITEM   ' was TV_ITEM
  mask As Long
  hItem As Long
  State As Long
  stateMask As Long
  pszText As Currency
  cchTextMax As Long
  iImage As Long
  iSelectedImage As Long
  cChildren As Long
  lParam As Long
End Type
 
Sub CollapseVBIDETree()
    Dim hwndVBIDE As Long, hwndVBAProj As Long, hwndTV As Long
    Dim hwndCurrent As Long, hwndChildCurrent As Long
    Dim bSuccessModule As Boolean, bSuccessElse As Boolean, sNodeName As String
 
    'Find the handle of the VBEIDE window, down to the treeview in the project window
    hwndVBIDE = FindWindow("wndclass_desked_gsk", vbNullString)             'VBIDE Window
    hwndVBAProj = FindWindowEx(hwndVBIDE, 0&, "PROJECT", vbNullString)      'The Project - VBAProject Window
    hwndTV = FindWindowEx(hwndVBAProj, 0&, "SysTreeView32", vbNullString)   'The Treeview in the VBAProject Window
 
    'Get the handle of the Root of the Treeview
    hwndCurrent = TreeView_GetRoot(hwndTV)
 
    'Loop through all the children of the treeview.  This is all the current VBA Projects.
    'We can loop through until there are none left and a handle of zero is return
    Do While hwndCurrent <> 0
        sNodeName = GetTVItemText(hwndTV, hwndCurrent)
        Print sNodeName
        
        'Get the first child in the current project which is the 'Microsoft Excel Objects'
        hwndChildCurrent = TreeView_GetChild(hwndTV, hwndCurrent)
        'Set up a boolean to check if there is a 'Modules' child.  If not, we'll collapse the whole project
        bSuccessModule = False
 
        'Loop through all the child nodes to find the 'Modules' node
        Do While hwndChildCurrent <> 0
            'Get the name of the node
            sNodeName = GetTVItemText(hwndTV, hwndChildCurrent)
            
            Debug.Print sNodeName
            
            'If we find the Modules node then Expand it and flag it
            If sNodeName = "Modules" Then
                bSuccessModule = TreeView_Expand(hwndTV, hwndChildCurrent, TVE_EXPAND)
            Else
            'Otherwise collapse it
                bSuccessElse = TreeView_Expand(hwndTV, hwndChildCurrent, TVE_COLLAPSE)
            End If
            hwndChildCurrent = TreeView_GetNextSibling(hwndTV, hwndChildCurrent)
        Loop
 
        'If we don't find a Modules child then collapse the entire branch for that project
        If Not bSuccessModule Then
            Call TreeView_Expand(hwndTV, hwndCurrent, TVE_COLLAPSE)
        Else
        'Some workbooks if collapsed would stay collapsed so make sure they are expanded
            Call TreeView_Expand(hwndTV, hwndCurrent, TVE_EXPAND)
        End If
 
        'Move onto the next project
        hwndCurrent = TreeView_GetNextSibling(hwndTV, hwndCurrent)
    Loop
End Sub
 
Private Sub Command1_Click()
    Dim hRegEdit As Long
    Dim hSysTreeView32 As Long
    Dim hwndCurrent As Long
    Dim hwndChildCurrent As Long
    Dim pid As Long
    Dim hProcess As Long
    Dim tVI As TVITEM
    Dim tVI_new As TVITEM
    Dim pMem As Long
    Dim pMemStr As Long
    Dim lpWritten As Long
    Dim pszText As String * 256
    Dim sNodeName As String
    Dim cls(255) As Byte
    Dim hwndChildCurrent2 As Long
    Dim Paths() As String
    Dim PathStr As String
    Dim i As Integer
    
    PathStr = Trim$(Text1.Text)
    If Right$(PathStr, 1) = "\" Then PathStr = Mid$(PathStr, 1, Len(PathStr) - 1)
    
    If InStr(1, PathStr, "_") = 0 Then
        Beep
        Exit Sub
    End If
    
    Paths = Split(PathStr, "\")
    
    ' Найти окно редактора реестра
    hRegEdit = FindWindow("RegEdit_RegEdit", vbNullString)
    
    If hRegEdit = 0 Then ' Если редактор реестра не запущен, то запустить его
        ' Функция ShellExecute, в отличии от CreateProcess, позволяет запускать программы которые
        ' находятся в пропатченых каталогах (из всех каталогов переменной окружения среды PATH),
        ' таким образом, нам даже не надо вычислять каталог Windows и где лежит этот regedit.exe
        ShellExecute 0, "Open", "regedit.exe", vbNullString, vbNullString, vbNormalFocus
        
        Do ' Ожидаем появления окна
            hRegEdit = FindWindow("RegEdit_RegEdit", vbNullString)
        Loop While hRegEdit = 0 ' Выполнять цикл до тех пор пока не будет найдено искомое окно
        
        GetWindowThreadProcessId hRegEdit, pid ' Вычисляем PID процесса regedit
        hProcess = OpenProcess(PROCESS_QUERY_INFORMATION Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, pid)  ' Открываем процесс на полный доступ
        WaitForInputIdle hProcess, INFINITE ' Ожидаем окончательной загрузки программы regedit
    Else ' RegEdit уже был запущен
        GetWindowThreadProcessId hRegEdit, pid ' Вычисляем PID процесса regedit
        hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, pid)  ' Открываем процесс на полный доступ
    End If
    
    ' Найти дерево SysTreeView32 в окне реестра
    hSysTreeView32 = FindWindowEx(hRegEdit, ByVal 0&, "SysTreeView32", vbNullString)
    
    hwndCurrent = TreeView_GetRoot(hSysTreeView32) ' Получить дескриптор корня дерева
    
    Do While hwndCurrent <> 0 ' Получить доступ к TVM_GETITEM другого процесса
        ' Создать две страницы памяти: одну для структуры, другую для строки
        pMem = VirtualAllocEx(hProcess, ByVal 0&, 0, MEM_COMMIT, PAGE_READWRITE)
        pMemStr = VirtualAllocEx(hProcess, ByVal 0&, 0, MEM_COMMIT, PAGE_READWRITE)
        
        tVI.mask = TVIF_TEXT
        tVI.hItem = hwndCurrent
        tVI.pszText = pMemStr
        tVI.cchTextMax = 255
        
        'PutMem4 tVI.pszText, pMemStr
        
        Debug.Print "WriteProcessMemory: " & WriteProcessMemory(hProcess, pMem, tVI, Len(tVI), lpWritten) ' Записать в память процесса структуру tVI
        Debug.Print lpWritten
        Debug.Print "SendMessageW: " & SendMessageW(hSysTreeView32, TVM_GETITEM, 0, pMem) ' Послать запрос на определение текса ветки дерева
        'MsgBox Err.LastDllError
        'ReadProcessMemory hProcess, pMemStr, ByVal pszText, MAX_ITEM, 0&
        'sNodeName = GetStrFromBufferA(pszText)
        
        'hwndChildCurrent = TreeView_GetChild(hSysTreeView32, hwndCurrent) ' Открыть корень дерева "Компьютер"
        
'        Do While hwndChildCurrent <> 0 ' Начать перебор первичных кустов главного корневого узла "Компьютер"
'            tVI.hItem = hwndChildCurrent
'            WriteProcessMemory hProcess, pMem, tVI, Len(tVI), lpWritten ' Записать в память процесса структуру tVI
'            WriteProcessMemory hProcess, pMemStr, ByVal VarPtr(cls(0)), MAX_ITEM, lpWritten ' Стереть старые данные
'
'            SendMessageW hSysTreeView32, TVM_GETITEM, 0, pMem ' Послать запрос на определение текса ветки дерева
'            ReadProcessMemory hProcess, pMemStr, ByVal pszText, MAX_ITEM, 0&
'            ReadProcessMemory hProcess, pMem, tVI_new, Len(tVI_new), 0& ' Получить новое состояние
'            sNodeName = GetStrFromBufferA(pszText)
'
'            If StrComp(sNodeName, Paths(0), vbTextCompare) = 0 Then ' Если это первичный ключ
'                TreeView_Expand hSysTreeView32, hwndChildCurrent, TVE_EXPAND ' Открыть первичный ключ
'
'                If UBound(Paths) > 0 Then
'                    For i = 1 To UBound(Paths)
'                        hwndChildCurrent2 = TreeView_GetChild(hSysTreeView32, IIf(i = 1, hwndChildCurrent, hwndChildCurrent2))
'
'                        Do While hwndChildCurrent2 <> 0
'                            tVI.hItem = hwndChildCurrent2
'                            WriteProcessMemory hProcess, pMem, tVI, Len(tVI), lpWritten ' Записать в память процесса структуру tVI
'                            WriteProcessMemory hProcess, pMemStr, ByVal VarPtr(cls(0)), MAX_ITEM, lpWritten ' Стереть старые данные
'
'                            SendMessageW hSysTreeView32, TVM_GETITEM, 0, pMem ' Послать запрос на определение текса ветки дерева
'                            ReadProcessMemory hProcess, pMemStr, ByVal pszText, MAX_ITEM, 0&
'                            sNodeName = GetStrFromBufferA(pszText)
'
'                            If StrComp(sNodeName, Paths(i), vbTextCompare) = 0 Then ' Если это глубинный ключ
'                                TreeView_Expand hSysTreeView32, hwndChildCurrent2, TVE_EXPAND ' Открыть глубинный ключ
'                                If i = UBound(Paths) Then
'                                    ' В самом конце выделить нужный элемент дерева
'                                    WaitForInputIdle hProcess, INFINITE
'                                    SendMessageW hSysTreeView32, TVM_SELECTITEM, TVGN_CARET, hwndChildCurrent2
'                                    SendMessageW hSysTreeView32, TVM_SELECTITEM, TVGN_FIRSTVISIBLE, hwndChildCurrent2
'                                End If
'
'                                Exit Do ' Для ускорения процедуры, мы не будем перебирать дальше список уже неинтересуемых нами параметров
'                            End If
'
'                            hwndChildCurrent2 = TreeView_GetNextSibling(hSysTreeView32, hwndChildCurrent2)
'                        Loop
'                    Next
'                End If
'            Else
'                If (tVI_new.State And TVIS_EXPANDED) <> 0 Then ' Если главный куст дерева открыт
'                    TreeView_Expand hSysTreeView32, hwndChildCurrent, TVE_COLLAPSE ' Послать запрос на закрытие главноего куста
'                End If
'            End If
'
'            hwndChildCurrent = TreeView_GetNextSibling(hSysTreeView32, hwndChildCurrent)
'        Loop
        
        hwndCurrent = TreeView_GetNextSibling(hSysTreeView32, hwndCurrent)
    Loop
    
    ' Освободить память
    VirtualFreeEx hProcess, pMem, ByVal 0&, MEM_RELEASE
    VirtualFreeEx hProcess, pMemStr, ByVal 0&, MEM_RELEASE
    CloseHandle hProcess
End Sub
 
Private Sub Command2_Click()
    ' А эта процедурка сворачивает дерево в VB IDE с проектами и формами и модулями
    CollapseVBIDETree
End Sub
 
Private Sub Form_Load()
    Top = 600
    Left = Screen.Width / 2 - Me.Width / 2
End Sub
 
Private Sub Text1_KeyPress(KeyAscii As Integer)
    If KeyAscii = 13 Then
        KeyAscii = 0
        Command1_Click
    End If
End Sub
На строке SendMessage залип, помогите, пожалуйтса!
Вложения
Тип файла: zip RegJumpHack 1.2.zip (7.4 Кб, 6 просмотров)
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.05.2023, 17:00
HackerVlad, проблема тут и в структуре, она должна быть такого вида:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Private Type TVITEM   ' was TV_ITEM
  mask As Long
  lPad0 As Long
  hItem As Currency
  State As Long
  stateMask As Long
  pszText As Currency
  cchTextMax As Long
  iImage As Long
  iSelectedImage As Long
  cChildren As Long
  lParam As Currency
End Type
и в коде:
Visual Basic
1
2
3
..
PutMem4 tVI.pszText, ByVal pMemStr
..
Еще одна проблема просто так не решается, т.к. тут происходит получение hItem который 8 байтовый на 64 битной системе через SendMesage, которая может вернуть только 32 битный результат. Есть 2 пути решения, в своем процессе переключится в 64 битный режим и вызвать 64 битную версию SendMessage, либо в процессе RegEdit выделить ассемблерный код который будет давать 64 битный результат.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
10.05.2023, 17:09  [ТС]
Почему hItem нельзя оставить 32-битным?

Добавлено через 2 минуты
Я смотрел на структуру здесь: https://learn.microsoft.com/ru... rl-tvitemw
Но этот код на С не даёт особо подсказок ввиду того чтобы узнавать As Long или As Currency ставить

Добавлено через 55 секунд
Цитата Сообщение от The trick Посмотреть сообщение
hItem который 8 байтовый
Ты абсолютно уверен?

Добавлено через 43 секунды
Цитата Сообщение от The trick Посмотреть сообщение
в своем процессе переключится в 64 битный режим
Разве такое возможно в VB6)))))))))))))))))

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
либо в процессе RegEdit выделить ассемблерный код который будет давать 64 битный результат
И этого тоже не понял, если честно...
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.05.2023, 17:43
Цитата Сообщение от HackerVlad Посмотреть сообщение
Почему hItem нельзя оставить 32-битным?
Потому что в 64 битном процессе он 64 битный.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Ты абсолютно уверен?
Конечно уверен.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Разве такое возможно в VB6)))))))))))))))))
Можно.

Цитата Сообщение от HackerVlad Посмотреть сообщение
И этого тоже не понял, если честно...
Выделяется страница кода, в нее копируется 64 битный код который вызывает SendMessageW, а результат из регистра RAX раскидывается на два 32битных значения которые передаются приложению на вб.

Добавлено через 30 минут
Кстати об этом как-раз написано в документации:
Handles—Because kernel32 and user32 handles are only 32-bit significant in both 32-bit and 64-bit processes, they can be transferred between processes without a problem. However, some items that Windows defines as handles are really just wrapped pointers (for example, HTREEITEM). These "handles" will be truncated if they are passed from a 64-bit process to a 32-bit process.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
10.05.2023, 20:32  [ТС]
Я нашёл у тебя в модуле функцию Public Function CallX64 может через неё надо вызывать SendMessage?

Добавлено через 10 минут
В общем добавил в проект твой модуль modX64Call, потом написал:

Visual Basic
1
2
3
If p_SendMessageW = 0 Then
            p_SendMessageW = GetProcAddress64(GetModuleHandle64("user32.dll"), "SendMessageW")
        End If
Я что-то неправильно написал? Сразу автоматическая ошибка вылезла.

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
и вызвать 64 битную версию SendMessage
Ещё бы знать как!!!

Добавлено через 5 минут
С инициализацией тоже самое, не работает:

Visual Basic
1
2
3
4
5
If p_SendMessageW = 0 Then
            modX64Call.Initialize
            p_SendMessageW = GetProcAddress64(GetModuleHandle64("user32.dll"), "SendMessageW")
            MsgBox p_SendMessageW ' Вернёт 0
        End If
Добавлено через 45 секунд
Но работает зато GetModuleHandle64("ntdll.dll"), "NtQueryInformationProcess")

Добавлено через 23 секунды
Вот и вопрос: как вызвать 64 битную версию SendMessage???

Добавлено через 45 секунд
user64.dll же не существует, только user32 поэтому я не понимаю, честно...

Добавлено через 8 минут
Начал искать этот вопрос и нашёл вот здесь: https://www.vbforums.com/showt... ke-MS-Word

Интересный код:

Visual Basic
1
2
3
4
5
6
7
Private Type LONGLONG
    LongLow As Long
    LongHigh As Long
End Type
 
Private Declare Function SendMessage32to64 Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, _
           ByVal wMsg As Long, ByRef wParam As LONGLONG, ByRef lParam As LONGLONG) As Long
Он мне не подойдёт, случайно?

Добавлено через 5 минут
Попробовал для интереса:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Private Type LONGLONG
    LongLow As Long
    LongHigh As Long
End Type
 
Private Declare Function SendMessage32to64 Lib "user32.dll" Alias "SendMessageW" (ByVal hWnd As Long, _
           ByVal wMsg As Long, ByRef wParam As LONGLONG, ByRef lParam As LONGLONG) As Long
 
 
Dim LL1 As LONGLONG
    Dim LL2 As LONGLONG
 
 
 
LL2.LongHigh = pMem
        
        Debug.Print ": " & SendMessage32to64(hSysTreeView32, TVM_GETITEM, LL1, LL2)
После этого SendMessage сразу повесился regedit с необратимым исключением вылетела программа пхаххаха

Добавлено через 3 минуты
Правда там есть оговорка "Кроме того, в качестве параметра wMsg следует использовать « значения меньше, чем у WM_USER »." а у меня как раз кажется, как назло значение больше чем у WM_USER

Добавлено через 1 минуту
у меня &H1100 + 62, а у WM_USER = &H400

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
либо в процессе RegEdit выделить ассемблерный код который будет давать 64 битный результат
Может этот путь решения легче? Чем 64-битный SendMessage...

Добавлено через 51 минуту
Короче это слишком сложно для меня, я не умею этого...
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
10.05.2023, 21:36
Из своего процесса вызвать 64 битную SendMessage в 64 битном режиме - тот еще квест. Проще просто выделить переходник в процессе. Перечислить все 64 битные модули в процессе через ZwWow64QueryInformationProcess64 и ZwWow64ReadVirtualMemory64. Затем найти функцию SendMessageW через парсинг таблицы экспорта модуля user32.dll. Затем выделить память для маленького ассемблерного переходника. Положить туда код вызова SendMessageW. Через x64 гейт создать поток на этой функции (возможно и не нужен гейт, помню там какие-то ньюансы были в wow64.dll, но так не вспомню). Переходник вызовет функцию и положит результат в память. Вызвать ReadVirtualMemory и прочитать 64 битный результат. На самом деле ничего сложного, если все делать последовательно.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.05.2023, 00:17  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
создать поток на этой функции
Ты предлагаешь удалённо создать поток внутри другого процесса (regedit.exe) и вызвать функцию SendMessage код которой положить так же в память процесса. Ни то же ли это самое как типа DLL-инъекция... Всунуть свой код в чужой процесс то есть...

Добавлено через 1 минуту
Я думал об инъекции через CreateVBObjectInThread как ты меня научил

Добавлено через 45 секунд
Но у тебя там по моему эта инъекция только для 32-битных процессов, как назло...

Добавлено через 15 минут
Цитата Сообщение от The trick Посмотреть сообщение
Затем выделить память для маленького ассемблерного переходника.
А как выделить память? VirtualAllocEx? Или как?

Добавлено через 5 минут
Тут я много чего не знаю.
1. Как создать ассемблерный переходник
2. Как код вызова функции, да и любой код вообще любых моих функций преврать в HEX-версию хотябы для того чтобы записать в память или читать

В моём представлении что когда я пишу код в vb6 например

Public Sub Main()
Msgbox "Hello!"
End Sub

просто пример, в моём понимании что этот код есть в памяти как последовательность байтов в HEX но я понятия не имею как увидеть этот код в HEX-интерпретации... Я же говорю, я много чего не умею в программировании и ещё только учусь...

Добавлено через 1 минуту
Цитата Сообщение от The trick Посмотреть сообщение
x64 гейт создать
Я даже не знаю что это такое...

Добавлено через 12 секунд
Ну программист я на троечку конечно))))
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.05.2023, 09:11
Цитата Сообщение от HackerVlad Посмотреть сообщение
Ты предлагаешь удалённо создать поток внутри другого процесса (regedit.exe) и вызвать функцию SendMessage код которой положить так же в память процесса. Ни то же ли это самое как типа DLL-инъекция... Всунуть свой код в чужой процесс то есть...
Просто так внедрить DLL в 64 битный процесс (из 32 битного) не получится. Проще выделить код и создать поток через 64 битную NtCreateThreadEx.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Я думал об инъекции через CreateVBObjectInThread как ты меня научил
Это будет работать только с 32 битным кодом.

Цитата Сообщение от HackerVlad Посмотреть сообщение
А как выделить память? VirtualAllocEx? Или как?
Да.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.05.2023, 10:29  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
Перечислить все 64 битные модули в процессе через ZwWow64QueryInformationProcess64 и ZwWow64ReadVirtualMemory64. Затем найти функцию SendMessageW через парсинг таблицы экспорта модуля user32.dll.
А это нельня сделать с помощью твоей функции

Visual Basic
1
2
3
4
5
6
' //
' // Get procedure arrdess from 64 bit dll
' //
Public Function GetProcAddress64( _
                ByVal h64Lib As Currency, _
                ByRef sFunctionName As String) As Currency
и т. д. GetProcAddress64 поможет тут мне или нет?

Добавлено через 1 минуту
Цитата Сообщение от HackerVlad Посмотреть сообщение
Zw
И ты кстати используешь Nt а не Zw в своём модуле

Добавлено через 5 минут
Цитата Сообщение от The trick Посмотреть сообщение
ZwWow64QueryInformationProcess64 и ZwWow64ReadVirtualMemory64
Почему ты написал Zw если сам же в своих кодах используешь Nt я так и не понял...

Добавлено через 12 секунд
В модуле modX64Call.bas
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
11.05.2023, 12:39
Цитата Сообщение от HackerVlad Посмотреть сообщение
И ты кстати используешь Nt а не Zw в своём модуле
Разница между ними только в наличии дополнительных проверок.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
11.05.2023, 13:57
Цитата Сообщение от locm Посмотреть сообщение
Разница между ними только в наличии дополнительных проверок.
В пользовательском режиме разницы нет.

Цитата Сообщение от HackerVlad Посмотреть сообщение
Почему ты написал Zw если сам же в своих кодах используешь Nt я так и не понял...
Без разницы что использовать.
0
Эксперт WindowsАвтор FAQ
 Аватар для Dragokas
18031 / 7734 / 892
Регистрация: 25.12.2011
Сообщений: 11,502
Записей в блоге: 16
11.05.2023, 14:33
Цитата Сообщение от HackerVlad Посмотреть сообщение
Цитата Сообщение от The trick Посмотреть сообщение
Перечислить все 64 битные модули в процессе через ZwWow64QueryInformationProcess64 и ZwWow64ReadVirtualMemory64. Затем найти функцию SendMessageW через парсинг таблицы экспорта модуля user32.dll.
А это нельня сделать с помощью твоей функции ...
Это функция специально для 32-битных приложений.
См. пример вызова.

Добавлено через 7 минут
Там же чуть выше код парсинга модулей. Тебе останется дописать код получения списка функций модуля.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
11.05.2023, 15:54  [ТС]
Это слишком сложно для меня, но зато я написал лайтовую версию RegJumpHack через открытие индексов основываясь на своих списках реестра

Добавлено через 24 секунды
Может даже и без админ прав будет работать кстати
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.05.2023, 13:48  [ТС]
Я кажется нашёл свою ошибку, я вообще не понимаю, с чего вы взяли что нужен именно 64-битный SendMessage для этой задачи, если хватит и 32-битного SendMessage

Добавлено через 45 минут
Короче дошёл до момента когда SendMessage стало возвращать 1 я подумал это успех а по факту ничего не происходит и строка не получается
0
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,576
Записей в блоге: 1
14.05.2023, 13:52
Нужно использовать SendMessage Lib "user64.dll"
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.05.2023, 14:04  [ТС]
Я же говорил уже об этом и повторяться не хочу, что такого не существует)))))))))))
Цитата Сообщение от HackerVlad Посмотреть сообщение
user64.dll же не существует, только user32 поэтому я не понимаю, честно...
Добавлено через 2 минуты
Тут самое непонятное для меня, почему, например, сообщение SB_GETTEXT спокойно работает и для 64-битных процессов тоже, а какое-то TVM_GETITEM не хочет работать... Если бы было такое сообщение для узнавания текста ветки дерева без TVM_GETITEM было бы очень хорошо, как например SB_GETTEXT, но такого я не нашёл почему-то в винде...
0
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,576
Записей в блоге: 1
14.05.2023, 14:06
Цитата Сообщение от HackerVlad Посмотреть сообщение
что такого не существует)))))))))))
Пишут что она существует, только она в папке "C:\Windows\System32" и называется user32.dll, а 32битная в папке "C:\Windows\SysWOW64", в принципе все логично..
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.05.2023, 14:37  [ТС]
Хотел так же посмотреть исходник функции SendMessage чтобы найти как у них реализовано сообщение TVM_GETITEM но тоже пока не нашёл этого... А ведь так хотелось бы вплотную подобраться к TVITEM.pszText ведь сама функция SendMessage туда каким-то образом должна отправлять данные...

Добавлено через 1 минуту
Цитата Сообщение от testuser2 Посмотреть сообщение
Пишут что она есть
А ты её видел, сам лично? Мало ли что пишут... Я вот не видел!

Добавлено через 5 минут
testuser2, https://question-it.com/questi... 2dll-i-t-d

Добавлено через 23 минуты
testuser2, интересно, а в VBA там 64-битная система? Может и SendMessage можно отправить через VBA 64-битный?

Добавлено через 26 секунд
Я просто никогда не пользовался VBA, а ты вроде профи.
0
1385 / 841 / 91
Регистрация: 08.02.2017
Сообщений: 3,576
Записей в блоге: 1
14.05.2023, 14:49
Цитата Сообщение от HackerVlad Посмотреть сообщение
а ты вроде профи.
Я "профи" по поиску в нете. Если надо найти правильную декларацию под x64 забиваешь в поиск "Declare PtrSafe Function Название". Под 64 костыльно реализовано все, но в принципе также все работатет..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.05.2023, 14:49
Помогаю со студенческими работами здесь

Не срабаывает DuplicateHandle. Поиск 32х битного процесса. MVS 6.0. Система 64 битная
Добрый день. Необходимо сделать копию дескриптора процесса 32х битного. В 64 битной Windows. Дорабатываю не свою программу. В программе...

Как из 32х битного приложения получить доступ к ветке реестра HKEY_LOCAL_MACHINE\SOFTWARE\ на 64x
Привет, Столкнулся с проблемой, читаю из ветки реестра 'HKEY_LOCAL_MACHINE\SOFTWARE\' параметры, но вот беда, если ос 64х, то чтение...

специфика создание 32 - х битного и 64 - х битного приложение
Господа допустим есть программа 32-х битная как из неё сделать 64-х битную . Интересует вообще как это реализуется и на сколько сложна...

Получить id процесса родителя, если исходный id процесса дочерний
Добрый день. У меня есть вот такой код на C#, который должен позволить получить id процесса родителя, если исходный id процесса дочерний: ...

Как получить параметры процесса?
Хотелось бы спросить можно ли в отслеживаемом процессе получить параметры запуска онного. Например C:\\Windows\\system32\\rundll32.exe...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru