<?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=14872</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=14872&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: Чтение памяти из процесса.».]]></description>
		<lastBuildDate>Mon, 22 Jul 2019 17:30:21 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: Чтение памяти из процесса.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=134997#p134997</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (belyankin12)]]></author>
			<pubDate>Mon, 22 Jul 2019 17:30:21 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=134997#p134997</guid>
		</item>
		<item>
			<title><![CDATA[AHK: Чтение памяти из процесса.]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=134995#p134995</link>
			<description><![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>]]></description>
			<author><![CDATA[null@example.com (TwenKey)]]></author>
			<pubDate>Mon, 22 Jul 2019 09:38:56 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=134995#p134995</guid>
		</item>
	</channel>
</rss>
