Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Fawkes

Frischling

  • »Fawkes« ist der Autor dieses Themas

Beiträge: 58

Beruf: Realschüler :)

  • Private Nachricht senden

1

25.11.2013, 20:02

Programm stürzt beim Prozess zugriff ab ( D3d9 hook )

Vorab: Ich möchte keinerlei Entwicklerstudio oder ähnlichem schädigen. Ich möchte auch keine Cheats für Spiele erstellen. Ich möchte lediglich ein wenig mit Prozessen und Modulen arbeiten um darin ein wenig Erfahrung zu haben. Ich hooke Direct3d, weil es im Internet viele Anleitungen dazu gibt.
Folgender Code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#pragma once
#include <windows.h>
#include <cstdio>
#include <d3d9.h>
#include <d3dx9.h>
#include <detours.h>
#pragma comment( lib, "detours.lib" )

typedef HRESULT(__stdcall* EndScene_t)(LPDIRECT3DDEVICE9);
EndScene_t pEndScene;

void DrawRect (LPDIRECT3DDEVICE9 Device_t, int X, int Y, int L, int H, D3DCOLOR color)
{
    D3DRECT rect = {X, Y, X+L, Y+H};
    Device_t->Clear(1, &rect, D3DCLEAR_TARGET, color, 0, 0); 
}

HRESULT _stdcall mEndScene( LPDIRECT3DDEVICE9 pDevice ){

    DrawRect( pDevice, 10, 10, 10, 10, D3DCOLOR_ARGB( 255, 0, 255, 0 ) );

    return pEndScene( pDevice );
}

void InitHook(){

    HMODULE module = NULL;

    while( !module ){

        module = GetModuleHandleA( "d3d9.dll" );
        
        Sleep( 100 );

    }
    // Bis Hierhin funktioniert es
    pEndScene = ( EndScene_t )DetourFunction((PBYTE)0x7543279F, (PBYTE) mEndScene );
}

int WINAPI DllMain(HINSTANCE hInst,DWORD reason,LPVOID reserved)
{
    switch(reason)
    {
        case DLL_PROCESS_ATTACH:
        
            CreateThread( 0, 0, (LPTHREAD_START_ROUTINE) InitHook, 0, 0, 0 );

        break;
    }
    return true;
}
Das Problem ist, dass das Programm abstürzt, wahrscheinlich liegt es an der DetourFunction. Aber kann mir jemand sagen wieso?

Fawkes

Frischling

  • »Fawkes« ist der Autor dieses Themas

Beiträge: 58

Beruf: Realschüler :)

  • Private Nachricht senden

2

26.11.2013, 21:42

Falls es noch jemanden interressiert, ich habe da was gefunden. Weiß zwar trotzdem nicht wieso das Opferprogramm abstürzt, aber dieser Code funktioniert einwandfrei:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
/*
Credits an: Julian_ 
Youtube: /user/IceT3e3a
*/


#pragma comment(lib, "Psapi.lib")
#pragma comment(lib, "d3d9.lib")
#pragma comment(lib, "d3dx9.lib")

#include <Windows.h>
#include <Psapi.h>
#include <d3d9.h>
#include <d3dx9.h>

#include "detours.h"

typedef int (__stdcall* EndScene)(LPDIRECT3DDEVICE9 Device);

EndScene oEndScene;

ID3DXFont* dx_Font = NULL;
RECT pos;

int WINAPI mEndScene(LPDIRECT3DDEVICE9 Device)
{
    if(dx_Font == 0)
    {
        D3DXCreateFont(Device, 14, 0, 4, 0, false, 1, 0, 0, 0, "Arial", &dx_Font);

        pos.bottom = 0;
        pos.left = 100;
        pos.right = 0;
        pos.top = 100;
    }

    dx_Font->DrawTextA(NULL, "EndScene detoured!", strlen("EndScene detoured!"), &pos, DT_NOCLIP, D3DCOLOR_XRGB(255, 0, 255));

    return oEndScene(Device);
}

int WINAPI DllThread()
{
    HMODULE hd3d9 = NULL;
    MODULEINFO Info;
    DWORD EndScene_Addr = NULL;

    while(hd3d9 == NULL)
    {
        hd3d9 = GetModuleHandle("d3d9.dll");
    }

    GetModuleInformation(GetCurrentProcess(), hd3d9, &Info, sizeof(MODULEINFO));

    EndScene_Addr = (int)Info.EntryPoint + 0x20D5A;

    oEndScene = (EndScene)DetourFunction((PBYTE)EndScene_Addr, (PBYTE)mEndScene);

    return 0;
}

bool WINAPI DllMain(HINSTANCE hDll, DWORD reason, LPVOID reserved)
{
    switch(reason)
    {
    case DLL_PROCESS_ATTACH:

        CreateThread(NULL, NULL, (LPTHREAD_START_ROUTINE) DllThread, NULL, NULL, NULL);
        break;
    }

    return true;
}


Hier wird die Offset Methode verwendet es sollte auf Windows 7 Home Premium x64 funktionieren.
Nur damit hier keiner kommt mit Copy and Paste, ich habe mir das ganze Tutorial angeguckt 57 Minuten. o.o

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

26.11.2013, 21:54

DetourFunction((PBYTE)0x7543279F, (PBYTE) mEndScene )

0x7543279F ???

Nicht alles einfach so von Elitepvpers kopieren ;)
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Fawkes

Frischling

  • »Fawkes« ist der Autor dieses Themas

Beiträge: 58

Beruf: Realschüler :)

  • Private Nachricht senden

4

26.11.2013, 22:01

Die Addresse habe ich in IDA pro gefunden, kann sein das sie falsch ist. Ist ausserdem kein Offset sondern die Addresse in meinem Computer. Ich bin generell nicht der Typ der Codes sinnlos CnP. Wenn man Code CnP ohne zu verstehen was da passiert bringt es einem sowieso nichts. ;)

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

5

27.11.2013, 06:33

Nun ja, Adressen von Funktionen ändern sich gern pro Programmstart, weil die DLL an eine andere Basis-Adresse geladen wird. Sie fest einzutragen ist also keine gute Idee.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Fawkes

Frischling

  • »Fawkes« ist der Autor dieses Themas

Beiträge: 58

Beruf: Realschüler :)

  • Private Nachricht senden

6

27.11.2013, 16:54

Im zweiten Code wird ja auch das Ofset benutzt, zur zeit probiere ich die Findpattern funktion aus. ;)

Werbeanzeige