1 (изменено: LeGoo, 2014-08-20 22:03:33)

Тема: AHK: Поиск в памяти процесса

В общем есть процесс proc.exe, он использует programm.dll, мне нужно найти адрес значения "Остальное: ", который при каждом перезапуске программы меняется. Не могу сообразить, как найти сразу в AHK адрес текста в памяти и поместить его в переменную, ручками уже устал.

Начинать поиск нужно с 0x019F2018 по 0x01A00000.
За ранее спасибо!

2

Re: AHK: Поиск в памяти процесса

Попробуйте найти указатель на адрес с помощью Artmoney, и поищите на этом форуме тему (ключевое слово: указатель).

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

3

Re: AHK: Поиск в памяти процесса

Я нашел нужный указатель. Что теперь дальше?

4

Re: AHK: Поиск в памяти процесса

Если он от раза к разу не меняется, тогда поищите темы про чтение памяти другого процесса. Код для этого тут постили неоднократно.

5 (изменено: Странникх, 2014-08-25 02:46:37)

Re: AHK: Поиск в памяти процесса

Решил все таки открыть для себя, что такое DllCall и как ей пользоваться. Начать решил с чтения памяти в процессе, поэтому попробовал разобраться в некоторых темах с кодом по чтению памяти:
http://forum.script-coding.com/viewtopic.php?id=8735
http://forum.script-coding.com/viewtopic.php?id=9705
http://forum.script-coding.com/viewtopic.php?id=7735
Надо сказать, что больше половины кодов в этих ссылках мне не понятны. Нашел оптимальную для начала изучения тему:
http://forum.script-coding.com/viewtopic.php?id=8241
На основе кода, написанным creature.ws решил понять как читать память нужного мне процесса, заранее зная нужное значение.

processName := "имя процесса"
readAddress := 0x2ECD0254

Numpad0::
    if ProcessReadMemory(readAddress, processName) < 10
        Click 123 234
    return


ProcessReadMemory(address, processIDorName, type := "Int", numBytes := 4) {
    VarSetCapacity(buf, numBytes, 0)

    Process Exist, %processIDorName%
    if !processID := ErrorLevel
        throw Exception("Invalid process name or process ID:`n`n""" . processIDorName . """")

    if !processHandle := DllCall("OpenProcess", "Int", 24, "UInt", 0, "UInt", processID, "Ptr")
        throw Exception("Failed to open process.`n`nError code:`t" . A_LastError)

    result := DllCall("ReadProcessMemory", "Ptr", processHandle, "Ptr", address, "Ptr", &buf, "Ptr", numBytes, "PtrP", numBytesRead, "UInt")

    if !DllCall("CloseHandle", "Ptr", processHandle, "UInt") && !result
        throw Exception("Failed to close process handle.`n`nError code:`t" . A_LastError)

    if !result
        throw Exception("Failed to read process memory.`n`nError code:`t" . A_LastError)

    if !numBytesRead
        throw Exception("Read 0 bytes from the`n`nprocess:`t" . processIDorName . "`naddress:`t" . address)

    return (type = "Str")
        ? StrGet(&buf, numBytes)
        : NumGet(buf, type)
}

Однако тут тоже не все шибко понятно, не смотря на то, что я прочитал статью Функции. Поэтому прошу кого-нибудь из опытных переписать данный код с комментариями на каждое действие, чтобы понять как, что, когда этот код делает.

Добавлено:
Наткнулся на удивительную вещь - https://github.com/Kalamity/SC2-MacroTr … Memory.ahk
Обновляется и по сей день. Вроде бы там есть тоже самое, что мне нужно, но пока не могу понять как это применить.

6

Re: AHK: Поиск в памяти процесса

Имена использованных функций говорят сами за себя, по-моему. Открывается процесс, читается из его памяти число или строка, закрывается процесс. Уточните, что именно вам не понятно.

7

Re: AHK: Поиск в памяти процесса

Функционал я понял как он работает. Я не могу понять много переменных, находящихся в круглых скобках. Например, Ptr или Int, откуда взято Buf и т.д.

8

Re: AHK: Поиск в памяти процесса

Т.е. как откуда взято buf? Вот он создаётся:


VarSetCapacity(buf, numBytes, 0)

Что касается "понять переменные", то я не совсем понимаю, что это значит.

9

Re: AHK: Поиск в памяти процесса

Понять переменные в смысле отследить откуда они появились в скрипте и что они делают. С buf теперь понятно откуда он.

10

Re: AHK: Поиск в памяти процесса

Какие именно? Ptr и Int — это не переменные, а типы следующих за ними через запятую значений (параметров вызываемой функции). О них говорится в описании DllCall.

11 (изменено: slavik26092001, 2018-08-01 18:32:15)

Re: AHK: Поиск в памяти процесса

http://forum.script-coding.com/misc.php … mp;preview