<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: Доступ к памяти других процессов]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=2734</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=2734&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Доступ к памяти других процессов».]]></description>
		<lastBuildDate>Wed, 29 Apr 2009 03:22:25 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Доступ к памяти других процессов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=22308#p22308</link>
			<description><![CDATA[<p>Пример записи данных в память другого процесса. В данном случае записывается одно четырёхбайтное число. Если запись не удаётся, причиной может быть то, что под этот адрес память процессу не выделялась.<br /></p><div class="codebox"><pre><code>#NoEnv

ProcessName = program.exe         ; Имя процесса.
Address = 0x0042E1CE              ; Адрес, куда писать.
Data = 215125125                  ; Что писать.
Size = 4                          ; Сколько байт писать.

VarSetCapacity(Buf, Size, 0)      ; Буфер, для записываемых данных.

NumPut(Data, Buf, 0, &quot;UInt&quot;)      ; Данные - в буфер.

PROCESS_VM_WRITE = 0x20           ; Права на процесс.
PROCESS_VM_OPERATION = 0x8

Process, Exist, %ProcessName%     ; Поиск процесса.

If(!ErrorLevel) {
  MsgBox, Процесс не найден.
  ExitApp
}

PID := ErrorLevel                 ; Идентификатор процесса будет в ErrorLevel.

hProcess := DllCall(&quot;OpenProcess&quot;, &quot;UInt&quot;, PROCESS_VM_WRITE | PROCESS_VM_OPERATION
                                 , &quot;Int&quot;,  False
                                 , &quot;UInt&quot;, PID)
If(!hProcess) {
  MsgBox, Не удалось открыть процесс.
  ExitApp
}

Ret := DllCall(&quot;WriteProcessMemory&quot;, &quot;UInt&quot;, hProcess
                                   , &quot;UInt&quot;, Address
                                   , &quot;UInt&quot;, &amp;Buf
                                   , &quot;UInt&quot;, Size
                                   , &quot;UInt&quot;, 0)

DllCall(&quot;CloseHandle&quot;, &quot;UInt&quot;, hProcess) ; Освобождение хэндла процесса.

If(!Ret) {
  MsgBox, Не удалось записать.
  ExitApp
}

MsgBox, Готово.</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Wed, 29 Apr 2009 03:22:25 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=22308#p22308</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Доступ к памяти других процессов]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=18883#p18883</link>
			<description><![CDATA[<p>Каждый 32-разрядный процесс имеет своё, независимое от других процессов, адресное пространство памяти, простирающееся от 0 до 0xFFFFFFFF. Это означает, что в любом процессе есть, например, адрес 0x7C800000, но у разных процессов ему будут соответствовать разные ячейки физической памяти. А у некоторых не будет соответствовать ничего, если память под этот адрес процессу не выделялась.</p><p>Отсюда необходимость дополнительных телодвижений, продемонстрированных в нижеследующем примере. Этот скрипт читает число из памяти Блокнота. Адрес взят чисто для примера - как показывает Process Explorer, по этому адресу загружается библиотека kernel32.dll.</p><div class="codebox"><pre><code>#NoEnv

ProcessName = notepad.exe         ; Имя процесса.
ReadAddress = 0x7C800000          ; Адрес, откуда читать.
ReadSize = 4                      ; Сколько байт читать.
VarSetCapacity(Buf, ReadSize, 0)  ; Буфер, куда считывать.

PROCESS_VM_READ = 0x10            ; Права на процесс.

Process, Exist, %ProcessName%     ; Поиск процесса.

If(!ErrorLevel) {
  MsgBox, Процесс не найден.
  ExitApp
}

PID := ErrorLevel                 ; Идентификатор процесса будет в ErrorLevel.

hProcess := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_VM_READ
                                 , Int, False
                                 , UInt, PID)
If(!hProcess) {
  MsgBox, Не удалось открыть процесс.
  ExitApp
}

Ret := DllCall(&quot;ReadProcessMemory&quot;, UInt, hProcess
                                  , UInt, ReadAddress
                                  , UInt, &amp;Buf
                                  , UInt, ReadSize
                                  , UInt, 0)

DllCall(&quot;CloseHandle&quot;, UInt, hProcess) ; Освобождение хэндла процесса.

If(!Ret) {
  MsgBox, Не удалось прочитать.
  ExitApp
}

Result := NumGet(Buf, 0, &quot;UInt&quot;)  ; Считывание из буфера в переменную.

MsgBox, %Result%</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 29 Jan 2009 05:22:41 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=18883#p18883</guid>
		</item>
	</channel>
</rss>
