Да, модуль здесь может означать загруженный в память экзешник. Тогда узнать адрес его загрузки можно приведённой ниже функцией PsGetModuleBase. Но если процесс 64-битный, то скрипт нужно запускать 64-битным АНК. Я там также поправил функцию чтения памяти (типы параметров и возвращаемых значений), чтобы работала с 64-битным процессом. Попробуйте, прочитает ли что-то этот пример. Укажите имя процесса или его PID, а в качестве имени модуля — имя процесса.
SetFormat, Integer, H
process_name = Explorer.exe
module_name = Explorer.exe
offset = 0x1D1F60
module_addr := PsGetModuleBase( process_name, module_name )
If( module_addr = 0 ) {
MsgBox, Ошибка
Return
}
MsgBox, % module_addr
number := GetAddressValue( process_name, module_addr + offset )
MsgBox, %number%
;================================ Функции ==================================
GetAddressValue(PID_or_Name, ReadAddress) {
Process, Exist, %PID_or_Name%
If( ErrorLevel = 0 ) {
Return "Ошибка #0"
}
PID := ErrorLevel
ReadSize = 4
VarSetCapacity(Buf, ReadSize, 0)
PROCESS_VM_READ = 0x10
hProcess := DllCall("OpenProcess", UInt, PROCESS_VM_READ
, Int, False
, UInt, PID, "Ptr")
If(!hProcess) {
Return "Ошибка #1"
}
Ret := DllCall("ReadProcessMemory", Ptr, hProcess
, Ptr, ReadAddress
, Ptr, &Buf
, Ptr, ReadSize
, Ptr, 0)
DllCall("CloseHandle", Ptr, hProcess)
If(!Ret) {
Return "Ошибка #2"
}
Result := NumGet(Buf, 0, "UInt")
Return Result
}
PsGetModuleBase(Process, DllName) ; Process = PID or Name.
{
static StructSize, AddrOffset, NameOffset, MODULEENTRY32
static FLAGS := 0x18 ; TH32CS_SNAPMODULE | TH32CS_SNAPMODULE32
static INVALID_HANDLE_VALUE := -1
If (!StructSize) {
If (A_PtrSize = 8)
StructSize := 1080, AddrOffset := 24, NameOffset := 48
Else
StructSize := 1064, AddrOffset := 20, NameOffset := 32
VarSetCapacity(MODULEENTRY32, StructSize, 0)
NumPut(StructSize, MODULEENTRY32, 0, "uint")
}
Process, Exist, %Process%
If (ErrorLevel = 0)
Return 0
snapMod := DllCall("CreateToolhelp32Snapshot", "uint", FLAGS
, "uint", ErrorLevel
, "ptr")
If (snapMod = INVALID_HANDLE_VALUE) {
Return 0
}
If DllCall("Module32FirstW", "ptr", snapMod, "ptr", &MODULEENTRY32)
{
pszModule := &MODULEENTRY32 + NameOffset
If DllCall("lstrcmpiW", "wstr", DllName, "ptr", pszModule) = 0
{
DllCall("CloseHandle", "ptr", snapMod)
Return NumGet(MODULEENTRY32, AddrOffset, "ptr")
}
While DllCall("Module32NextW", "ptr", snapMod, "ptr", &MODULEENTRY32)
{
If DllCall("lstrcmpiW", "wstr", DllName, "ptr", pszModule) = 0
{
DllCall("CloseHandle", "ptr", snapMod)
Return NumGet(MODULEENTRY32, AddrOffset, "ptr")
}
}
}
DllCall("CloseHandle", "ptr", snapMod)
Return 0
}