Что нового

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

edward

Новичок
Сообщения
10
Репутация
0
Версия AutoIt: 3.3.14.0

Описание: задача проста. есть ИД процесса, адрес в памяти, нужно получать значение (желательно с точкой 4 байт) и писать его в .ini или в буфер обмена виндавс интервалом в 100-200мс или чаще.

Примечания: да, пробовал готовое решение http://autoit-script.ru/index.php?topic=9805.0 . в ответ на открытие процесса вылазит окно с заголовком "5", отказано в доступе (с другими прцессами всё норм). дело в том, что в этом процессе возможно какаято защита. например артмани читает значения из процесса без проблем, а сторонняя программа-кликер с функцией readmem ничего не видит в процессе. скачал AutoIt только вчера, такчто для меня нужно время чтобы разобраться в принципах програмирования в нем. надеюсь на помощь :smile:
читать память хочу из MTA-SA, мультиплеер для сан-андреас.

пробовалось так:
Код:
#include <nomadmemory.au3>
$ProcessID = 1520
$adres = 0x00B6F2E4
$DllInformation = _MemoryOpen($ProcessID)
$xcor = (_MemoryRead($adres, $DllInformation, 'float'))
MsgBox (1,"Значение",$xcor,"")

в ответ "0" :(. хотя данный код норм показывает значения из других процессов.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
edward
1. Возможно недостаточно полномочий, попробуйте с правами администратора.
2. Адрес ваш с учетом базы целевого модуля? Учтите, что модуль не обязательно будет иметь статический базовый адрес.
3. Сам адрес может быть динамическим. После "перезагрузки" процесса этот адрес может быть пустым.
 
Автор
E

edward

Новичок
Сообщения
10
Репутация
0
1. попробовал с правами администратора, не помогло.
2. "с учетом базы целевого модуля"? это как? слишком сложно.
3. адреса всегда статичны, они у меня сохранены и их значения может показывать только артмани :(
7AkZ9z2.png




минуточку, а с правами администратора имеется ввиду обращение к памяти? это чтото нада в скрипте писать? :blink:
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
edward сказал(а):
минуточку, а с правами администратора имеется ввиду обращение к памяти? это чтото нада в скрипте писать? :blink:
Попробуйте написать
Код:
#RequireAdmin
 
Автор
E

edward

Новичок
Сообщения
10
Репутация
0
alex33 сказал(а):
edward сказал(а):
минуточку, а с правами администратора имеется ввиду обращение к памяти? это чтото нада в скрипте писать? :blink:
Попробуйте написать
Код:
#RequireAdmin
не помогло :'(
Iomy185.png


может есть какието другое методы чтения памяти? артмани же както читает ее .
 

qqww22

Новичок
Сообщения
115
Репутация
4
В Youtube пиши, 'создание трейнерa, Cheat Engine'.
 
Автор
E

edward

Новичок
Сообщения
10
Репутация
0
qqww22 сказал(а):
В Youtube пиши, 'создание трейнерa, Cheat Engine'.
не совсем понятно чем мне поможет трейнер :blink:. да и обойти защиту мультиплеера от запуска читэнжина мне пока не удалось (да и не было пока надобности). мне нужно мгновенно считывать точные координаты персонажа в игре и использовать в дальнейшем для бота. в данный момент координаты считываю с карты, они очень не точные, затрачивается время и ресурсы на их определение.
 

Prog

Продвинутый
Сообщения
537
Репутация
65
Попробуй прогу из вложения, может сработает.
 

Вложения

  • RM.zip
    4.1 КБ · Просмотры: 20

Prog

Продвинутый
Сообщения
537
Репутация
65
По размеру наверное можно было догадаться что написано не на AutoIt, но в принципе переписать можно. Исходник на PB.
Код:
Procedure EnableDebugPrivilege() ; Устанавливаем для нашего процесса приоритет отладчика (иначе большинство процессов будут отказывать в доступе) 
  tkp.TOKEN_PRIVILEGES : tkp\PrivilegeCount = 1 
  ;Добавляем привилегию SeDebugPrivilege 
  ;Получаем токен нашего процесса 
  OpenProcessToken_(#INVALID_HANDLE_VALUE, #TOKEN_ADJUST_PRIVILEGES|#TOKEN_QUERY, @hToken) 
  ;Получаем LUID привилегии 
  If LookupPrivilegeValue_(#Null, "SeDebugPrivilege", tkp\Privileges[0]\Luid)=0 
    CloseHandle_(hToken); 
    ProcedureReturn 0 
  EndIf 
  tkp\Privileges[0]\Attributes = #SE_PRIVILEGE_ENABLED; 
  ;Добавляем привилегию к процессу 
  AdjustTokenPrivileges_(hToken, #False, tkp, SizeOf(TOKEN_PRIVILEGES),tkp, @ReturnLength); 
  If GetLastError_() <> #ERROR_SUCCESS 
    ProcedureReturn 0 
  EndIf 
  ProcedureReturn 1 
EndProcedure

EnableDebugPrivilege()

PID = Val(InputRequester("", "Введите PID процесса", ""))
If PID
  ProcessHandle = OpenProcess_(#PROCESS_VM_READ, #False, PID)
  If ProcessHandle
    *baseaddress = $B6F2E4
    ReadProcessMemory_(Processhandle, *baseaddress, @Info.Float, 4, 0)
    MessageRequester("", StrF(Info\f))
  Else
    MessageRequester("", "Нет такого ИД")
  EndIf
EndIf
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
edward
Можете попытаться еще следующим образом:
http://autoit-script.ru/index.php?topic=18838.msg113580#msg113580

В зависимости от адреса два примера.

Пример:
Код:
#Include "FMemory.au3"

SetPrivilege('SeDebugPrivilege', 1)

If _FMem_Open(1234) Then
	ConsoleWrite(_FMem_Read2(0x00B6F2E4, 'float') & @CRLF)
	_FMemClose()
EndIf


Если не сработает, то так:
Код:
#Include "FMemory.au3"

SetPrivilege('SeDebugPrivilege', 1)

Local $tModule
; ---
If _FMem_Open(1234) Then
	$tModule = _FMem_GetModuleBasicInfo('proxy_sa.exe')

	If IsDllStruct($tModule) Then _
		ConsoleWrite(_FMem_Read2($tModule.ModulePtr + 0x00B6F2E4, 'float') & @CRLF)

	_FMem_Close()
EndIf

Func _FMem_GetModuleBasicInfo($sModule)
    Local $tModules, $aRes, $pModule
    ; ---
    $tModules = DllStructCreate("ptr[1024]")
    $tMODULEINFO = DllStructCreate( "ptr BaseOfDll; dword SizeOfImage; ptr EntryPoint; ptr ModulePtr;" )

    $aRes = DllCall( "psapi.dll", "int", "EnumProcessModules", "ptr", $FMem_hMem, "ptr", DllStructGetPtr($tModules), "dword", DllStructGetSize($tModules), "dword*", 0 )
    If Not @Error And $aRes[4] Then
        For $Module = 1 To ( $aRes[4] / 4 ) Step 1
            $pModule = DllStructGetData($tModules, 1, $Module)

            $aRes = DllCall( "psapi.dll", "dword", "GetModuleBaseNameW", "ptr", $FMem_hMem, "ptr", $pModule, "wstr", "", "dword", 260 )
            If Not @Error And $aRes[3] = $sModule Then
                $aRes = DllCall( "psapi.dll", "bool", "GetModuleInformation", "ptr", $FMem_hMem, "ptr", $pModule, "struct*", $tMODULEINFO, "dword", DllStructGetSize( $tMODULEINFO ) )

                $tMODULEINFO.ModulePtr = $pModule
                Return $tMODULEINFO
            EndIf
        Next
    EndIf
    Return 0
EndFunc
 
Автор
E

edward

Новичок
Сообщения
10
Репутация
0
несовсем уверен правильнео ли я читаю из консоли :-\
Код:
Local $sOutput
 While True
    $sOutput &= ConsoleRead()
    If @error Then ExitLoop
    Sleep(25)
WEnd
MsgBox(4096, "", "Прочитанное: " & @LF & @LF & $sOutput)

если верно, то в ответ мне приходит пустая строка, и в первом и во втором примере.

кстати в первом примере вылазила ошибка _FMemClose(). наверно правильно _FMem_Close()



дело в том, что AutoIt мне нужен только для чтения памяти. бот у меня написан в другой проге. кликерман, если это имеет значение. им я думаю читать координаты, считанные ранее автоитом, из ини или буфера обмена. а эти ConsoleRead и ConsoleWrite пока для меня чтото новое и неизведанное.
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
edward
Я же для примера скинул... Впишите этот код в редактор и запустите, результат отобразится ниже в "логе".

Меня вот что интересует:
Куда вы собрались передавать результат чтения процесса? Нельзя ли все делать "на месте"?
 
Автор
E

edward

Новичок
Сообщения
10
Репутация
0
Prog сказал(а):
По размеру наверное можно было догадаться что написано не на AutoIt, но в принципе переписать можно. Исходник на PB.

да, впринципе переписать можно :whistle:. но не мной :'(


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

firex сказал(а):
edward
Я же для примера скинул... Впишите этот код в редактор и запустите, результат отобразится ниже в "логе".

Меня вот что интересует:
Куда вы собрались передавать результат чтения процесса? Нельзя ли все делать "на месте"?

я в редакторе кнопочки "запустить" не вижу ;D. а по поводу куда передать результат, написал выше.


нашел кнопочку "go". в логе в двух примерах :
Код:
>"C:\Program Files (x86)\AutoIt3\SciTE\..\autoit3.exe" /ErrorStdOut "C:\Users\Администратор\Desktop\out.au3"    
>Exit code: 0    Time: 0.08866
 

firex

AutoIT Гуру
Сообщения
943
Репутация
208
edward
Ну тогда давайте искать в чем ошибка.

Код:
#RequireAdmin
#Include "FMemory.au3"

SetPrivilege('SeDebugPrivilege', 1)

Local $iPid, $tModule, $vRes
; ---
$iPid = ProcessExists('proxy_sa.exe')
If $iPid Then
	If _FMem_Open($iPid) Then
		; 1
		$vRes = _FMem_Read2(0x00B6F2E4, 'float')
		_DbgReport('1: ' & $vRes)
		
		; 2
		$tModule = _FMem_GetModuleBasicInfo('proxy_sa.exe')
		If IsDllStruct($tModule) Then
			$vRes = _FMem_Read2($tModule.ModulePtr + 0x00B6F2E4, 'float')
			_DbgReport('2: ' & $vRes)
		Else
			_DbgReport('GetModuleBasicInfo failed')
		EndIf

		_FMem_Close()
	Else
		_DbgReport('Open failed, ' & @Error)
	EndIf
Else
	_DbgReport('Process not found!')
EndIf


Func _DbgReport($sMsg)
	MsgBox(0, 0, $sMsg)
EndFunc


Func _FMem_GetModuleBasicInfo($sModule)
    Local $tModules, $aRes, $pModule
    ; ---
    $tModules = DllStructCreate("ptr[1024]")
    $tMODULEINFO = DllStructCreate( "ptr BaseOfDll; dword SizeOfImage; ptr EntryPoint; ptr ModulePtr;" )

    $aRes = DllCall( "psapi.dll", "int", "EnumProcessModules", "ptr", $FMem_hMem, "ptr", DllStructGetPtr($tModules), "dword", DllStructGetSize($tModules), "dword*", 0 )
    If Not @Error And $aRes[4] Then
        For $Module = 1 To ( $aRes[4] / 4 ) Step 1
            $pModule = DllStructGetData($tModules, 1, $Module)

            $aRes = DllCall( "psapi.dll", "dword", "GetModuleBaseNameW", "ptr", $FMem_hMem, "ptr", $pModule, "wstr", "", "dword", 260 )
            If Not @Error And $aRes[3] = $sModule Then
                $aRes = DllCall( "psapi.dll", "bool", "GetModuleInformation", "ptr", $FMem_hMem, "ptr", $pModule, "struct*", $tMODULEINFO, "dword", DllStructGetSize( $tMODULEINFO ) )

                $tMODULEINFO.ModulePtr = $pModule
                Return $tMODULEINFO
            EndIf
        Next
    EndIf
    Return 0
EndFunc
 
Автор
E

edward

Новичок
Сообщения
10
Репутация
0
первое окошко "1: 0", второе окошко "GetModuleBasicInfo failed"
 
Автор
E

edward

Новичок
Сообщения
10
Репутация
0
:laugh: ура, у меня получилось!!! правда не совсем понятно как. но всеже, методом проб и ошибок удалось добиться того чего хотел.
Код:
#RequireAdmin
#include <RMemory.au3>

SetPrivilege("SeDebugPrivilege", 1)

$AllodsProcessName = "MTA: San Andreas"
$ProcessID = WinGetProcess($AllodsProcessName,"")

If $ProcessID = -1 Then
    MsgBox(4096, "Ошибка", "Процесс не найден.")
    Exit
 EndIf

$adres_x =0x00B6F2E4
$adres_y =0x00B6F2E8
$DllInformation = _MemoryOpen($ProcessID)

While IniRead ( "conf.ini", "default", "search", 0 ) = 1
    $hTimer = TimerInit()
    $xcor = (_MemoryRead($adres_x, $DllInformation, 'float'))
    $ycor = (_MemoryRead($adres_y, $DllInformation, 'float'))
	IniWrite ( "conf.ini", "default", "x", $xcor  )
	IniWrite ( "conf.ini", "default", "y", $ycor  )
	Sleep ( 100)
WEnd

причем, SetPrivilege("SeDebugPrivilege", 1) из NomadMemory.au3 и FMemory.au3 не дает никаких результатов :blink:

вот что у меня в RMemory.au3
Код:
#region _Memory

Func _MEMORYOPEN($IV_PID, $IV_DESIREDACCESS = 2035711, $IV_INHERITHANDLE = 1)
	If Not ProcessExists($IV_PID) Then
		SetError(1)
		Return 0
	EndIf
	Local $AH_HANDLE[2] = [DllOpen("kernel32.dll")]
	If @error Then
		SetError(2)
		Return 0
	EndIf
	Local $AV_OPENPROCESS = DllCall($AH_HANDLE[0], "int", "OpenProcess", "int", $IV_DESIREDACCESS, "int", $IV_INHERITHANDLE, "int", $IV_PID)
	If @error Then
		DllClose($AH_HANDLE[0])
		SetError(3)
		Return 0
	EndIf
	$AH_HANDLE[1] = $AV_OPENPROCESS[0]
	Return $AH_HANDLE
EndFunc


Func _MEMORYREAD($IV_ADDRESS, $AH_HANDLE, $SV_TYPE = "dword")
	If Not IsArray($AH_HANDLE) Then
		SetError(1)
		Return 0
	EndIf
	Local $V_BUFFER = DllStructCreate($SV_TYPE)
	If @error Then
		SetError(@error + 1)
		Return 0
	EndIf
	DllCall($AH_HANDLE[0], "int", "ReadProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
	If Not @error Then
		Local $V_VALUE = DllStructGetData($V_BUFFER, 1)
		Return $V_VALUE
	Else
		SetError(6)
		Return 0
	EndIf
EndFunc


Func _MEMORYWRITE($IV_ADDRESS, $AH_HANDLE, $V_DATA, $SV_TYPE = "dword")
	If Not IsArray($AH_HANDLE) Then
		SetError(1)
		Return 0
	EndIf
	Local $V_BUFFER = DllStructCreate($SV_TYPE)
	If @error Then
		SetError(@error + 1)
		Return 0
	Else
		DllStructSetData($V_BUFFER, 1, $V_DATA)
		If @error Then
			SetError(6)
			Return 0
		EndIf
	EndIf
	DllCall($AH_HANDLE[0], "int", "WriteProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
	If Not @error Then
		Return 1
	Else
		SetError(7)
		Return 0
	EndIf
EndFunc


Func _MEMORYCLOSE($AH_HANDLE)
	If Not IsArray($AH_HANDLE) Then
		SetError(1)
		Return 0
	EndIf
	DllCall($AH_HANDLE[0], "int", "CloseHandle", "int", $AH_HANDLE[1])
	If Not @error Then
		DllClose($AH_HANDLE[0])
		Return 1
	Else
		DllClose($AH_HANDLE[0])
		SetError(2)
		Return 0
	EndIf
EndFunc


Func SETPRIVILEGE($PRIVILEGE, $BENABLE)
    Const $TOKEN_ADJUST_PRIVILEGES = 0x0020
    Const $TOKEN_QUERY = 0x0008
	Const $SE_PRIVILEGE_ENABLED = 0x0002

	Local $HTOKEN, $SP_AUXRET, $SP_RET, $HCURRPROCESS, $NTOKENS, $NTOKENINDEX, $PRIV
	$NTOKENS = 1
	$LUID = DllStructCreate("dword;int")
	If IsArray($PRIVILEGE) Then $NTOKENS = UBound($PRIVILEGE)
	$TOKEN_PRIVILEGES = DllStructCreate("dword;dword[" & (3 * $NTOKENS) & "]")
	$NEWTOKEN_PRIVILEGES = DllStructCreate("dword;dword[" & (3 * $NTOKENS) & "]")
	$HCURRPROCESS = DllCall("kernel32.dll", "hwnd", "GetCurrentProcess")
	$SP_AUXRET = DllCall("advapi32.dll", "int", "OpenProcessToken", "hwnd", $HCURRPROCESS[0], "int", BitOR($TOKEN_ADJUST_PRIVILEGES, $TOKEN_QUERY), "int*", 0)
	If $SP_AUXRET[0] Then
		$HTOKEN = $SP_AUXRET[3]
		DllStructSetData($TOKEN_PRIVILEGES, 1, 1)
		$NTOKENINDEX = 1
		While $NTOKENINDEX <= $NTOKENS
			If IsArray($PRIVILEGE) Then
				$PRIV = $PRIVILEGE[$NTOKENINDEX - 1]
			Else
				$PRIV = $PRIVILEGE
			EndIf
			$RET = DllCall("advapi32.dll", "int", "LookupPrivilegeValue", "str", "", "str", $PRIV, "ptr", DllStructGetPtr($LUID))
			If $RET[0] Then
				If $BENABLE Then
					DllStructSetData($TOKEN_PRIVILEGES, 2, $SE_PRIVILEGE_ENABLED, (3 * $NTOKENINDEX))
				Else
					DllStructSetData($TOKEN_PRIVILEGES, 2, 0, (3 * $NTOKENINDEX))
				EndIf
				DllStructSetData($TOKEN_PRIVILEGES, 2, DllStructGetData($LUID, 1), (3 * ($NTOKENINDEX - 1)) + 1)
				DllStructSetData($TOKEN_PRIVILEGES, 2, DllStructGetData($LUID, 2), (3 * ($NTOKENINDEX - 1)) + 2)
				DllStructSetData($LUID, 1, 0)
				DllStructSetData($LUID, 2, 0)
			EndIf
			$NTOKENINDEX += 1
		WEnd
		$RET = DllCall("advapi32.dll", "int", "AdjustTokenPrivileges", "hwnd", $HTOKEN, "int", 0, "ptr", DllStructGetPtr($TOKEN_PRIVILEGES), "int", DllStructGetSize($NEWTOKEN_PRIVILEGES), "ptr", DllStructGetPtr($NEWTOKEN_PRIVILEGES), "int*", 0)
		$F = DllCall("kernel32.dll", "int", "GetLastError")
	EndIf
	$NEWTOKEN_PRIVILEGES = 0
	$TOKEN_PRIVILEGES = 0
	$LUID = 0
	If $SP_AUXRET[0] = 0 Then Return 0
	$SP_AUXRET = DllCall("kernel32.dll", "int", "CloseHandle", "hwnd", $HTOKEN)
	If Not $RET[0] And Not $SP_AUXRET[0] Then Return 0
	Return $RET[0]
EndFunc


Func _MEMORYPOINTERREAD($IV_ADDRESS, $AH_HANDLE, $AV_OFFSET, $SV_TYPE = "dword")
	If IsArray($AV_OFFSET) Then
		If IsArray($AH_HANDLE) Then
			Local $IV_POINTERCOUNT = UBound($AV_OFFSET) - 1
		Else
			SetError(2)
			Return 0
		EndIf
	Else
		SetError(1)
		Return 0
	EndIf
	Local $IV_DATA[2], $I
	Local $V_BUFFER = DllStructCreate("dword")
	For $I = 0 To $IV_POINTERCOUNT
		If $I = $IV_POINTERCOUNT Then
			$V_BUFFER = DllStructCreate($SV_TYPE)
			If @error Then
				SetError(@error + 2)
				Return 0
			EndIf
			$IV_ADDRESS = "0x" & Hex($IV_DATA[1] + $AV_OFFSET[$I])
			DllCall($AH_HANDLE[0], "int", "ReadProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
			If @error Then
				SetError(7)
				Return 0
			EndIf
			$IV_DATA[1] = DllStructGetData($V_BUFFER, 1)
		ElseIf $I = 0 Then
			DllCall($AH_HANDLE[0], "int", "ReadProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
			If @error Then
				SetError(7)
				Return 0
			EndIf
			$IV_DATA[1] = DllStructGetData($V_BUFFER, 1)
		Else
			$IV_ADDRESS = "0x" & Hex($IV_DATA[1] + $AV_OFFSET[$I])
			DllCall($AH_HANDLE[0], "int", "ReadProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
			If @error Then
				SetError(7)
				Return 0
			EndIf
			$IV_DATA[1] = DllStructGetData($V_BUFFER, 1)
		EndIf
	Next
	$IV_DATA[0] = $IV_ADDRESS
	Return $IV_DATA
EndFunc


Func _MEMORYPOINTERWRITE($IV_ADDRESS, $AH_HANDLE, $AV_OFFSET, $V_DATA, $SV_TYPE = "dword")
	If IsArray($AV_OFFSET) Then
		If IsArray($AH_HANDLE) Then
			Local $IV_POINTERCOUNT = UBound($AV_OFFSET) - 1
		Else
			SetError(2)
			Return 0
		EndIf
	Else
		SetError(1)
		Return 0
	EndIf
	Local $IV_STRUCTDATA, $I
	Local $V_BUFFER = DllStructCreate("dword")
	For $I = 0 To $IV_POINTERCOUNT
		If $I = $IV_POINTERCOUNT Then
			$V_BUFFER = DllStructCreate($SV_TYPE)
			If @error Then
				SetError(@error + 3)
				Return 0
			EndIf
			DllStructSetData($V_BUFFER, 1, $V_DATA)
			If @error Then
				SetError(8)
				Return 0
			EndIf
			$IV_ADDRESS = "0x" & Hex($IV_STRUCTDATA + $AV_OFFSET[$I])
			DllCall($AH_HANDLE[0], "int", "WriteProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
			If @error Then
				SetError(9)
				Return 0
			Else
				Return $IV_ADDRESS
			EndIf
		ElseIf $I = 0 Then
			DllCall($AH_HANDLE[0], "int", "ReadProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
			If @error Then
				SetError(3)
				Return 0
			EndIf
			$IV_STRUCTDATA = DllStructGetData($V_BUFFER, 1)
		Else
			$IV_ADDRESS = "0x" & Hex($IV_STRUCTDATA + $AV_OFFSET[$I])
			DllCall($AH_HANDLE[0], "int", "ReadProcessMemory", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER), "int", "")
			If @error Then
				SetError(3)
				Return 0
			EndIf
			$IV_STRUCTDATA = DllStructGetData($V_BUFFER, 1)
		EndIf
	Next
EndFunc


Func _MEMORYGETBASEADDRESS($AH_HANDLE, $IHEXDEC = 0)
	Local $IV_ADDRESS = 1048576
	Local $V_BUFFER = DllStructCreate("dword;dword;dword;dword;dword;dword;dword")
	Local $VDATA
	Local $VTYPE
	If Not IsArray($AH_HANDLE) Then
		SetError(1)
		Return 0
	EndIf
	DllCall($AH_HANDLE[0], "int", "VirtualQueryEx", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER))
	If Not @error Then
		$VDATA = Hex(DllStructGetData($V_BUFFER, 2))
		$VTYPE = Hex(DllStructGetData($V_BUFFER, 3))
		While $VTYPE <> "00000080"
			DllCall($AH_HANDLE[0], "int", "VirtualQueryEx", "int", $AH_HANDLE[1], "int", $IV_ADDRESS, "ptr", DllStructGetPtr($V_BUFFER), "int", DllStructGetSize($V_BUFFER))
			$VDATA = Hex(DllStructGetData($V_BUFFER, 2))
			$VTYPE = Hex(DllStructGetData($V_BUFFER, 3))
			If Hex($IV_ADDRESS) = "01000000"  Then ExitLoop
			$IV_ADDRESS += 65536
		WEnd
		If $VTYPE = "00000080"  Then
			SetError(0)
			If $IHEXDEC = 1 Then
				Return Dec($VDATA)
			Else
				Return $VDATA
			EndIf
		Else
			SetError(2)
			Return 0
		EndIf
	Else
		SetError(3)
		Return 0
	EndIf
EndFunc


Func _MEMORYMODULEGETBASEADDRESS($IPID, $SMODULE)
	If Not ProcessExists($IPID) Then Return SetError(1, 0, 0)
	If Not IsString($SMODULE) Then Return SetError(2, 0, 0)
	Local $PSAPI = DllOpen("psapi.dll")
	Local $HPROCESS
	Local $PERMISSION = BitOR(2, 1024, 8, 16, 32)
	If $IPID > 0 Then
		Local $HPROCESS = DllCall("kernel32.dll", "ptr", "OpenProcess", "dword", $PERMISSION, "int", 0, "dword", $IPID)
		If $HPROCESS[0] Then
			$HPROCESS = $HPROCESS[0]
		EndIf
	EndIf
	Local $MODULES = DllStructCreate("ptr[1024]")
	Local $ACALL = DllCall($PSAPI, "int", "EnumProcessModules", "ptr", $HPROCESS, "ptr", DllStructGetPtr($MODULES), "dword", DllStructGetSize($MODULES), "dword*", 0)
	If $ACALL[4] > 0 Then
		Local $IMODNUM = $ACALL[4] / 4
		Local $ATEMP
		For $I = 1 To $IMODNUM
			$ATEMP = DllCall($PSAPI, "dword", "GetModuleBaseNameW", "ptr", $HPROCESS, "ptr", PTR(DllStructGetData($MODULES, 1, $I)), "wstr", "", "dword", 260)
			If $ATEMP[3] = $SMODULE Then
				DllClose($PSAPI)
				Return PTR(DllStructGetData($MODULES, 1, $I))
			EndIf
		Next
	EndIf
	DllClose($PSAPI)
	Return SetError(-1, 0, 0)
EndFunc

#endregion _Memory


если ктото знает в чем разница, скажите, будет интересно.

и еще вопрос, как обьединить строки в одну, ну типа есть $n=33 и из ($n, ";", 123, ";", "да") получить "33;123;да" ? в справке не нашел такого.
 

alex33

Скриптер
Сообщения
1,457
Репутация
186
edward [?]
как обьединить строки в одну, ну типа есть $n=33 и из ($n, ";", 123, ";", "да") получить "33;123;да" ? в справке не нашел такого.
Функция
Код:
_ArrayToString
 
Автор
E

edward

Новичок
Сообщения
10
Репутация
0
да, можно и через массив, но я надеялся что можно както попроще. оказалось что можно проще некудо:
Код:
$n=33
$res = $n&";"&123&";"&"да"
MsgBox (1,"Значение",$res,"")
 
Верх