X64 caller

Тема в разделе "VB", создана пользователем Thetrik, 28 фев 2021.

Метки:
  1. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Данный модуль может пригодится для вызова 64 битных функций из 32 битного кода внутри WOW64 процесса. Использование модуля продемонстрировано в репозитории где лежит сам модуль (вызов 64 битной NtQueryInformationProcess).

    GetModuleHandle64 - позволяет получить адрес 64-битного модуля по его имени.
    GetProcAddress64 - позволяет получить адрес 64-битной функции из 64-битной DLL (не поддерживаются перенаправления, но для NtDLL это и не нужно).

    Ссылка.
    Пример использования (получения информации об использовании памяти процессами)
     
    alix и X-Shar нравится это.
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875
    Добавил функцию SendMessageW64. Теперь можно отправлять сообщения 64-битным приложениям и получать 64-битный результат. В примере ниже пример получения нодов treeview'а из 64-битного regedit.exe:
    Код (Text):
    1. ' //
    2. ' // Call 64-bit SendMessage from 32-bit process
    3. ' //
    4.  
    5. Option Explicit
    6.  
    7. Private Const MAX_PATH                As Long = 260
    8. Private Const PROCESS_VM_READ         As Long = &H10
    9. Private Const PROCESS_VM_OPERATION    As Long = &H8
    10. Private Const PROCESS_VM_WRITE        As Long = &H20
    11. Private Const TV_FIRST                As Long = &H1100
    12. Private Const TVM_GETNEXTITEM         As Long = (TV_FIRST + 10)
    13. Private Const TVM_GETITEM             As Long = (TV_FIRST + 62)
    14. Private Const TVGN_ROOT               As Long = 0
    15. Private Const TVGN_NEXT               As Long = 1
    16. Private Const TVGN_CHILD              As Long = 4
    17. Private Const TVIF_TEXT               As Long = 1
    18. Private Const MEM_RESERVE             As Long = &H2000&
    19. Private Const MEM_COMMIT              As Long = &H1000&
    20. Private Const MEM_RELEASE             As Long = &H8000&
    21. Private Const PAGE_READWRITE          As Long = 4&
    22.  
    23. Private Type STARTUPINFO
    24.     cb              As Long
    25.     lpReserved      As Long
    26.     lpDesktop       As Long
    27.     lpTitle         As Long
    28.     dwX             As Long
    29.     dwY             As Long
    30.     dwXSize         As Long
    31.     dwYSize         As Long
    32.     dwXCountChars   As Long
    33.     dwYCountChars   As Long
    34.     dwFillAttribute As Long
    35.     dwFlags         As Long
    36.     wShowWindow     As Integer
    37.     cbReserved2     As Integer
    38.     lpReserved2     As Long
    39.     hStdInput       As OLE_HANDLE
    40.     hStdOutput      As OLE_HANDLE
    41.     hStdError       As OLE_HANDLE
    42. End Type
    43.  
    44. Private Type PROCESS_INFORMATION
    45.     hProcess        As Long
    46.     hThread         As OLE_HANDLE
    47.     dwProcessId     As Long
    48.     dwThreadId      As OLE_HANDLE
    49. End Type
    50.  
    51. Private Type TVITEM64
    52.     mask            As Long
    53.     lPad            As Long
    54.     hItem           As Currency
    55.     State           As Long
    56.     stateMask       As Long
    57.     pszText         As Currency
    58.     cchTextMax      As Long
    59.     iImage          As Long
    60.     iSelectedImage  As Long
    61.     cChildren       As Long
    62.     lParam          As Currency
    63. End Type
    64.  
    65. Private Declare Function CreateProcess Lib "kernel32" _
    66.                          Alias "CreateProcessW" ( _
    67.                          ByVal lpApplicationName As Long, _
    68.                          ByVal lpCommandLine As Long, _
    69.                          ByRef lpProcessAttributes As Any, _
    70.                          ByRef lpThreadAttributes As Any, _
    71.                          ByVal bInheritHandles As Long, _
    72.                          ByVal dwCreationFlags As Long, _
    73.                          ByRef lpEnvironment As Any, _
    74.                          ByVal lpCurrentDirectory As Long, _
    75.                          ByRef lpStartupInfo As STARTUPINFO, _
    76.                          ByRef lpProcessInformation As PROCESS_INFORMATION) As Long
    77. Private Declare Function Wow64DisableWow64FsRedirection Lib "kernel32" ( _
    78.                          ByRef lvalue As Long) As Long
    79. Private Declare Function Wow64RevertWow64FsRedirection Lib "kernel32" ( _
    80.                          ByVal lvalue As Long) As Long
    81. Private Declare Function CloseHandle Lib "kernel32" ( _
    82.                          ByVal hObject As OLE_HANDLE) As Long
    83. Private Declare Function WaitForInputIdle Lib "user32" ( _
    84.                          ByVal hProcess As OLE_HANDLE, _
    85.                          ByVal dwMilliseconds As Long) As Long
    86. Private Declare Function GetWindowsDirectory Lib "kernel32" _
    87.                          Alias "GetWindowsDirectoryW" ( _
    88.                          ByVal lpBuffer As Long, _
    89.                          ByVal nSize As Long) As Long
    90. Private Declare Function FindWindowEx Lib "user32" _
    91.                          Alias "FindWindowExW" ( _
    92.                          ByVal hWndParent As Long, _
    93.                          ByVal hWndChildAfter As Long, _
    94.                          ByVal lpClassName As Long, _
    95.                          ByVal lpWindowName As Long) As Long
    96. Private Declare Function GetProcessId Lib "kernel32" ( _
    97.                          ByVal hProcess As OLE_HANDLE) As Long
    98. Private Declare Function GetWindowThreadProcessId Lib "user32" ( _
    99.                          ByVal hwnd As OLE_HANDLE, _
    100.                          ByRef lpdwProcessId As Long) As Long
    101. Private Declare Function OpenProcess Lib "kernel32" ( _
    102.                          ByVal dwDesiredAccess As Long, _
    103.                          ByVal bInheritHandle As Long, _
    104.                          ByVal dwProcessId As Long) As OLE_HANDLE
    105. Private Declare Function VirtualAllocEx Lib "kernel32.dll" ( _
    106.                          ByVal hProcess As OLE_HANDLE, _
    107.                          ByVal lpAddress As Long, _
    108.                          ByVal dwSize As Long, _
    109.                          ByVal flAllocationType As Long, _
    110.                          ByVal flProtect As Long) As Long
    111. Private Declare Function WriteProcessMemory Lib "kernel32" ( _
    112.                          ByVal hProcess As OLE_HANDLE, _
    113.                          ByVal lpBaseAddress As Long, _
    114.                          ByRef lpBuffer As Any, _
    115.                          ByVal nSize As Long, _
    116.                          ByRef lpNumberOfBytesWritten As Long) As Long
    117. Private Declare Function ReadProcessMemory Lib "kernel32" ( _
    118.                          ByVal hProcess As OLE_HANDLE, _
    119.                          ByVal lpBaseAddress As Long, _
    120.                          ByRef lpBuffer As Any, _
    121.                          ByVal nSize As Long, _
    122.                          ByRef lpNumberOfBytesWritten As Long) As Long
    123. Private Declare Function VirtualFreeEx Lib "kernel32.dll" ( _
    124.                          ByVal hProcess As OLE_HANDLE, _
    125.                          ByVal lpAddress As Long, _
    126.                          ByVal dwSize As Long, _
    127.                          ByVal dwFreeType As Long) As Long
    128. Private Declare Function SendMessage Lib "user32" _
    129.                          Alias "SendMessageW" ( _
    130.                          ByVal hwnd As OLE_HANDLE, _
    131.                          ByVal wMsg As Long, _
    132.                          ByVal wParam As Long, _
    133.                          ByRef lParam As Any) As Long
    134. Private Declare Function Sleep Lib "kernel32" ( _
    135.                          ByVal dwMilliseconds As Long) As Long
    136.                        
    137. Public Sub Main()
    138.     Dim hProcess    As OLE_HANDLE
    139.     Dim hTVWnd      As OLE_HANDLE
    140.     Dim lPID        As Long
    141.     Dim h64Current  As Currency
    142.     Dim pMemory     As Long
    143.     Dim lPass       As Long
    144.    
    145.     On Error GoTo CleanUp
    146.    
    147.     If Not modX64Call.Initialize Then
    148.         MsgBox "Unable to initialize modX64Call", vbCritical
    149.         Exit Sub
    150.     End If
    151.    
    152.     hTVWnd = GetTVWindow(0)
    153.    
    154.     If hTVWnd = 0 Then
    155.        
    156.         hProcess = Run64BitRegEdit()
    157.        
    158.         If hProcess = 0 Then
    159.             MsgBox "Unable to run regedit", vbCritical
    160.             GoTo CleanUp
    161.         End If
    162.        
    163.         For lPass = 0 To 2
    164.        
    165.             hTVWnd = GetTVWindow(0)
    166.            
    167.             If hTVWnd Then
    168.                 Exit For
    169.             End If
    170.            
    171.             Sleep 200
    172.            
    173.         Next
    174.        
    175.         If lPass = 2 Then
    176.             MsgBox "Unable to find treeview", vbCritical
    177.             GoTo CleanUp
    178.         End If
    179.        
    180.     Else
    181.    
    182.         If GetWindowThreadProcessId(hTVWnd, lPID) = 0 Then
    183.             MsgBox "GetWindowThreadProcessId failed", vbCritical
    184.             GoTo CleanUp
    185.         End If
    186.        
    187.         hProcess = OpenProcess(PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, 0, lPID)
    188.        
    189.         If hProcess = 0 Then
    190.             MsgBox "OpenProcess failed", vbCritical
    191.             GoTo CleanUp
    192.         End If
    193.        
    194.     End If
    195.    
    196.     pMemory = VirtualAllocEx(hProcess, 0, 4096, MEM_RESERVE Or MEM_COMMIT, PAGE_READWRITE)
    197.    
    198.     If pMemory = 0 Then
    199.         MsgBox "VirtualAllocEx failed", vbCritical
    200.         GoTo CleanUp
    201.     End If
    202.    
    203.     h64Current = SendMessageW64(hTVWnd, TVM_GETNEXTITEM, 0, TVGN_ROOT / 10000)
    204.    
    205.     If h64Current = 0 Then
    206.         MsgBox "SendMessageW64 failed", vbCritical
    207.         GoTo CleanUp
    208.     End If
    209.    
    210.     DumpTV64 0, hProcess, hTVWnd, h64Current, pMemory
    211.    
    212. CleanUp:
    213.  
    214.     If hProcess Then
    215.         CloseHandle hProcess
    216.     End If
    217.    
    218.     modX64Call.Uninitialize
    219.  
    220. End Sub
    221.  
    222. Private Sub DumpTV64( _
    223.             ByVal lIdent As Long, _
    224.             ByVal hProcess As OLE_HANDLE, _
    225.             ByVal hwnd As OLE_HANDLE, _
    226.             ByVal h64Item As Currency, _
    227.             ByVal pMemory As Long)
    228.     Dim tItem       As TVITEM64
    229.     Dim h64Child    As Currency
    230.     Dim sBuf        As String
    231.     Dim lSize       As Long
    232.    
    233.     sBuf = Space$(260)
    234.    
    235.     tItem.pszText = (pMemory + 1024) / 10000
    236.     tItem.mask = TVIF_TEXT
    237.     tItem.cchTextMax = Len(sBuf)
    238.    
    239.     Do While h64Item <> 0@
    240.        
    241.         ' // Get text
    242.         tItem.hItem = h64Item
    243.  
    244.         If WriteProcessMemory(hProcess, pMemory, tItem, LenB(tItem), 0) = 0 Then
    245.             MsgBox "WriteProcessMemory failed", vbCritical
    246.             Exit Sub
    247.         End If
    248.        
    249.         If SendMessage(hwnd, TVM_GETITEM, 0, ByVal pMemory) = 0 Then
    250.             MsgBox "SendMessageW64 failed", vbCritical
    251.             Exit Sub
    252.         End If
    253.        
    254.         If ReadProcessMemory(hProcess, pMemory + 1024, ByVal StrPtr(sBuf), LenB(sBuf), 0) = 0 Then
    255.             MsgBox "ReadProcessMemory failed", vbCritical
    256.             Exit Sub
    257.         End If
    258.    
    259.         lSize = InStr(1, sBuf, vbNullChar)
    260.        
    261.         If lSize Then
    262.             Debug.Print Space$(lIdent * 4) & Left$(sBuf, lSize - 1)
    263.         End If
    264.        
    265.         h64Child = SendMessageW64(hwnd, TVM_GETNEXTITEM, TVGN_CHILD / 10000, h64Item)
    266.        
    267.         If h64Child <> 0 Then
    268.             DumpTV64 lIdent + 1, hProcess, hwnd, h64Child, pMemory
    269.         End If
    270.        
    271.         h64Item = SendMessageW64(hwnd, TVM_GETNEXTITEM, TVGN_NEXT / 10000, h64Item)
    272.        
    273.     Loop
    274.    
    275. End Sub
    276.  
    277. Private Function GetTVWindow( _
    278.                  ByVal hProcess As OLE_HANDLE) As OLE_HANDLE
    279.     Dim hwnd    As OLE_HANDLE
    280.     Dim lPID    As Long
    281.     Dim lPIDWnd As Long
    282.    
    283.     If hProcess Then
    284.         lPID = GetProcessId(hProcess)
    285.     End If
    286.    
    287.     Do
    288.    
    289.         hwnd = FindWindowEx(0, hwnd, StrPtr("RegEdit_RegEdit"), 0)
    290.            
    291.         If hwnd = 0 Then
    292.             Exit Function
    293.         End If
    294.        
    295.         If lPID Then
    296.             If GetWindowThreadProcessId(hwnd, lPIDWnd) Then
    297.                 If lPIDWnd = lPID Then
    298.                
    299.                     GetTVWindow = FindWindowEx(hwnd, 0, StrPtr("SysTreeView32"), 0)
    300.                     Exit Function
    301.                
    302.                 End If
    303.             End If
    304.         Else
    305.             GetTVWindow = FindWindowEx(hwnd, 0, StrPtr("SysTreeView32"), 0)
    306.             Exit Function
    307.         End If
    308.        
    309.     Loop While True
    310.  
    311. End Function
    312.  
    313. Private Function Run64BitRegEdit() As OLE_HANDLE
    314.     Dim lFSRedirect As Long
    315.     Dim tSI         As STARTUPINFO
    316.     Dim tPI         As PROCESS_INFORMATION
    317.     Dim hProcess    As OLE_HANDLE
    318.     Dim lResult     As Long
    319.     Dim sPath       As String
    320.     Dim lSize       As Long
    321.    
    322.     sPath = Space$(MAX_PATH)
    323.     lSize = GetWindowsDirectory(StrPtr(sPath), Len(sPath) + 1)
    324.     sPath = Left$(sPath, lSize)
    325.    
    326.     If Wow64DisableWow64FsRedirection(lFSRedirect) = 0 Then
    327.         Exit Function
    328.     End If
    329.    
    330.     tSI.cb = Len(tSI)
    331.    
    332.     lResult = CreateProcess(StrPtr(sPath & "\regedit.exe"), 0, ByVal 0&, ByVal 0&, 0, 0, ByVal 0&, 0, tSI, tPI)
    333.    
    334.     Wow64RevertWow64FsRedirection lFSRedirect
    335.    
    336.     If lResult = 0 Then
    337.         Exit Function
    338.     End If
    339.    
    340.     CloseHandle tPI.hThread
    341.    
    342.     WaitForInputIdle tPI.hProcess, -1
    343.    
    344.     Run64BitRegEdit = tPI.hProcess
    345.    
    346. End Function
     

    Вложения:

    mantissa нравится это.
  3. Aoizora

    Aoizora Active Member

    Публикаций:
    0
    Регистрация:
    29 янв 2017
    Сообщения:
    362
    С чем связано то, что на васме в основном системное программирование под винду? С крекерством? Почему тут не популярна системщина под другие ос, не обязательно линукс?
     
  4. TrashGen

    TrashGen ТрещГен

    Публикаций:
    0
    Регистрация:
    15 мар 2011
    Сообщения:
    1.191
    Адрес:
    подполье
    Aoizora, с тем, очевидно, что это форум низкоуровневых прогроммиздов. Винда - наиболее популярная система с Закрытым Исходным Кодом. Тоесть не приходиццо реверсить опенсорцы, например.
     
  5. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    875