Автор Тема: Поиск значения в памяти процесса  (Прочитано 7749 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Для работы требуется dll

Нажмите для отображения изображения в оригинальном размере.

Код: AutoIt [Выделить]
#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
 


Русское сообщество AutoIt

Поиск значения в памяти процесса
« Отправлен: Январь 20, 2012, 07:44:14 »

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Поиск значения в памяти процесса
« Ответ #1, Отправлен: Январь 20, 2012, 08:58:23 »
Viktor1703,
Попробовал найти строку Вашим скриптом и Cheat Engine. Ваш нашел два значения, Cheat Engine - шесть, причем ни один адрес не совпал. Почему, не понятно.  :think:

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Поиск значения в памяти процесса
« Ответ #2, Отправлен: Январь 20, 2012, 09:03:36 »
Мне тоже не понятно, сам наблюдал такую картину, хотя всё работает, я даже программу таким методом активировал (нашёл ключ в самой программе) :wacko:

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Поиск значения в памяти процесса
« Ответ #3, Отправлен: Январь 20, 2012, 17:58:22 »
Как правильно сделать? не хочется использовать сторонние приложения для поиска базового адреса, считаю так, если программа предназначена для воспроизведения медиа файлов, то в ней должно быть всё для этого, а не раскидано, кнопки в одной программе, визуализация в другой, а воспроизводит вообще третья, даже пусть медленно работает, главное чтоб работала правильно.

Русское сообщество AutoIt

Re: Поиск значения в памяти процесса
« Ответ #3 Отправлен: Январь 20, 2012, 17:58:22 »

Оффлайн RomchegChe [?]

  • Новичок
  • *
  • Сообщений: 37
  • Репутация: 1
  • Пол: Мужской
    • Награды
Re: Поиск значения в памяти процесса
« Ответ #4, Отправлен: Июнь 07, 2013, 20:23:48 »
Автор, подскажите, плз, где найти инфу по вызову Memory.dll, например, можно ли найти не строку, а диапазон числовых значений, от 1150 до 1152

Оффлайн Afonichev [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1535

  • Автор темы
  • Репутация: 408
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Поиск значения в памяти процесса
« Ответ #5, Отправлен: Июнь 07, 2013, 20:28:57 »
RomchegChe  [?]
Цитировать
Автор, подскажите, плз, где найти инфу по вызову Memory.dll

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

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

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

Оффлайн RomchegChe [?]

  • Новичок
  • *
  • Сообщений: 37
  • Репутация: 1
  • Пол: Мужской
    • Награды
Re: Поиск значения в памяти процесса
« Ответ #6, Отправлен: Июнь 07, 2013, 21:00:04 »
Эта длл-ка очень быстро сканирует всю память, скорость сопостовима с cheat engine, NomadMemory работает намного медленнее, а мне нужно решение - быстрое сканирование памяти и поиск чисел в заданном диапазоне. Может бы Вы можете доработать длл, если да, то можите ли сообщить стоимость?

Оффлайн bistriy [?]

  • Новичок
  • *
  • Сообщений: 22
  • Репутация: 0
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Поиск значения в памяти процесса
« Ответ #7, Отправлен: Июнь 02, 2014, 10:41:13 »
А где скачать саму dll : Memory.dll ?

Русское сообщество AutoIt

Re: Поиск значения в памяти процесса
« Ответ #7 Отправлен: Июнь 02, 2014, 10:41:13 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
0 Ответов
6296 Просмотров
Последний ответ Декабрь 13, 2009, 01:29:04
от bic
0 Ответов
3177 Просмотров
Последний ответ Февраль 10, 2012, 13:54:09
от madmasles
6 Ответов
4135 Просмотров
Последний ответ Март 19, 2012, 17:49:12
от CreatoR
35 Ответов
11658 Просмотров
Последний ответ Май 24, 2012, 17:37:47
от asdf8
2 Ответов
1812 Просмотров
Последний ответ Ноябрь 07, 2013, 18:22:52
от firex
0 Ответов
1100 Просмотров
Последний ответ Август 12, 2014, 18:00:22
от zerobot
0 Ответов
1058 Просмотров
Последний ответ Ноябрь 04, 2014, 16:10:38
от ibender
0 Ответов
999 Просмотров
Последний ответ Ноябрь 04, 2014, 17:39:28
от madmasles
9 Ответов
2221 Просмотров
Последний ответ Май 18, 2016, 16:03:11
от NickGrava
1 Ответов
532 Просмотров
Последний ответ Ноябрь 09, 2017, 14:55:58
от alex.n201