<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Чтение памяти из процесса.]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=14872&amp;type=atom" />
	<updated>2019-07-22T17:30:21Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=14872</id>
		<entry>
			<title type="html"><![CDATA[Re: AHK: Чтение памяти из процесса.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=134997#p134997" />
			<content type="html"><![CDATA[<p>Никогда не приходилось читать память вручную, но если я правильно понимаю то:<br /></p><div class="codebox"><pre><code>
pid := getPID()
hGame := openProcess(pid)
client := getModuleBaseAddress(&quot;client.dll&quot;, hGame)
engine := getModuleBaseAddress(&quot;engine.dll&quot;, hGame)


openProcess(dwPID, dwRights = 0x1F0FFF) {
    hProcess := DllCall(&quot;OpenProcess&quot;, &quot;UInt&quot;, dwRights
                        , &quot;int&quot;,  0
                        , &quot;UInt&quot;, dwPID
                        , &quot;Uint&quot;)
    if(hProcess == 0) {
        ErrorLevel := ERROR_OPEN_PROCESS
        return 0
    }
    
    ErrorLevel := ERROR_OK
    return hProcess
}

getPID() {
    local dwPID := 0
    WinGet, dwPID, PID, ahk_class Grand theft auto San Andreas ; тут класс окна вашей игры определяется через win spy
    return dwPID
}

getModuleBaseAddress(sModule, hProcess) {
    if(!sModule) {
        ErrorLevel := ERROR_MODULE_NOT_FOUND
        return 0
    }
    
    if(!hProcess) {
        ErrorLevel := ERROR_INVALID_HANDLE
        return 0
    }
    
    dwSize = 1024*4                    ; 1024 * sizeof(HMODULE = 4)
    VarSetCapacity(hMods, dwSize)    
    VarSetCapacity(cbNeeded, 4)        ; DWORD = 4
    dwRet := DllCall(    &quot;Psapi.dll\EnumProcessModules&quot;
                        , &quot;UInt&quot;, hProcess
                        , &quot;UInt&quot;, &amp;hMods
                        , &quot;UInt&quot;, dwSize
                        , &quot;UInt*&quot;, cbNeeded
                        , &quot;UInt&quot;)
    if(dwRet == 0) {
        ErrorLevel := ERROR_ENUM_PROCESS_MODULES
        return 0
    }
    
    dwMods := cbNeeded / 4            ; cbNeeded / sizeof(HMDOULE = 4)
    i := 0
    VarSetCapacity(hModule, 4)        ; HMODULE = 4
    VarSetCapacity(sCurModule, 260)    ; MAX_PATH = 260
    while(i &lt; dwMods) {
        hModule := NumGet(hMods, i*4)
        DllCall(&quot;Psapi.dll\GetModuleFileNameEx&quot;
                , &quot;UInt&quot;, hProcess
                , &quot;UInt&quot;, hModule
                , &quot;Str&quot;, sCurModule
                , &quot;UInt&quot;, 260)
        SplitPath, sCurModule, sFilename
        if(sModule == sFilename) {
            ErrorLevel := ERROR_OK
            return hModule
        }
        i := i + 1
    }
    
    ErrorLevel := ERROR_MODULE_NOT_FOUND
    return 0
}</code></pre></div><p>Посмотрите через читенджин в каком формате хранятся данные по этим адресам и используйте соответствующую функцию из того же UDF. Правда все вышенаписанное может оказаться в корне неверным, повторюсь: я никогда не читал память и мои знания лишь поверхностны.</p>]]></content>
			<author>
				<name><![CDATA[belyankin12]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=34408</uri>
			</author>
			<updated>2019-07-22T17:30:21Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=134997#p134997</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[AHK: Чтение памяти из процесса.]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=134995#p134995" />
			<content type="html"><![CDATA[<p>Добрый день. Изучаю AHK самоучением. Но тут столкнулся с проблемой, которую открытием готового скрипта и последующему изучению не разрешить (тот же самый sampUDF). Есть к примеру Приложение (Игра) и я хочу найти тот же самый Hp. Колдовал с CE, но так дельного ничего и не получилось, ибо даже применить найденный процесс/проверить нормально не могу.<br />На lua для этой игры (css v34) нашел подобный код.<br /></p><div class="codebox"><pre><code  class="lua">
client = getBaseAddr(&quot;client.dll&quot;)
engine = getBaseAddr(&quot;engine.dll&quot;)
myNameAddr = readmem(engine+0x3B9F24,4)
tAddr = readmem(client+0x4D300C,4)+0x1450
radar = readmem(client+0x510C80,4)
no = 0x38 --name
ho = 0x5C --health
xo = 0x60 --x pos
...
</code></pre></div><p>И там еще куча таких же скриптов, но получают они все эти переменные примерно одинаково. Каков алгоритм моих действий, если я хочу создать функцию получающую тот же самый Hp после запуска игры?</p>]]></content>
			<author>
				<name><![CDATA[TwenKey]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=39448</uri>
			</author>
			<updated>2019-07-22T09:38:56Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=134995#p134995</id>
		</entry>
</feed>
