1

Тема: AHK: Запись в память процесса. Ошибка 998

Скопипастил код из этой темы http://forum.script-coding.com/viewtopic.php?id=12861. При попытке записать число в память процесса возникает ошибка 998. Что это за ошибка? И правильно ли я все делаю?


>^t::
	pid := 8744
	num := 0
	address := 0x3663C80
	WriteNumToProcessMemory(num, pid, address)
	return

WriteNumToProcessMemory(number, pPID, pAddress)  {
   size := VarSetCapacity(buff, 4, 0)
   NumPut(number, buff)
   Return WriteProcessMemory(pPID, pAddress, &buff, size)
}

WriteProcessMemory(PID, pAddress, pLocalBuff, size)  {
   static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20
   
   if !hProc := DllCall("OpenProcess", UInt, PROCESS_VM_OPERATION|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr)  {
      MsgBox, Не удалось открыть процесс! Ошибка %A_LastError%
      return
   }
   if !DllCall("WriteProcessMemory", Ptr, hProc, Ptr, pAddress, Ptr, pLocalBuff, Ptr, size, PtrP, writtenBytes)
      MsgBox, Не удалось записать данные! Ошибка %A_LastError%		; Ошибка возникает здесь. A_LastError = 998
   DllCall("CloseHandle", Ptr, hProc)
   Return writtenBytes
}

В статье про DllCall ничего про A_LastError нет. Гугл говорит что 998 это "Неверная попытка доступа к адресу памяти".
Я правильно понимаю, что под pAddress понимается отступ относительно адреса процесса? CheatEngine показывает нужный адрес как "process.exe + 0x3663C80". На всякий случай попробовал указать и абсолютный адрес, результат тот же. Сильно не пинайте, делаю это впервые.

2

Re: AHK: Запись в память процесса. Ошибка 998

lost пишет:

Что это за ошибка?

Описание ошибок, возвращаемых winapi-функциями, здесь.

lost пишет:

В статье про DllCall ничего про A_LastError нет

Плохо смотрели, есть (если только под статьёй не имеете в виду перевод на этом сайте, он устарел).

lost пишет:

Я правильно понимаю, что под pAddress понимается отступ относительно адреса процесса?

Под pAddress понимается адрес в адресном пространстве процесса, к адресу процесса он не имеет отношения.

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

3 (изменено: lost, 2021-10-05 00:45:52)

Re: AHK: Запись в память процесса. Ошибка 998

teadrinker, Мне пока плохо дается вся эта адресная математика, извиняюсь если задаю слишком глупые вопросы. Адрес который скрыт под process.exe в CE и начало адресного пространства процесса это не одно и то же, и мне нужно сначала найти адрес process.exe в том же пространстве, прибавить смещение и тогда я получу нужный? Верно?

4

Re: AHK: Запись в память процесса. Ошибка 998

Нет, ничего прибавлять не нужно. Адресное пространство процесса ни откуда не отсчитывается, а просто начинается с нуля.

lost пишет:

CheatEngine показывает нужный адрес как "process.exe + 0x3663C80"

Я не спец по CheatEngine, но скорее всего 0x3663C80 — это то, что нужно. Но, может быть, этот адрес не постоянный, а меняется от запуска к запуску.

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

5

Re: AHK: Запись в память процесса. Ошибка 998

teadrinker 0x3663C80 не меняется никогда. После перезапуска нужный адрес также показывается как "process.exe + 0x3663C80". Пробовал записать по этому адресу первым делом. Ошибка 998.

6

Re: AHK: Запись в память процесса. Ошибка 998

Тогда не знаю, может то, что показывает CheatEngine, не соответствует адресу в пространстве процесса.

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

7

Re: AHK: Запись в память процесса. Ошибка 998

Вообще-то, вот эта часть не совсем верная:

WriteNumToProcessMemory(number, pPID, pAddress)  {
   size := VarSetCapacity(buff, 4, 0)
   NumPut(number, buff)
   Return WriteProcessMemory(pPID, pAddress, &buff, size)
}

Правильно так:

WriteNumToProcessMemory(number, PID, address)  {
   VarSetCapacity(buff, 4, 0)
   NumPut(number, buff, "UInt")
   Return WriteProcessMemory(PID, address, &buff, 4)
}

Наверно, я сам скопипастил откуда-то, не посмотрев внимательно.
Хотя проблема вряд ли в этом.

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

8

Re: AHK: Запись в память процесса. Ошибка 998

Cheat engine возвращает базовый адрес+указатель.

9 (изменено: lost, 2021-10-05 08:30:32)

