26

Re: AHK: Запись строки в память

Формально расширение исполняемого файла может быть любым:

FileCopy %windir%\notepad.exe, *.txt
ComObjCreate("WScript.Shell").Exec("notepad.txt")
FileCopy %windir%\notepad.exe, *.unknown_extension
Run notepad.unknown_extension

Второй случай будет работать и из командной строки.

27

Re: AHK: Запись строки в память

wisgest пишет:
FileCopy %windir%\notepad.exe, *.txt

Так не работает, особенно учитывая, что встроенной переменной windir в AHK не существует. Но даже если переименовать notepad.exe в notepad.txt, на Windows 10 ни первый способ, ни второй не работает.

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

28

Re: AHK: Запись строки в память

teadrinker пишет:

встроенной переменной windir в AHK не существует.

Но ведь и

#NoEnv

не указана.

29

Re: AHK: Запись строки в память

На Win7 работает.

30

Re: AHK: Запись строки в память

wisgest пишет:

Но ведь и

#NoEnv

не указана.

А, точно, просто запускал не сохраняя в файл через Shell.Exec. Ну всё равно, на 10 не работает даже, если просто notepad.exe переместить в другую папку.

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

31

Re: AHK: Запись строки в память

А вот скомпилированный AHK-файл с изменённым расширением запустился и первым, и вторым способом, с соответствующим названием процесса в диспетчере задач.

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

32

Re: AHK: Запись строки в память

teadrinker Для записи числа в память я использовал Ваш код. Он прекрасно работает для конкретного адреса, но после перезапуска процесса адрес меняется. Его можно узнать средствами AHK не используя CheatEngine, зная указатели?

33

Re: AHK: Запись строки в память

Не совсем понял вопрос. Какие указатели Вы имеете в виду?

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

34

Re: AHK: Запись строки в память

В программе CheatEngine чтоб не икать каждый раз новый адрес после перезагрузки процесса, существуют указатели. Они сохраняются в таблице программы. Этот указатель ищет новый адрес строки. Вот и хочу узнать, можно ли средствами AHK находить указатели, зная все показатели смещения.

35

Re: AHK: Запись строки в память

Ну вот, раньше были непонятные указатели, а теперь ещё показатели добавились.
Думаю, что можно, но понимаю о чём идёт речь лишь примерно, с CheatEngine никогда не имел дела.

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

36

Re: AHK: Запись строки в память

Vicoriyan, указатели, как правило, содержат базовый адрес от которого начинается структура данных, а смещения от него, содержат адреса значений этой структуры, которые Вы ищете для манипуляций. Насколько могу судить по своей скромной практике, именно смещения последовательно находятся следуя от базового адреса, а не наоборот, так что если они вам известны, то Вы вероятнее всего знаете и базовый адрес. Исключением может быть ситуация, в которой адресное пространство было изменено очередным апдейтом софта, в котором происходит поиск, тогда новые данные вымещают начала структур старых данных, сдвигая их вверх или вниз и если последние не подвергались изменениям в ходе обновления, то часто бывает, что смещения остаются прежними.

teadrinker, наверное в этом и есть суть вопроса - зная смещения, найти базовый адрес. И хотя в том же CheatEngine этот поиск не занимает больше минуты, возвращая за очень редким исключением больше одного результата, было бы интересно узнать альтернативу.

37

Re: AHK: Запись строки в память

Не, всё равно не понимаю, что именно нужно искать, и по каким признакам.

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

38

Re: AHK: Запись строки в память

KusochekDobra пишет:

наверное в этом и есть суть вопроса - зная смещения, найти базовый адрес.

Зная расстояние между домами, определить их адрес? Как это возможно?

39

Re: AHK: Запись строки в память

Как-то вы рассуждаете, не как программисты.
Если набор смещений уникален, он отождествляется одним адресом, если нет, некоторым количеством, а не со всеми сразу. Количество памяти выделенное процессу не в планетарных масштабах. Если было известно старое значение, область поиска можно сузить. Зная всё это и значение, которое расположено по пути смещений, тот же CheatEngine успешно совершает процедуру поиска. Значит - это возможно.

