1

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

Здравствуйте! Просьба. Необходимо записать строку текста в память процесса. Уверен, сделать это просто, т.к. в том же CheatEngine это дело пары кликов.
Суть: Есть процесс (primer.dll или primer.exe, не принципиально), адрес памяти (конкретный) - например, 07831A6E. Тип данных в нем - текст. Самому мучаться - устал уже.
Буду благодарен, если напишите готовую функцию. Я пытался сделать такого типа: WriteText(text, address) и ReadText(text, address) << ничего не получается. Числовые значения без проблем, а текст никак.

2

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

Drygok пишет:

primer.dll или primer.exe, не принципиально

Тут у вас путаница, имя процесса всегда *.exe, вроде бы, или я чего-то не знаю?

Drygok пишет:

Числовые значения без проблем, а текст никак.

Покажите, как числовые значения записываете. Там со строками большой разницы нет. Нужно лишь строку сначала в локальный буфер записать (StrPut(), учесть кодировку), затем через WriteProcessMemory записать по нужному адресу в чужой процесс, указав размер.

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

3

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

teadrinker пишет:

имя процесса всегда *.exe, вроде бы, или я чего-то не знаю?

Не только exe, а любые исполняемые файлы, например *.com.

4

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

Значит я не в теме. dll — тоже исполняемый файл. Пример из диспетчера задач?

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

5

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

Я разве dll исполняемый файл?

6 (изменено: teadrinker, 2017-08-01 03:03:57)

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

Ну, в определённом смысле. А разве .com — исполняемый файл?

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

7

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

Com - да.

A COM file is a type of simple executable file.

https://en.wikipedia.org/wiki/COM_file
А так как dll сам себя не может запустить, то поэтому не пишут, что он executable file.
https://en.wikipedia.org/wiki/Dynamic-link_library

8

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

Оказалось, действительно, процесс *.com может существовать, проверил.

Malcev пишет:

Не только exe, а любые исполняемые файлы

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

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

9 (изменено: belyankin12, 2017-08-01 09:25:42)

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

в том же CheatEngine это дело пары кликов.

Это дело пары кликов благодаря стараниям разработчиков. Банально: сделайте какой-нибудь себе gui интерфейс на скрипт с кнопочками. У вас тоже все операции будут выполняться кликами, но вы то знаете, сколько процессов выполняет скрипт и сколько сил ушло на то, чтобы написать это.

10

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

teadrinker пишет:

Тут у вас путаница, имя процесса всегда *.exe, вроде бы, или я чего-то не знаю?

teadrinker пишет:

Значит я не в теме. dll — тоже исполняемый файл. Пример из диспетчера задач?

http://i.imgur.com/o1q8Z3M.png

11

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

teadrinker пишет:

Покажите, как числовые значения записываете.

WriteProcessMemory(title,addresse,wert,size)  
{ 
VarSetCapacity(idvar,32,0) 
VarSetCapacity(processhandle,32,0) 
VarSetCapacity(value, 32, 0) 
NumPut(wert,value,0,Uint) 
address=%addresse% 
WinGet ,idvar,PID,%title% 
processhandle:=DllCall("OpenProcess","Uint",0x38,"int",0,"int",idvar) 
Bvar:=DllCall("WriteProcessMemory","Uint",processhandle,"Uint",address+0,"Uint",&value,"Uint",size,"Uint",0) 
}

12 (изменено: teadrinker, 2017-08-01 14:49:14)

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

Ну, это не код, это танец с бубном.
Для числа и для строки, как я уже писал выше, способ одинаковый:

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%
   DllCall("CloseHandle", Ptr, hProc)
   Return writtenBytes
}

Использование для числа:

process := "MyProcess.exe"  ; указать имя процесса
address := 0x1234567        ; указать адрес, куда писать данные
number := 12345             ; число, которое нужно записать

res := WriteNumToProcessMemory(number, process, address)
MsgBox, Записано %res% байт

