Что нового

Поиск значения в памяти процесса

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
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Viktor1703,
Попробовал найти строку Вашим скриптом и Cheat Engine. Ваш нашел два значения, Cheat Engine - шесть, причем ни один адрес не совпал. Почему, не понятно. :scratch:
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Мне тоже не понятно, сам наблюдал такую картину, хотя всё работает, я даже программу таким методом активировал (нашёл ключ в самой программе) :wacko:
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Как правильно сделать? не хочется использовать сторонние приложения для поиска базового адреса, считаю так, если программа предназначена для воспроизведения медиа файлов, то в ней должно быть всё для этого, а не раскидано, кнопки в одной программе, визуализация в другой, а воспроизводит вообще третья, даже пусть медленно работает, главное чтоб работала правильно.
 

RomchegChe

Новичок
Сообщения
37
Репутация
1
Автор, подскажите, плз, где найти инфу по вызову Memory.dll, например, можно ли найти не строку, а диапазон числовых значений, от 1150 до 1152
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
RomchegChe [?]
Автор, подскажите, плз, где найти инфу по вызову Memory.dll

Ни где, она самописная.

можно ли найти не строку, а диапазон числовых значений, от 1150 до 1152

Не знаю, я более не поддерживаю работу над этой dll, используйте NomadMemory.
 

RomchegChe

Новичок
Сообщения
37
Репутация
1
Эта длл-ка очень быстро сканирует всю память, скорость сопостовима с cheat engine, NomadMemory работает намного медленнее, а мне нужно решение - быстрое сканирование памяти и поиск чисел в заданном диапазоне. Может бы Вы можете доработать длл, если да, то можите ли сообщить стоимость?
 
Верх