1

Тема: AHK: Чтение значени VirtualProtect

Добрый вечер.
Нашел функцию которая меняет у модуля в процессе. Я не программист поэтому не знаю как правильно назвать то что оно меняет.

VirtualProtectEx(hProcess, lpAddress, dwSize, flNewProtect, lpflOldProtect) {
    if(!hProcess) {
        ErrorLevel := ERROR_INVALID_HANDLE
        return 0
    }
    
    dwRet := DllCall("VirtualProtectEx", "UInt", hProcess, "UInt", lpAddress, "UInt", dwSize, "UInt", flNewProtect, "UInt *", lpflOldProtect)
    if(dwRet == 0) {
        ErrorLEvel := ERROR_FREE_MEMORY
        return 0
    }
    
    ErrorLevel := ERROR_OK
    return dwRet
}

А как считать разрешение или флаги которые стоят у модуля?

2

Re: AHK: Чтение значени VirtualProtect

Привет.
Не представляю, с чем конкретно мучаетесь, но позволю себе предположить, что было бы полезно попробовать функционал этой прекрасной либы от RHCP. Ко всем методам даны исчерпывающие описания. Мне, после нахождения этого класса больше не потребовалось что-либо ещё искать. С тех пор и пользую для чтения и манипуляций со строками и значениями, не без известного CheatEngine, конечно.

3

Re: AHK: Чтение значени VirtualProtect

А что вы модулем называете?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

4

Re: AHK: Чтение значени VirtualProtect

teadrinker пишет:

А что вы модулем называете?

DLL модуль в процессе. Адрес страницы модуля в процессе я могу получить, а вот как получить Memory Protection Constants этой страницы я не знаю.
https://msdn.microsoft.com/ru-ru/librar … s.85).aspx

KusochekDobra пишет:

С тех пор и пользую для чтения и манипуляций со строками и значениями, не без известного CheatEngine, конечно.

К сожалению мне надо именно с помощью ahk.

5

Re: AHK: Чтение значени VirtualProtect

Так все манипуляции и происходят посредством работы скрипта. Класс предоставляет лишь удобную реализацию для этого. CE нужен для тонкой настройки и, благодаря имеющемуся функционалу отладчика-дизассемблера - понимания исходной картинки адресного пространства. Чтобы добиться того же с помощью одного только AHK, надо написать подобный CE инструмент, а раз он уже есть, то имеет ли смысл заморачиваться? Не могли бы Вы пояснить, для чего конкретно нужно искомое? Может быть есть иные пути решения.

6

Re: AHK: Чтение значени VirtualProtect

Dworkin пишет:

DLL модуль в процессе.

Так в коде, который вы привели, ни о каком модуле речи не идёт, там функция меняет атрибуты защиты указанного региона процесса, хэндл которого hProcess.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Чтение значени VirtualProtect

teadrinker пишет:

Так в коде, который вы привели, ни о каком модуле речи не идёт, там функция меняет атрибуты защиты указанного региона процесса, хэндл которого hProcess.

Получается я хотел бы функцию которая считывает атрибуты защиты указанного региона процесса, а не изменяет его.

8

Re: AHK: Чтение значени VirtualProtect

Судя по всему, VirtualQueryEx

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

9 (изменено: Dworkin, 2017-10-29 23:40:28)

Re: AHK: Чтение значени VirtualProtect


#NoEnv
Process Exist, process.exe
PID := ErrorLevel
hProcess := openProcess(PID)

MemoryAddress := 0x99999 ; для примера адрес

DllCall("VirtualQueryEx", "ptr", hProcess, "ptr", MemoryAddress, "ptr", &test, "ptr", 1)
msgbox % &test

openProcess(dwPID, dwRights = 0x1F0FFF) {
    hProcess := DllCall("OpenProcess"
                        , "UInt", dwRights
                        , "int",  0
                        , "UInt", dwPID
                        , "Uint")
    if(hProcess == 0) {
        ErrorLevel := ERROR_OPEN_PROCESS
        return 0
    }
    
    ErrorLevel := ERROR_OK
    return hProcess
}

Функция выдает какие-то цифры, если перевести в hex то там не атрибут защиты.
Увидел это

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366775(v=vs.85).aspx