40

Re: AHK: Запись строки в память

Ну, если известны значения членов структуры, тогда можно найти, конечно.

41 (изменено: Vicoriyan, 2018-01-24 14:03:58)

Re: AHK: Запись строки в память

teadrinker Нужно найти конечный адрес зная смещение. Согласен, не сильно понятно написал.
По простому и как я это понимаю выглядит так. Конечный адрес всегда имеет базовый адрес. Базовый адрес меняется, но смещения никогда, они уникальны. Базовый адрес например 100, у нас 4 смещения.
Это например смещение 1 = 3; 2 = 7; 3 = 25; 4 = 8. Конечный адрес у нас получается 143. Это 100+3+7+25+8=143. С перезагрузкой процесса у нас базовый адрес меняется например на 120, то конечный адрес у нас получится уже не 143, а 163. Так вот, поменять значение нельзя с базового адреса, а только с конечного. Вот мне и нужно узнать конечный адрес, зная смещения. В CheatEngine это называется указателями. Как бы CheatEngine зная эти смещения, он находит базовый адрес. Вот и хочу узнать, можно ли средствами AHK такое проделывать.

42

Re: AHK: Запись строки в память

Вы больше запутываете такой постановкой вопроса, чем объясняете, что в свою очередь указывает на то, что Вы сами плохо понимаете как "оно" устроено.

Если к этому относиться серьёзно, то хорошо бы почитать полезной литературы, или на крайний случай, статьи на Хабре, спросив у Гугля что-то вроде - как устроено адресное пространство приложения, а ещё лучше, полистать форумы, которые целенаправленно освящают функционал программ, вроде "CheatEngine"("CE") и их сферу применения. В общих же чертах, картина рисуется так:

У каждого, загруженного в оперативную память процесса, адресное пространство локально изнутри и начинается с 0x00000000(x32), но глобально, оно подразумевается как базовый адрес приложения, являющийся смещением в адресном пространстве оперативной памяти операционной системы(среды). Поэтому, когда производятся манипуляции в том же "CE", все литеральные представления адресов начинаются с "TargetProgrammName.exe". Иными словами и очень грубо говоря, понимаемый под базовым адресом программы "TargetProgrammName.exe" - это указатель на всю структуру приложения в оперативной памяти среды. Его значение может меняться.

Указатели же, которые интересны в нашем случае - константны в локальном пространстве адресов процесса. Они не меняются при перезагрузке самой программы и среды. Эти указатели нужны самой программе, чтобы "знать", как она была распределена в памяти и содержат адреса, в которых начинаются её структуры(логика, данные, ... ). Меняются они только в случае изменения кода, происходящего, например, в результате апдейтов.

Такой указатель, "как бы" ссылается на начало структуры, от чего его можно было бы назвать и ссылкой и из-за характерного поведения, похожего на свойство объекта(когда манипуляции над ссылкой на объект, приводят к желаемым изменениям самого объекта), но это не так. Об этом тоже стоит почитать. Важной аналогией здесь является то, что смещения от указателя применяются к адресу содержащемуся в нём, который в свою очередь и меняется при перезагрузке.

Следуя по пути смещений от начала структуры получается доступ к её членам, расположенным хаотичным образом в адресном пространстве процесса.

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

Неправильно описал это в 36 посте.

Поправьте пожалуйста, если я где-то опять не корректен.

43

Re: AHK: Запись строки в память

Vicoriyan пишет:

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

К базовому адресу прибавьте смещение, вот и будет конечный адрес. Или вам и базовый не известен? Тогда кроме смещений нужно знать текущие значения членов структуры, чтобы найти эту структуру в памяти процесса поиском по этой памяти. Тут, правда, может найтись не одна такая последовательность чисел, и тогда встанет вопрос, которая из них является искомой структурой. Можно поискать их адреса в секции данных программы (её статической памяти) — адрес структуры где-то там может храниться. Если, конечно, он не хранится в какой-то другой динамической структуре, уже адрес которой хранится в секции данных.