Re: AHK: Запись в память процесса. Ошибка 998

UPD: Добавлю некоторой ясности.
- CE отмечает адрес как статический. 0x3663C80 не меняется никогда. При перезапуске меняетя базовый адрес самого модуля process.exe. Сейчас он равен  0x7ff7b42e0000(подсмотрел в process hacker) и если сложить эти два значения получаю 0x7FF7B7930C80 который CE помечает как "real address" (ранее под абсолютным адресом имел ввиду этот). https://image.prntscr.com/image/EeE0KVfYR_Wi-LuWqekgdw.png
- Ошибка все та же при попытке обнулить значение по адресу 0x7FF7B7930C80.
- Функцию WriteNumToProcessMemory(number, PID, address) обновил.
------
Описание ошибки: "invalid access to memory location". Может ли возникнуть эта ошибка если область памяти защищена от чтения/записи (если верить тому же process hacker)? https://image.prntscr.com/image/kmq3UntzR_uQ6FMDfNAnSg.png В таком случае CE предварительно получает права на запись каким то образом? Там все меняется прекрасно.
------
Malcev, В первом скриншоте адрес и рядом значение. Это значение которое находится по этому адресу, разве нет? Или в этой таблице указываются адреса в которых лежат указатели на искомое значение? Запутался.

10

Re: AHK: Запись в память процесса. Ошибка 998

lost, давайте сначала научимся правильно оформлять посты.
Не имеет смысла оформлять ссылку, как изображение, если это не прямая ссылка на изображение. Используйте прямые ссылки, например:
 
 https://image.prntscr.com/image/EeE0KVfYR_Wi-LuWqekgdw.png
 
В конце предложений нужно ставить точки, например:

Там все меняется прекрасно.

Отредактируйте свои посты.

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

11

Re: AHK: Запись в память процесса. Ошибка 998

На ахк для таких дел есть classmemory.
Пробуйте через нее.

12

Re: AHK: Запись в память процесса. Ошибка 998

teadrinker Насчет изображений. Думал администрация выдает персональные разрешения на вставку изображений, и у меня его пока нет. Перечитал тему, понял что интерпретировал неверно. Ошибку признаю. В этой теме все поправил, а в первой пока нет, т.к прямую ссылку удается вытащить только через ресурсы в исходниках, а вспомнил про тему когда уже выключил ПК(с телефона не знаю как). Надеюсь мне простят если займусь этим позже. Точки постараюсь ставить везде:), уж не обессудьте, мы не со зла. Где-то опечатка, где-то поторопились.

13

Re: AHK: Запись в память процесса. Ошибка 998

Malcev, а вот за библиотеку спасибо! Попробую вечером. Так можно хотя бы исключить варианты с неправильно вставленным кодом. К слову, пробовал прочесть память по указанному адресу в надежде увидеть указатель, но снова ошибка, на сей раз 299 (Only part of a ReadProcessMemory or WriteProcessMemory request was completed).
Открытие процесса с правом доступа на чтение/запись дает нам эти права если область памяти защищена от этих действий(второй скрин, 2 поста назад)? Просто пытаюсь уловить логику, в чем смысл этих защит если любой процесс может открыть любой другой просто указав нужные права. Быть может нужно сначала "снять защиту" от чтения/записи области(вроде этой функцией https://docs.microsoft.com/en-us/window … lprotectex) а потом пытаться что то модифицировать? Мне б знать в какую сторону копать

14

Re: AHK: Запись в память процесса. Ошибка 998

lost пишет:

Где-то опечатка, где-то поторопились.

Бывает, не страшно, если исправляете.

lost пишет:

Мне б знать в какую сторону копать

Ну, вы поняли.

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

15

Re: AHK: Запись в память процесса. Ошибка 998

А что за игра?

16

Re: AHK: Запись в память процесса. Ошибка 998

Malcev, Спасибо еще раз! Не успел даже скачать библиотеку как решение нашлось. Мои самые первые скрипты, которые в основном состояли из копипасты отказывались запускаться на любых версиях AHK, кроме ANSI 32bit, которую я и поставил и благополучно забыл об этом. В документации к библиотеке была строчка

- A 64 bit AHK script should be able to perform pattern scans on a 32 or 64 bit target application without issue.

. Поставил нужную версию и все заработало!

17

Re: AHK: Запись в память процесса. Ошибка 998

svoboden, Вопрос был задан в общем контексте и если я сейчас назову игру то боюсь получу по башке что тема не в том разделе. Вы легко можете узнать название в моих предыдущих темах:)