Dll injection pro OpenGL – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Dll injection pro OpenGL – C / C++ – Fórum – Programujte.comDll injection pro OpenGL – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
ingiraxo+15
Grafoman
20. 1. 2013   #1
-
+1
-
Zajímavé

Čau,

nevíte někdo, na jakým principu fungojou wallhacky, aimbot apod. hacky? Napadlo mě, že bych si to zkusil na jedný hře (na OpenGL), ale nějak nechápu, jak můžu získat třeba pozice hráčů apod. informace přímo ze hry

Jediný co vim, že se to dělá před dll injection, ale jak získat ty informace to nevim, sice si můžu zachytávat zprávy okna nebo z opengl, ale to jsou bud nativní zprávy okna nebo primo vykreslení, takže netušim, jak se dají získat informace o hře (třeba těch hráců)

Pokud někdo víte, tak poprosim o radu :) díky

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Reklama
Reklama
metthal
~ Anonymní uživatel
27 příspěvků
21. 1. 2013   #2
-
0
-

Reverse engineering. Uzitocna pomocka by ti asi bol CheatEngine. Musis zistit offset v pamati, kde sa sa nachadzaju nejake objekty, potom zase offset v ramci struktury/objektu. Samozrejme tieto offsety (adresy) sa budu menit vzdy ked znova zapnes program, ale niekde sa musi drzat ukazovatel na tieto data. Ten je na zasobniku vzdy na rovnakej adrese pri spusteni, jeho obsah potom bude adresa nejake object mangaru. Vsetko zalezi od hry.

Nahlásit jako SPAM
IP: 2001:67c:1220:c1a2:b12f:3...–
ingiraxo+15
Grafoman
21. 1. 2013   #3
-
0
-

dobře, ale jak tohle můžu udělat, když je ve hře více hráčů? Napadá mě zjistit pole struktůr připojených hráčů, ale to nevim jak bych v paměti našel.. kdyby byl jeden hráč, tak to vim, ale u více hráčů ne

Je ta úvaha správně  nešbo se to dělá jinak?

EDIT: vlastně ted mě napadá, kdybych našel struktůru hráče, tak by vlastně stačilo zjistit velikost struktůry, páč by měli být v paměti za sebou

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
metthal
~ Anonymní uživatel
27 příspěvků
21. 1. 2013   #4
-
0
-

To ci by boli v pamati za sebou zalezi od pouzitej struktury na ich ukladanie. Moze to byt vector, moze to byt linearny zoznam, avsak musis najst nejaky klucovy ukazovatel, ktory rozpozna ze to je tvoj hrac. Ci uz meno, alebo nieco ine.

Nahlásit jako SPAM
IP: 2001:67c:1220:c1a2:a4e1:3...–
ingiraxo+15
Grafoman
22. 1. 2013   #5
-
0
-

Můžete mi prozradit, jak můžu odpojit injectnutou dll z procesu? Předpokladal jsem, že bude stačit když z procesu uvolnim alokovanou pamět pro dll, ale nějak to nejde.. stále ten proces používá to dll

Mám to takto, ale jak říkám - neuvolní to :/ 

LPCSTR dllPath = "C:\\Test.dll";
DWORD processID = FindProcessID(L"Skype.exe");
LPVOID dllMemoryAddr = Inject(processID, dllPath);

cin.get();

HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);
VirtualFreeEx(hProcess, dllMemoryAddr, strlen(dllPath), MEM_RELEASE); // zkousel jsem i MEM_DECOMMIT
CloseHandle(hProcess);

Napadá mě, jestli třeba není problém s tím, že vytvořít vlákno pro tu DLL (přes CreateRemoteThread), takže možná kvůli tomu to nejde

Další problém je, že nevim proč, ale to DLL se mi někdy vloží i do snad dalších 6 procesů, když chci jen ten jeden :/

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
RePRO0
Super člen
23. 1. 2013   #6
-
0
-
Nahlásit jako SPAM
IP: 95.82.185.–
Software: C; C++; C#; Pascal; Delphi; Java Webdesign: PHP; MySQL; CSS; jQuery; Ajax; Javascript; OOP
ingiraxo+15
Grafoman
23. 1. 2013   #7
-
0
-

Na to jsem už taky narazil, ale i když bych měl mít všechno správně (co se týče samotnýho vložení dll), tak přesto se mi vůbec nechce zavolat odchycení zpráv WH_GETMESSAGE

Můj cíl je takovej - odchytit úplně všechny zprávy procesu (cílový aplikace) tak, abych si mohl dopsat vlastni HOOKPROC funkce v aplikaci (né v DLL)

Pokud někdo víte, tak by mě celkem zajímalo kde mám chybu.. bojuju s tím už druhej den

Samotný DLL

BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
    case DLL_PROCESS_ATTACH:
        gs_hInstance = hinstDLL;
        AttachMessage();
        break;

    case DLL_PROCESS_DETACH:
        DetachMessage();
        break;
    }
    return TRUE;
}