WriteNumToProcessMemory(number, sProcessName, pAddress)  {
   size := VarSetCapacity(buff, 4, 0)
   NumPut(number, buff)
   Process, Exist, % sProcessName
   Return WriteProcessMemory(ErrorLevel, pAddress, &buff, size)
}

Использование для строки:

process := "MyProcess.exe"  ; указать имя процесса
address := 0x1234567        ; указать адрес, куда писать данные
cp := "cp1200"              ; указать кодировку, в которой строка должна быть записана в процесс
str := "Моя строка"

res := WriteStringToProcessMemory(str, cp, process, address)
MsgBox, Записано %res% байт

WriteStringToProcessMemory(string, cp, sProcessName, pAddress)  {
   size := VarSetCapacity(buff, StrPut(string, cp) * ( (cp = "utf-16" || cp = "cp1200") ? 2 : 1 ), 0)
   StrPut(string, &buff, cp)
   Process, Exist, % sProcessName
   Return WriteProcessMemory(ErrorLevel, pAddress, &buff, size)
}
Drygok пишет:

http://i.imgur.com/o1q8Z3M.png

Наверно, тут какие-то фокусы с подменой имени процесса, фиг знает.

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

13

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

teadrinker пишет:
Malcev пишет:

Не только exe, а любые исполняемые файлы

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

Почему не любые?
Dll не исполняемый файл, поэтому он и не может существовать как отдельный процесс.
Я еще scr проверил - он в диспетчере задач появляется.

14

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

Спасибо за помощь, решено.

15

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

Malcev пишет:

Почему не любые?

Например, vbs — тоже считается исполняемым файлом.

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

16

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

Я не вижу, чтобы здесь было написано, что vbs - исполняемый файл.
https://en.wikipedia.org/wiki/VBScript
А написано, что:

A Windows Script File (WSF) is styled after XML. A WSF file can include multiple VBS files. As a result, WSF files provide a means for code reuse: a library of classes or functions can be stored in one or more .vbs files, which can be included in .wsf files, so the functionality can be reused in a modular way. The files have extension .wsf and can be executed using wscript.exe or cscript.exe, just as a .vbs file can.

То есть могут быть исполнены с помощью стороннего файла.

17

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

Если хотите позанудствовать, то ссылка на вики, где интерпретируемые и содержащие байт код файлы упомянуты с оговоркой - неважное такое доказательство.

18

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

in some contexts a file containing bytecode or scripting language instructions may also be considered executable.

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

19

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

Запускаются напрямую (помимо exe): com, bat, cmd, scr, msi, pif.

20

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

ypppu, bat, cmd  - это пакетные файлы.
Msi запускается msiexec.

21

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

Переименовать exe в cmd или bat - запустится. Msi сам не запустится, точно.

22

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

Интересно, почему так происходит?

23

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

Ответ.
Здесь:

HKEY_CLASSES_ROOT\batfile\shell\open\command

«Пакетный» файл отправляется на исполнение, где происходит разбор содержимого его заголовка, и он исполняется, как любой другой PE-файл.

24 (изменено: stealzy, 2017-08-06 20:17:22)

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

Malcev пишет:

«Пакетный» файл отправляется на исполнение, где

интерпретатор видит, что файл нифига ни текстовый, и пытается понять, что ему подсунули из мета-данных.
Если вас это удивляет, можете еще переименовать jpg → gif, mp3 → wav, zip → rar, rtf → doc, etc. Главное, чтобы интерпретатор был общим или из той же сферы применения.

Кстати, в диспетчере отображается под именем файла, подозреваю, что в скриншоте Drygok с .dll ситуация аналогична.

25

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

stealzy пишет:

подозреваю, что в скриншоте Drygok с .dll ситуация аналогична

А подробнее?
Если мы запускаем переименованный exe в bat, то в диспетчере видим bat.
Как эта ситуация может быть аналогична dll?