, но msgbox % &test.Protect выдает пустое значение.

10 (изменено: teadrinker, 2017-10-30 00:54:59)

Re: AHK: Чтение значени VirtualProtect

GetAccessProtection(PID, addr)  {
   static PROCESS_QUERY_INFORMATION := 0x400
   hProcess := DllCall("OpenProcess", UInt, PROCESS_QUERY_INFORMATION, UInt, 0, UInt, PID, Ptr)
   VarSetCapacity(MEMORY_BASIC_INFORMATION, size := A_PtrSize*4 + 4*2 + A_PtrSize, 0)
   if !res := DllCall("VirtualQueryEx", Ptr, hProcess, Ptr, addr, Ptr, &MEMORY_BASIC_INFORMATION, Ptr, size)
      MsgBox, % "Error: " A_LastError
   DllCall("CloseHandle", Ptr, hProcess)
   if res
      Return  NumGet(MEMORY_BASIC_INFORMATION, A_PtrSize*4 + 4, "UInt")
}

Проверить можно так:

Run, notepad,,, PID
WinWait, ahk_pid %PID%
RB := new RemoteBuffer(PID, 4)              ; для проверки создаём буфер в адресном пространстве блокнота с правами чтения и записи
MsgBox, % Format("{:#x}", RB.ptr)           ; адрес буфера
MsgBox, % GetAccessProtection(PID, RB.ptr)  ; должно вернуть 4 — PAGE_READWRITE

GetAccessProtection(PID, addr)  {
   static PROCESS_QUERY_INFORMATION := 0x400
   hProcess := DllCall("OpenProcess", UInt, PROCESS_QUERY_INFORMATION, UInt, 0, UInt, PID, Ptr)
   VarSetCapacity(MEMORY_BASIC_INFORMATION, size := A_PtrSize*4 + 4*2 + A_PtrSize, 0)
   if !res := DllCall("VirtualQueryEx", Ptr, hProcess, Ptr, addr, Ptr, &MEMORY_BASIC_INFORMATION, Ptr, size)
      MsgBox, % "Error: " A_LastError
   DllCall("CloseHandle", Ptr, hProcess)
   if res
      Return  NumGet(MEMORY_BASIC_INFORMATION, A_PtrSize*4 + 4, "UInt")
}

class RemoteBuffer
{
   __New(PID, size)  {
      static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20
           , PROCESS_VM_READ := 0x10, MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
         
      if !(this.hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
         Return
      
      if !(this.ptr := DllCall("VirtualAllocEx", Ptr, this.hProc, Ptr, 0, Ptr, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
         Return, "", DllCall("CloseHandle", Ptr, this.hProc)
      
      this.hHeap := DllCall("GetProcessHeap", Ptr)
   }
   
   __Delete()  {
      DllCall("VirtualFreeEx", Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
      DllCall("CloseHandle", Ptr, this.hProc)
      DllCall("HeapFree", Ptr, this.hHeap, UInt, 0, Ptr, this.pHeap)
   }
   
   Read(size, offset = 0)  {
      (this.pHeap && DllCall("HeapFree", Ptr, this.hHeap, UInt, 0, Ptr, this.pHeap))
      this.pHeap := DllCall("HeapAlloc", Ptr, this.hHeap, UInt, HEAP_ZERO_MEMORY := 0x8, Ptr, size, Ptr)
      if !DllCall("ReadProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, this.pHeap, Ptr, size, Int, 0)
         Return, 0, DllCall("MessageBox", Ptr, 0, Str, "Не удалось прочитать данные`nОшибка " A_LastError, Str, "", UInt, 0)
      Return this.pHeap
   }
   
   Write(pLocalBuff, size, offset = 0)  {
      if !res := DllCall("WriteProcessMemory", Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, Ptr, size, PtrP, writtenBytes)
         DllCall("MessageBox", Ptr, 0, Str, "Не удалось записать данные`nОшибка " A_LastError, Str, "", UInt, 0)
      Return writtenBytes
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Чтение значени VirtualProtect

Спасибо, работает, но как понять что к чему относится 2 и тд?

12

Re: AHK: Чтение значени VirtualProtect

Memory Protection Constants

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder