1 (изменено: Pr1mera, 2013-05-19 22:22:14)

Тема: AHK: Условие по значению адреса в памяти

Всем вечер добрый. Возник такой вопрос.
Необходимо сделать, чтобы скрипт проверял в приложении (test.exe) по нажатию на кнопку (gButton2) наличие опр. текста по адресу. Адрес имеется - 03AA2310. Надо чтобы он проверял там наличие фразы "You are lose" и если оно там имеется, то выполнял опр действия, если нет - ничего не делал. Возможно ли это сделать?

2

Re: AHK: Условие по значению адреса в памяти

Возможно. Поищите по форуму упоминание ProcessReadMemory

3

Re: AHK: Условие по значению адреса в памяти

Если я правильно нашел, то это?

Button2:
processName := "test.exe"
readAddress := 03AA2310
    if ProcessReadMemory(readAddress, processName) = "You are lose"
{
  выполнение действий
}      
else
{
}
    return

4 (изменено: creature.ws, 2013-05-20 01:31:18)

Re: AHK: Условие по значению адреса в памяти

В этом случае ProcessReadMemory вернёт 4 байта в виде Int.
Если приложение хранит строки в системной ANSI кодировке, то каждый символ в строке занимает 1 байт и считывать следует 12 байт, по числу символов в строке, иначе, если строки в UTF-16LE, то байт нужно получить 24.

str := ProcessReadMemory(0x3AA2310, "test.exe", "Str", 12)
if (StrGet(&str, "CP0") = "You are lose") {
    ; действия
}


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)
}

5

Re: AHK: Условие по значению адреса в памяти

Возникла проблема. А что делать если адрес постоянно меняется?
Сначала был 0468AC9E, потом 0486AC9E, потом 0474AC9E. Меняются четвертый и пятый номер. Можно ли сделать поиск что-то наподобие: 04??AC9E

6 (изменено: creature.ws, 2013-05-20 15:54:07)

Re: AHK: Условие по значению адреса в памяти

А что делать если адрес постоянно меняется?

Искать неизменный адрес по которому хранится число являющееся адресом, косвенно или явно указывающим на искомую строку.

Можно ли сделать поиск что-то наподобие: 04??AC9E

Можно, но это неправильно и медленно, следовательно — нельзя

7 (изменено: Pr1mera, 2013-05-20 16:46:29)

Re: AHK: Условие по значению адреса в памяти

Пробовал найти указатель на адрес. Ничего не находил ни CE, ни ArtMoney. Далее по плану поиск указателя по началу блока памяти. Находит много указателей, но после отсеивания ничего не находит. Что делать?
----
Дела ещё хуже. Теперь адрес изменился на 0507A986, потом на 03D2AC9E. Поиск по блоку памяти все так же выдает ноли.
----
Все-таки при отсеивании он высветил мне указатель на адрес с нужным мне значением. Но после перезапуска оказалось, что оно не верное (<НЕТ>)...

8 (изменено: Pr1mera, 2013-05-20 17:36:34)

Re: AHK: Условие по значению адреса в памяти

И так, методом долгих мучений я получил искомый указатель - "test1.dll"+00212A24 + 62c8
Как теперь внедрить поиск именно по нему в этот скрипт?

9 (изменено: creature.ws, 2013-05-20 18:56:50)

Re: AHK: Условие по значению адреса в памяти

Как, по-вашему, следует интерпретировать строку "test1.dll"+00212A24 + 62c8?
(Базовый адрес модуля + число = указатель на указатель) + смещение = начало строки?
Если так, то базовый адрес dll можно получить с помощью GetModuleInformation.

10 (изменено: Pr1mera, 2013-05-20 19:05:39)

Re: AHK: Условие по значению адреса в памяти

Это взято из CE. Именно по этому адресу находится текст "You are lose". Как в этом случае получить базовый адрес?

11

Re: AHK: Условие по значению адреса в памяти

Понимаю, предлагаете мне разобраться с CE, выяснить что означает такой тип записи и не задавать глупых вопросов
Это произойдёт, рано или поздно.

12

Re: AHK: Условие по значению адреса в памяти

Да нет. Мне тоже надо учиться, поэтому и спросил. Ладно, сейчас буду пытать дальше.

13 (изменено: Pr1mera, 2013-05-21 00:36:02)

Re: AHK: Условие по значению адреса в памяти

На мое удивление, я полный идиот. Оказывается имеется лог-файл, куда сохраняются все изменения в нужном адресе.
И так. Теперь вопрос такой.
Имеется файл в "Документах", пользователи сами будут указывать его адрес в GUI скрипта.
Внутри он имеет формат (как пример):

[23:51:53] - Test: You win!

Необходимо сделать считывание текста из этого файла (а его размер и кол-во строк растет со временем работы программы), и выполнение условия: если там имеется фраза "You are lose" то последует опр. действие. Так же проблема в том, что история (сам файл) не перезаписывается, следовательно скрипт будет выполнять действие как только найдет эту фразу в файле (даже если она находится в самом начале). Как сделать действие(условие) скрипта именно на последнюю строку в файле? Может можно сделать проверку последней строки при изменении размера файла?
п.с. Между строками в этом лог-файле по пустой строке, после последней существенной строки так же пустая строка (обычный перенос).

14

Re: AHK: Условие по значению адреса в памяти

Темы с чтением лог-файлов по популярности уступают лишь, пожалуй, автокликерам - поиск тебе в помощь. Например, в этой теме пост #13 содержит практически готовое решение.

15 (изменено: serzh82saratov, 2013-05-21 12:29:04)

Re: AHK: Условие по значению адреса в памяти

Внутри он имеет формат (как пример):
[23:51:53] - Test: You win!

Полностью готовое решение в данный момент есть и на первой странице, даже поиск ненужен:
AHK: Чтение из лога и вывод сообщения
Переменную "Pattern":
Pattern := "S).*(\[\d+:\d+:\d+]) Ты продал(\R|$)"
Заменить на:
Pattern := "S).*(\[\d+:\d+:\d+]) - Test: You win!(\R|$)"
и готово.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16 (изменено: Pr1mera, 2013-05-21 17:26:42)

Re: AHK: Условие по значению адреса в памяти

serzh82saratov пишет:

Внутри он имеет формат (как пример):
[23:51:53] - Test: You win!

Полностью готовое решение в данный момент есть и на первой странице, даже поиск ненужен:
AHK: Чтение из лога и вывод сообщения
Переменную "Pattern":
Pattern := "S).*(\[\d+:\d+:\d+]) Ты продал(\R|$)"
Заменить на:
Pattern := "S).*(\[\d+:\d+:\d+]) - Test: You win!(\R|$)"
и готово.

Да, спасибо! Но тут есть проблема. Он повторяет это действие постоянно, ибо находит строку " - Test: You win!", хотя она находится в самом начале лог-файла. Возможно ли сделать, чтобы скрипт брал в расчет только 10 последних строк (допустим) в файле? Или в следующий раз при проверке начинал после этой строки?

17

Re: AHK: Условие по значению адреса в памяти

LogFile = d:\chatlog.txt 
loop {
   If InStr(GetNewLine(LogFile), "Test: You win")
      MsgBox Совпадение
}

GetNewLine(filename)
{
   static old
   static new
   if !old
   {
      FileGetSize, old, %filename%
      new := old
   }
   while old = new
   {
      sleep 100
      FileGetSize, new, %filename%
   }
   old := new
   Loop, read, %filename%
      if A_LoopReadLine
         last := A_LoopReadLine
   return last
}

18

Re: AHK: Условие по значению адреса в памяти

Он повторяет это действие постоянно, ибо находит строку " - Test: You win!", хотя она находится в самом начале лог-файла. Возможно ли сделать, чтобы скрипт брал в расчет только 10 последних строк (допустим) в файле? Или в следующий раз при проверке начинал после этой строки?

Код по ссылке именно так и работает. В каждом цикле проверка начинается с того места где была завершена до этого. Привидите код так как вы его используете.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19 (изменено: Pr1mera, 2013-05-21 22:09:50)

Re: AHK: Условие по значению адреса в памяти

Уже решил проблему удалением этого файла после завершения действий.
А так, выглядело вот так:

    IfWinExist, Test
    {
        Sleep, 5000
        repeat    ;
            Gui, Submit, NoHide
            Sleep, Time1 * 60 * 1000
            If Check1 = 1
            {
                IfWinActive, Test
                {
                    LogFile = %A_MyDocuments%\chatlog.txt 
                    Pattern := "S)(\[\d+:\d+:\d+]) You win!(\R|$)" , sPos := 1
                    FileRead, Log, *t %LogFile%
                    If RegExMatch(Log, Pattern, Match, sPos)
                    {
                        Действия, действия, действия
                    }
                    sPos := StrLen(Log), (sPos = 0) ? sPos := 1 
                    Sleep 150
                }
                else
                {
                
                }
            }
            else
            {
            
            }
        }
        return
    }
    else
    {
        MsgBox, 16, WARNING, Test.exe Не запущен!, 3
        return
    }

20

Re: AHK: Условие по значению адреса в памяти

Уже решил проблему удалением этого файла после завершения действий.

Творческий подход...

А так, выглядело вот так:

Совершенно непонятный огрызок кода.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

21

Re: AHK: Условие по значению адреса в памяти

Имеется GUI с возможность установки галочки (Check1) и значения времени (Time1).
Вот этот "огрызок" когда применяется при установке галочки Check1. При условии, что окно Test есть в процессах + он активен. Делать AND к условиям я не стал, ибо так мне более понятно что куда и откуда.

22 (изменено: serzh82saratov, 2013-05-21 23:02:34)

Re: AHK: Условие по значению адреса в памяти

+ OFF

Вы при каждой проверке назначаете стартовую позицию "sPos := 1"
И потом удивляетесь что:

Он повторяет это действие постоянно, ибо находит

туже строку.
Эти переменные нужно вынести в автовыполнение:

 LogFile = %A_MyDocuments%\chatlog.txt 
 Pattern := "S)(\[\d+:\d+:\d+]) You win!(\R|$)" , sPos := 1

и ненадо никого удалять.

Если непоняли про что я, то просто запустите только этот код из ссылки:


LogFile = d:\chatlog.txt 
Pattern := "S).*(\[\d+:\d+:\d+]) You win!(\R|$)" , sPos := 1

Loop {
    FileRead, Log, *t %LogFile%
    If RegExMatch(Log, Pattern, Match, sPos)
    {
        MsgBox Появилась нужная строка в лог файле.`n`nПоследний тэг: %Match1%
    }
    sPos := StrLen(Log), (sPos = 0) ? sPos := 1 
    Sleep 150
}

MsgBox появится только при появлении нового совпадения в логе.

Если у вас есть вопросы по файлу лога задавайте его в соответствующей теме. К адресу памяти лог файл не имеет отношения.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

23

Re: AHK: Условие по значению адреса в памяти

Помогите мне с подобным скриптом.
Есть - program.exe
Address - main.dll+0x111111
значение float - 2,5

нужен скрипт, который бы переписывал значение по этому адресу
обратно на 2,5 если вдруг оно изменилось