Что нового

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Имеется запущенный установщик (для точности - Opera 11.64), в нём есть разные значения, элементов в нём естественно нет, всё сделано через графику как я понял.

Так вот, мне нужно пройтись по памяти процесса, и найти определённое строковое значение, а точнее, путь к папке, искать нужно по рег. выражению.

Возможно ли это, или не стоит заморачиваться? :scratch:
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Попоробуй поискать путь с помощью artmoney. Я попробовал поискать в памяти путь - он оказался в 1 экземпляре по одному и томуже адресу.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
sngr [?]
Попоробуй поискать путь с помощью artmoney
Находит один адрес, но если ввести другой путь, то по этому адресу мы получаем старое значение, а нужно новое.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Нужно как то искать адрес по RegExp (указывая шаблон пути, типа '(?i)^[a-z]:\\.*$').
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Пытаюсь сделать так:

Код:
$ahMem = _MemOpen(7176) ;Процесс Opera.exe (от установщика)
$sRead = _MemSearch($ahMem, '(?i)[a-z]:\\.*', 0x00000000, 0x06000000, 5120)
_MemClose($ahMem)

ConsoleWrite($sRead & @LF)

Func _MemSearch($ah_Mem, $sPattern, $iStartAddress, $iStopAddress, $iStep)
	If Not IsArray($ah_Mem) Then
		Return SetError(1)
	EndIf
	
	If StringLen($sPattern) = 0 Then
		Return SetError(2)
	EndIf
	
	For $iAddress = $iStartAddress To $iStopAddress Step $iStep
		$sRead = _MemRead($ah_Mem, $iAddress, $iStep)
		
		If StringRegExp($sRead, $sPattern) Then
			Return $sRead
		EndIf
	Next
	
	Return SetError(3)
EndFunc ;==>_MemSearch

Func _MemOpen($i_Pid, $i_Access = 0x1F0FFF, $i_Inherit = 0)
    Local $av_Return[2] = [DllOpen('kernel32.dll') ]
    Local $ai_Handle = DllCall($av_Return[0], 'int', 'OpenProcess', 'int', $i_Access, 'int', $i_Inherit, 'int', $i_Pid)
    If @error Then
        DllClose($av_Return[0])
        SetError(1)
        Return 0
    EndIf
    $av_Return[1] = $ai_Handle[0]
    Return $av_Return
EndFunc  ;==>_MemOpen

Func _MemRead($ah_Mem, $i_Address, $i_Size = 0)
    If $i_Size = 0 Then
        Local $v_Return = ''
        Local $v_Struct = DllStructCreate('byte[1]')
        Local $v_Ret
        
        While 1
            $v_Ret = DllCall($ah_Mem[0], 'int', 'ReadProcessMemory', 'int', $ah_Mem[1], 'int', $i_Address, 'ptr', DllStructGetPtr($v_Struct), 'int', 1, 'int', '')
            $v_Ret = DllStructGetData($v_Struct, 1)
            If $v_Ret = 0 Then ExitLoop
            $v_Return &= Chr($v_Ret)
            $i_Address += 1
        WEnd
        
    Else
        Local $v_Struct = DllStructCreate('byte[' & $i_Size & ']')
        Local $v_Ret = DllCall($ah_Mem[0], 'int', 'ReadProcessMemory', 'int', $ah_Mem[1], 'int', $i_Address, 'ptr', DllStructGetPtr($v_Struct), 'int', $i_Size, 'int', '')
        Local $v_Return[$v_Ret[4]]
        For $i = 0 To $v_Ret[4] - 1
            $v_Return[$i] = DllStructGetData($v_Struct, 1, $i + 1)
        Next
    EndIf
    Return $v_Return
EndFunc  ;==>_MemRead

Func _MemClose($ah_Mem)
    Local $av_Ret = DllCall($ah_Mem[0], 'int', 'CloseHandle', 'int', $ah_Mem[1])
    DllClose($ah_Mem[0])
    Return $av_Ret[0]
EndFunc  ;==>_MemClose