// vůbec se nechce zavolat (zkoušel jsem přes debug)
LRESULT CALLBACK MessageHook(UINT nCode, WPARAM wParam, LPARAM lParam)
{
    // misto 0 by měl být nejspíše "gs_messageHook" (zatím není podstatný)
    return CallNextHookEx(0, nCode, wParam, lParam);
}

BOOL CALLBACK AttachMessage() // externi funkce
{
    gs_messageHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)MessageHook, gs_hInstance, 0);

    if (gs_messageHook)
        return TRUE;

    return FALSE;
}

BOOL CALLBACK DetachMessage() // externi funkce
{
    if (gs_messageHook)
        UnhookWindowsHookEx(gs_messageHook);

    gs_messageHook = nullptr;

    return TRUE;
}

Aplikace 

#define DLL_NAME "Test.dll" // dll, ktere se vklada do procesu
#define PROCESS_NAME L"Skype.exe" // pouze pro test (snaha odchytit vsechny zpravy toho procesu)

typedef DWORD (CALLBACK * FindProcessID)(const wstring);
typedef LPVOID (CALLBACK * Inject)(const DWORD, LPCSTR);

int main()
{
    HMODULE hSpy = LoadLibraryA(DLL_NAME);
    DWORD processId = ((FindProcessID)GetProcAddress(hSpy, "FindProcessID"))(PROCESS_NAME);
    // dllMem obsahuje pametove misto, kam se vlozil string s nazvem DLL
    LPVOID dllMem = ((Inject)GetProcAddress(hSpy, "Inject"))(processId, DLL_NAME);
    // pokousim se dostat ven MessageHook, abych si vlastni telo mohl dopsat mimo DLL
    FARPROC messageHook = GetProcAddress(hSpy, "MessageHook");

    cin.get();

    FreeLibrary(hSpy);

    return EXIT_SUCCESS;
}

Funkce pro inject (umístěná v DLL) 

LPVOID CALLBACK Inject(const DWORD processID, LPCSTR dllName) 
{
    if (!processID)
        return FALSE; 

    HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, processID);

    if (!hProcess)
        return FALSE;

    LPVOID loadLibraryA = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");

    if (loadLibraryA)
    {
        LPVOID dllMemoryAddr = VirtualAllocEx(hProcess, nullptr, strlen(dllName), MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);

        if (dllMemoryAddr)
        {
            WriteProcessMemory(hProcess, dllMemoryAddr, dllName, strlen(dllName), nullptr);
            CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)loadLibraryA, dllMemoryAddr, 0, nullptr);
            CloseHandle(hProcess);

            return dllMemoryAddr;
        }
    }
    CloseHandle(hProcess);
    return nullptr;
}

Díky

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
zlz
~ Anonymní uživatel
634 příspěvků
23. 1. 2013   #8
-
0
-

V Inject alokuješ jen místo pro řetězec s cestou k dllce. Pak v cílovém procesu spustíš LoadLibrary a jako parametr dáš ten řetězec. Uvolněním paměti pro ten řetězec samozřejmě dllku neunloadneš. Na to zase musíš v cílovém procesu zavolat FreeLibrary s handlem té dllky. A není důvod, aby funkce Inject byla v samostatné dllce.

Takže máš dllku injectnutou v požadovaném procesu a v něm chceš nainstalovat hook. Přes SetWindowsHookEx ale instaluješ hook do všech procesů (a pravděpodobně se ve všech zase provede dll attach...).

Hook se spouští v tom hooknutém procesu (SetWindowsHookEx injectne tu dllku, takže samostatný Inject ani nepotřebuješ). Ve své aplikaci nezpracuješ nic (pokud jí teda ta data z hooku nebudeš sám nějak přeposílat, což bude kurevsky pomalé). Ten hook sice (snad ještě pořád) může být přímo v tom exáči (protože mezi dll a exe prakticky není rozdíl), ale i tak bude natažený do toho cílového procesu a v něm poběží.

Jinak nevím, proč se ti ten hook nespouští. Spíš si myslím, že jen nevidíš, že se spouští, nebo něco hodí chybu.

Nahlásit jako SPAM
IP: 80.188.216.–
ingiraxo+15
Grafoman
23. 1. 2013   #9
-
0
-

ok, zkusim to pak ještě pořesit.. jinak s tím, že se attachne do všech procesů máš pravdu, to je ten problém kterej taky řešim... takže když tam injectnu DLL, tak nemusim vubec používat SetWindowsHookEx ? Potom tedy nějak nechápu, jak se můžu naslouchat zprávám okna

Já bych později chtěl přidat i odchycení nebo spíš možnost kreslit vlastní prvky přes openGL do toho procesu a co jsem tak koukal, tak všude k tomu používají inject dll (nevim jestli je to snazší nebo jiná možnost neni, ale je to tak) Takže bych to právě chtěl zkusit přes inject

To že se ten hook nespustí taky nevim, ja si to debugoval, ale nikde neni null, nic nehodi chybu, ale ta moje funkce pro MessageHook se proste nevykona

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 80 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý