Viktor1703
AutoIT Гуру
- Сообщения
- 1,535
- Репутация
- 413
Для работы требуется dll
Код:
#Include <WindowsConstants.au3>
#Include <WinAPIEx.au3>
#Include <GuiListView.au3>
Global Const $MEM_ASCII = 0x08
Global Const $MEM_UNICODE = 0x09
Global $iPid, $iProcess
Global $Dll = DllOpen(@ScriptDir & '\Memory.dll')
$hForm = GUICreate('ScanMemory', 800, 600)
$ListView = GUICtrlCreateListView("Base Address|Value", 0, 0, 800, 500)
_GUICtrlListView_SetColumnWidth($ListView, 0, 100)
$iPos = WinGetPos($hForm)
_GUICtrlListView_SetColumnWidth($ListView, 1, $iPos[2] - 100)
GUICtrlCreateLabel("Выбирите процесс:", 10, 513, 100, 20)
$Combo = GUICtrlCreateCombo('', 120, 510, 200, 20)
GUICtrlCreateLabel("Введите слово для поиска:", 10, 543, 140, 20)
$Input = GUICtrlCreateInput('', 160, 540, 160, 20)
$Button = GUICtrlCreateButton("Начать поиск", 10, 570, 310, 20)
GUISetState()
$List = ProcessList()
For $i = 3 To UBound($List) -1
$iProcess &= $List[$i][0] & "|"
Next
$Default = StringSplit($iProcess, "|")
GUICtrlSetData($Combo, $iProcess, $Default[1])
While 1
Switch GUIGetMsg()
Case -3
Exit
Case $Button
GUICtrlSetState($Button, 128)
_GUICtrlListView_DeleteAllItems($ListView)
$iPid = GetProcessPID(GUICtrlRead($Combo))
$iHandle = __MemOpenProcess($iPid)
$hWnd = ProcessGetWindow($iPid)
If $hWnd Then
$Address = ScanMemory($hWnd, GUICtrlRead($Input), $MEM_UNICODE)
For $i = 1 To $Address[0]
GUICtrlCreateListViewItem($Address[$i] & '|' & __MemRead($iHandle, $Address[$i], 'wchar[1024]'), $ListView)
Next
EndIf
GUICtrlSetState($Button, 64)
__MemCloseProcess($iHandle)
EndSwitch
WEnd
Func ScanMemory($hWnd, $String, $Method, $MinAddress = 0, $MaxAddress = 0x7FFFFFFF)
Dim $Array[2]
Local $Ret = DllCall($Dll, 'str', 'ScanMemory', 'hwnd', $hWnd, 'str', $String, 'int', $Method, 'int', $MinAddress, 'int', $MaxAddress)
$Split = StringSplit($Ret[0], "|")
$Array[0] = $Split[0]
For $i = 1 To $Split[0]
ReDim $Array[$Array[0] + 1]
$Array[$i] = '0x' & Hex($Split[$i], 8)
Next
Return $Array
EndFunc
Func GetProcessPID($Process)
Local $iProcessPid
$List = ProcessList($Process)
For $i = 1 To $List[0][0]
$iProcessPid = $List[$i][1]
Next
Return $iProcessPid
EndFunc
Func __MemOpenProcess($iPid)
Return _WinAPI_OpenProcess(BitOR(0x001F0FFF, 0x00000020, 0x00000008), False, $iPid)
EndFunc
Func __MemRead($iHandle, $BaseAddress, $Type)
Local $iBuffer, $tBuffer = DllStructCreate($Type)
_WinAPI_ReadProcessMemory($iHandle, $BaseAddress, DllStructGetPtr($tBuffer), DllStructGetSize($tBuffer), $iBuffer)
Return DllStructGetData($tBuffer, 1)
EndFunc
Func __MemCloseProcess($iHandle)
_WinAPI_CloseHandle($iHandle)
EndFunc
Func ProcessGetWindow($iPID, $iRet=1)
Local $aWinList = WinList()
Local $aRet[2]
If IsString($iPID) Then $iPID = ProcessExists($iPID)
For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle
If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]
Return $aRet
EndIf
Next
Return SetError(1, 0, $aRet)
EndFunc