<?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>https://forum.script-coding.com/viewtopic.php?id=5574</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=5574&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: чтение из памяти программы».]]></description>
		<lastBuildDate>Tue, 15 Mar 2011 05:17:27 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: чтение из памяти программы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=46163#p46163</link>
			<description><![CDATA[<p>Еще раз спасибо.</p>]]></description>
			<author><![CDATA[null@example.com (InFlames)]]></author>
			<pubDate>Tue, 15 Mar 2011 05:17:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=46163#p46163</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: чтение из памяти программы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=46162#p46162</link>
			<description><![CDATA[<p>Глубоко не разбирался, но вот в таком виде компилится:<br /></p><div class="codebox"><pre><code>#include &lt;windows.h&gt;
#include &lt;iostream&gt;
#include &lt;Tlhelp32.h&gt;

using namespace std; 

void EnableDebugPriv();
DWORD GetPID (PTSTR proc);
DWORD GetDLL (PTSTR DllName, DWORD tPid);
void ClearConsole();

int main()
{
    SetConsoleTitle(TEXT(&quot;Gamestate&quot;));
    EnableDebugPriv();
    TCHAR War3Name[32] = TEXT(&quot;Wаrсrаft III&quot;);
    HWND hWar3 = FindWindow(War3Name, NULL);

    if(!hWar3)
    {
        cout &lt;&lt; &quot;Please open Wаrсrаft III first.&quot; &lt;&lt; endl;
        system( &quot;pause&quot; );
        return 1;
    } 

    DWORD pid;
    GetWindowThreadProcessId( hWar3, &amp;pid );
    HANDLE hOpen = OpenProcess( PROCESS_ALL_ACCESS, false, pid );
    if( !hOpen )
    {
        cout &lt;&lt; &quot;Can&#039;t open Wаrсrаft III.&quot; &lt;&lt; endl;
        system( &quot;pause&quot; );
        return 1;
    }

    DWORD Address = 11147656;
    DWORD Buffer;
    DWORD GameDLL = GetDLL(TEXT(&quot;Game.dll&quot;),GetPID(TEXT(&quot;war3.exe&quot;)));
    SIZE_T BytesRead = 0;

    for (;;)
    {   
        /* Notice the GameDLL+Address: we are adding our address to the base, AA1988h, because while the base is 6F 95 % of the time, it may change for specific reasons.*/
        
        ReadProcessMemory(hOpen, (LPCVOID)(GameDLL+Address), &amp;Buffer, 4, &amp;BytesRead); 
        
        // If our address has value(buffer) 0, then we are not in-game:
        
        if(Buffer == 0)
        {
            cout &lt;&lt; &quot;Not in game&quot; &lt;&lt;endl;; 
            Sleep(2000);
            ClearConsole(); 
        }       
        else
        {
            cout &lt;&lt; &quot;In game&quot; &lt;&lt;endl; 
            Sleep(1000);
            ClearConsole(); 
        }
    }
}

// Priviledges

void EnableDebugPriv( )
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;
    OpenProcessToken( GetCurrentProcess( ), TOKEN_ADJUST_PRIVILEGES |TOKEN_QUERY, &amp;hToken );
    LookupPrivilegeValue( NULL, SE_DEBUG_NAME, &amp;sedebugnameValue );
    tkp.PrivilegeCount = 1;tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    AdjustTokenPrivileges( hToken, false, &amp;tkp, sizeof( tkp ), NULL, NULL );
    CloseHandle( hToken );
} 

// Get PID for process.
DWORD GetPID (PTSTR proc)
{
    BOOL working=0;
    PROCESSENTRY32 lppe= {0};
    DWORD targetPid=0;
    HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS ,0);
    
    if (hSnapshot) 
    {
        lppe.dwSize=sizeof(lppe);
        working=Process32First(hSnapshot,&amp;lppe);
        while (working)
        {
            if (lstrcmpi(lppe.szExeFile,proc)==0)
            {
                targetPid=lppe.th32ProcessID;
                break;
            }
            working=Process32Next(hSnapshot,&amp;lppe);
        }
    }   
    CloseHandle( hSnapshot );
    return targetPid;
}

//Base (6F).
DWORD GetDLL(PTSTR DllName, DWORD tPid)
{
    HANDLE snapMod; 
    MODULEENTRY32 me32;
    
    if (tPid == 0) return 0;
    snapMod = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, tPid); 
    me32.dwSize = sizeof(MODULEENTRY32); 
    
    if (Module32First(snapMod, &amp;me32))
    { 
        do {
            if (lstrcmpi(DllName,me32.szModule) == 0)
            { 
                CloseHandle(snapMod); 
                return (DWORD) me32.modBaseAddr; 
            }
        } while(Module32Next(snapMod,&amp;me32));
    }   
    CloseHandle(snapMod); 
    return 0;
} 