Но ищет жутко долго, пока ничего не нашлось :stars:.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Ты мыслишь не в том направлении. Для поиска значения в памяти autoit неподходит - это нереально медленно. Тебе надо проверять значения по адресам. У меня значение пути по умолчанию и изменнёный путь по одному адресу, меняя его через artmoney я вижу изменения и в установщике. У тебя стандартный и изменнёный пути могут быть по разным адресам. Попробуй поменять стандартный путь через artmoney, найди изменнёный путь, может он тоже находится по одному адресу.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
sngr [?]
У меня значение пути по умолчанию и изменнёный путь по одному адресу, меняя его через artmoney я вижу изменения и в установщике
Какой установщик проверяешь?
В Opera 11.64 Eng, даже если я меняю значение в найденном адресе, в установщике оно не меняется. И даже больше скажу, если я сменю значение в установщике (укажу другую папку), то artmoney уже не находит новое значение.
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Я искал в памяти какого то установщика, какой на диске нашёл, не оперы. Какой-то твой установщик самопальный, я найти изменения в нём тоже не смог. Может просто в реестре после установки проверять значения?


Добавлено:
Сообщение автоматически объединено:

Возможно новое значение пути пишется в память после нажатия кнопки для продолжения установки.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
sngr [?]
Какой-то твой установщик самопальный, я найти изменения в нём тоже не смог. Может просто в реестре после установки проверять значения?
Я возможно не полноценно изложил задачу.

Меня не интересует конкретный установщик, я ищу универсальный метод получения значения из Edit поля.
В данном случае (это, возможно, самый сложный случай, впрочем именно поэтому я его и выбрал), Edit поле нарисовано графикой, т.е нет элемента, поэтому мне кажется что самый лучший способ, это поиск по рег. выражению некого пути в памяти, чтобы определить путь установки.

Какие будут идеи по этому поводу? :scratch:
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Универсальный метод есть - называется распознавание текста с экрана, или после скриншота с картинки.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
sngr [?]
Универсальный метод есть - называется распознавание текста с экрана
Не уверен что это универсальный метод, но спасибо за наводку, это вариант на крайний случай.
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Возможно есть в природе некая Dll'ка, которая будет быстрее искать значение (по диапазону хотя бы)?
 

sngr

AutoIT Гуру
Сообщения
1,010
Репутация
408
Вот dll`ка из winhex`а. У неё в экспортируемых функциях что-то было про работу с памятью. Может поможет чем-то.
<a href="http://autoit-script.ru/index.php?action=downloads;sa=downfile&id=208" />psapi.dll</a>
 

asdf8

Скриптер
Сообщения
564
Репутация
152
CreatoR [?]
Пытаюсь сделать так:

У меня этот пример не работает - функция _MemRead не читает.
Похоже _MemRead - главный тормоз в работе, можно попробовать реализовать ее на PureBasic:
Код:
ProcedureDLL.s mRead(hProcess, iAdr, iSize)
	Protected str$ = "", sBuffer, lWritten, i, res
	sBuffer = AllocateMemory(iSize)
	res = ReadProcessMemory_(hProcess, iAdr, sBuffer, iSize, @lWritten)
	If lWritten > 0 And res > 0
		For i = 0 To lWritten - 1
			If PeekB(sBuffer + i) = 0 
				PokeB(sBuffer + i, 1)
			EndIf
		Next
		str$ = PeekS(sBuffer, iSize)
	EndIf
	FreeMemory(sBuffer)
	ProcedureReturn str$
EndProcedure

пример вызова:
Код:
$sRead = DllCall('mread.dll', 'str', 'mRead', 'int', $ah_Mem,  'int', $iAddress, 'int', $iStep)
 

Belfigor

Модератор
Локальный модератор
Сообщения
3,608
Репутация
941
Не совсем понял про адрес. Если есть адрес и нужно во время установки его отслеживать. Возможно он работает не верно потому что у установщика DMA структура и нужно просто найти базовый оффсет на этот адрес? :scratch:
 
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Автор
CreatoR

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
asdf8 [?]
Вместо $ah_Mem видимо нужно использовать $ah_Mem[1] (дескриптор памяти), но даже при этом скрипт вылетает :scratch:.
Сделал через DllOpen, теперь не вылетает, но ищет также медленно.

Может на PB можно реализовать весь процесс поиска, т.е передавать ему в виде параметра PID и строку поиска в виде RegExp?
 

asdf8

Скриптер
Сообщения
564
Репутация
152
CreatoR [?]
Может на PB можно реализовать весь процесс поиска, т.е передавать ему в виде параметра PID и строку поиска в виде RegExp?

Для RegExp в PB нужно, чтобы строка не содержала Chr(0), а, так как функция mRead, которая кроме чтения памяти, переводит Chr(0) в Chr(1), работает медленно, то вряд ли получится существенный выигрыш в скорости.
Нужен какой-то трюк.
 

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
:
Хотите трюк, пожалуйста: FileInstall ("Artmoney.exe",...) :whistle:
 
Верх