void ClearConsole()
{
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD coord = {0, 0};
    DWORD count;
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if(GetConsoleScreenBufferInfo(hStdOut, &amp;csbi))
    {
        FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &amp;count);
        FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &amp;count );
        SetConsoleCursorPosition(hStdOut, coord);
    }
    return;
}</code></pre></div><p>Также обратите внимание, что в батнике опечатка — определяется переменная <strong>app</strong>, а дальше используется <strong>appp</strong>.</p>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Tue, 15 Mar 2011 04:32:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=46162#p46162</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: чтение из памяти программы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=46157#p46157</link>
			<description><![CDATA[<p>Как запустить <a href="http://www.gamethreat.net/forums/open-source-tutorials/33999-warcraft-iii-game-state-checking-1-22-a-2.html#post653293">этот</a> код на С++?<br />Делал вот по <a href="http://www.tiflocomp.ru/docs/programming/bcc_free.php">этому</a> туториалу.<br />Выдает ошибку <br /></p><div class="codebox"><pre><code>Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
hello.cpp:
Error E2451 hello.cpp 88: Undefined symbol &#039;TH32CS_SNAPPROC&#039; in function GetPID(char *)
Error E2121 hello.cpp 88: Function call missing ) in function GetPID(char *)
Error E2268 hello.cpp 96: Call to undefined function &#039;_stricmp&#039; in function GetPID(char *)
*** 3 errors in Compile ***</code></pre></div><p>Это содержимое .bat файла для запуска компилятора.<br /></p><div class="codebox"><pre><code>path C:\Borland\BCC55\bin;%path%
set include=C:\Borland\BCC55\include
set lib=C:\Borland\BCC55\lib
set app=hello
if exist %appp%.exe del %app%.exe
if exist %appp%.obj del %app%.obj
bcc32.exe -I%include% -L%lib% %app%.cpp &gt; errout.txt</code></pre></div><p>Хочу убедиться, что код на С++ работает верно, чтобы точно знать, что и на ahk это будет работать.</p>]]></description>
			<author><![CDATA[null@example.com (InFlames)]]></author>
			<pubDate>Mon, 14 Mar 2011 19:36:16 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=46157#p46157</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: чтение из памяти программы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45965#p45965</link>
			<description><![CDATA[<p>Спасибо. Буду разбираться дальше.</p>]]></description>
			<author><![CDATA[null@example.com (InFlames)]]></author>
			<pubDate>Thu, 10 Mar 2011 04:36:52 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45965#p45965</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: чтение из памяти программы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45963#p45963</link>
			<description><![CDATA[<div class="codebox"><pre><code>GetDLL(DllName, tPid)
{
    If tPid = 0
        Return 0

    TH32CS_SNAPMODULE = 8
    INVALID_HANDLE_VALUE = -1
    VarSetCapacity(MODULEENTRY32, 1064, 0)
    NumPut(1064, MODULEENTRY32)

    snapMod := DllCall(&quot;CreateToolhelp32Snapshot&quot;, &quot;uint&quot;, TH32CS_SNAPMODULE
                                                 , &quot;uint&quot;, tPid)
    If (snapMod = INVALID_HANDLE_VALUE)
        Return 0

    If DllCall(&quot;Module32First&quot;, &quot;uint&quot;, snapMod, &quot;uint&quot;, &amp;MODULEENTRY32)
    {
        pszModule := &amp;MODULEENTRY32 + 32

        If DllCall(&quot;lstrcmpi&quot;, &quot;str&quot;, DllName, &quot;uint&quot;, pszModule) = 0
        {
            DllCall(&quot;CloseHandle&quot;, &quot;uint&quot;, snapMod)
            Return NumGet(MODULEENTRY32, 20)
        }

        While DllCall(&quot;Module32Next&quot;, &quot;uint&quot;, snapMod, &quot;uint&quot;, &amp;MODULEENTRY32)
        {
            If DllCall(&quot;lstrcmpi&quot;, &quot;str&quot;, DllName, &quot;uint&quot;, pszModule) = 0
            {
                DllCall(&quot;CloseHandle&quot;, &quot;uint&quot;, snapMod)
                Return NumGet(MODULEENTRY32, 20)
            }
        }
    }
    DllCall(&quot;CloseHandle&quot;, &quot;uint&quot;, snapMod)
    Return 0
}</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (YMP)]]></author>
			<pubDate>Thu, 10 Mar 2011 04:09:47 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45963#p45963</guid>
		</item>
		<item>
			<title><![CDATA[AHK: чтение из памяти программы]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=45940#p45940</link>
			<description><![CDATA[<p>Задача: считать из памяти данные, находящиеся в определенной ячейке памяти.</p><p>Проблема №1: адрес этой ячейки не постоянен.<br />Решение проблемы №1: нашел <a href="http://www.gamethreat.net/forums/open-source-tutorials/33999-warcraft-iii-game-state-checking-1-22-a-2.html#post653293">код</a> на С++ </p><p>Проблема №2: не могу понять как работает в этом коде функция GetDLL(), а конкретно как вообще эту функцию перевести на AHK, что бы она возвращала адрес dll.</p><p>Это сама функция из С++ кода<br /></p><div class="codebox"><pre><code>//Base (6F).
DWORD GetDLL(char* DllName, DWORD tPid)
{
HANDLE snapMod;
MODULEENTRY32 me32;

if (tPid == 0) return 0;
snapMod = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, tPid);
me32.dwSize = sizeof(MODULEENTRY32);

if (Module32First(snapMod, &amp;me32)){
do{
if (strcmp(DllName,me32.szModule) == 0){
CloseHandle(snapMod);
return (DWORD) me32.modBaseAddr;
}
}while(Module32Next(snapMod,&amp;me32));
}

CloseHandle(snapMod);
return 0;

}</code></pre></div><p>Всё из того же С++ кода пример вызова этой функции для получения адреса загруженной game.dll (это библиотека используется игрой)</p><div class="codebox"><pre><code>DWORD GameDLL = GetDLL(&quot;Game.dll&quot;,GetPID(&quot;war3.exe&quot;));</code></pre></div><p>Помогите решить проблему №2</p>]]></description>
			<author><![CDATA[null@example.com (InFlames)]]></author>
			<pubDate>Wed, 09 Mar 2011 16:24:00 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=45940#p45940</guid>
		</item>
	</channel>
</rss>
