Форум программистов, компьютерный форум, киберфорум
Программирование игр
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/8: Рейтинг темы: голосов - 8, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 15
1

Как внедрить мини-игру в процесс другой игры

16.03.2018, 22:41. Просмотров 1582. Ответов 4
Метки нет (Все метки)

Кто может помочь сделать такую вещь: в GTA SA нужно вместо стандартной мини-игры внедрить любую другую (например "сапер", шахматы или типа того), есть вот такой код
Кликните здесь для просмотра всего текста
C++
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
#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#pragma comment(lib, "winmm")
 
using namespace std; 
 
DWORD WINAPI GtaSA_thread (LPVOID);
 
 
 
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved)
 
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return true;
}
 
 
 
 
 
 
DWORD WINAPI GtaSA_thread (LPVOID)
{
    DWORD*var = (DWORD*)0xBA68A5; 
    for (;;Sleep (100))
 
    {  
        
        if (*var != 0x00000022)
        {        
                    PlaySound("C:\\Games\\GTA2\\sound.WAV", NULL, SND_ASYNC);
 
        }           
                      
    }   
                    
 
}

проигрывает музыку из папки C:\\Games\\GTA2 - нужно что-то вроде этого
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2018, 22:41
Ответы с готовыми решениями:

Внедрить программу в другой процесс
Суть задачи такова. Есть программулина, которой нужно работать от имени другого процесса (думаю...

SoundEsp в CS:GO: как внедрить в игру
Наткнулся на такую тему, в которой есть код Sound Esp. Вот только как его внедрить в игру? При...

Как внедрить dll в чужой процесс
Как внедрить длл в чужой процесс, и отлавливать все его сообщения...... если возможно, то...

Как внедрить в процесс свои адреса и байты?
Здравствуйте, как можно внедрить в процесс, то есть в игру адреса и байты через Delphi 7? Есть...

4
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 15
06.10.2018, 11:27  [ТС] 2
получилось сделать вот так,

Youtube: Mini-Games - GTA SA (test) {0:53}


но работает не так как надо, нужно открывать окно второй игры поверх первой, может кто подскажет как это сделать
код
C++
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
#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#include <tlhelp32.h>
#pragma comment(lib, "winmm")
 
using namespace std; 
 
DWORD WINAPI GtaSA_thread (LPVOID);
 
 
 
DWORD APIENTRY DllMain (HMODULE hModule, DWORD ul_reason_for_call, LPVOID ipReserved)
 
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH:
        CreateThread (NULL, NULL, GtaSA_thread, NULL, NULL, NULL);
    case DLL_THREAD_ATTACH:
    case DLL_THREAD_DETACH:
    case DLL_PROCESS_DETACH:
        break;
    }
    return true;
}
 
 
 
 
 
 
 
 
DWORD WINAPI GtaSA_thread(LPVOID)
 
{
 
    {
 
 
 
        for (;; Sleep(100))
        {
            if (GetAsyncKeyState(VK_NUMPAD0) & 0x8000)
 
            {
                ShellExecute(NULL, "open", "c:\\GSR_1.5\\GAMES\\MK4\\MK4.exe", NULL, NULL, SW_SHOWNORMAL);
                
            }
 
 
        }
 
 
    }
}
0
║XLR8║
1098 / 840 / 256
Регистрация: 25.07.2009
Сообщений: 4,161
Записей в блоге: 5
07.10.2018, 10:00 3
zorin_chel, либо передай в мортал комбат контекст который будет частью ГТА, чтобы отрисовка была сразу в буфер куда пишет ГТА. На самом деле "либо" не подходит, вариантов здесь масса. Но все они основаны на манипуляции с контекстом окна. 2 окна на полноэкранном режиме не показать, значит надо чтобы одна из прог использовала буфер другой для вывода своей графики.
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 15
08.10.2018, 17:24  [ТС] 4
здесь можно использовать SetParent?
0
0 / 0 / 0
Регистрация: 11.10.2015
Сообщений: 15
12.09.2020, 22:29  [ТС] 5
получился вот такой код
C++
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
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include <iostream>
#include <windows.h>
#include <string>
#include <conio.h>
#include <fstream>
#include <iomanip>
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <mmsystem.h>
#include <tlhelp32.h>
#include <d3d9.h>
#include <d3dx9.h>
#include <d3dx9core.h>
#pragma comment(lib,"d3d9.lib")
#pragma comment(lib, "winmm")
#pragma comment(lib, "D3dx9.lib")
 
 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
 
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdShow)
{
    // Register the window class.
    const wchar_t CLASS_NAME[] = L"Sample Window Class";
 
    WNDCLASS wc = { };
 
    wc.lpfnWndProc = WindowProc;
    wc.hInstance = hInstance;
    wc.lpszClassName = CLASS_NAME;
 
    RegisterClass(&wc);
 
    // Create the window.
 
    HWND hwnd = CreateWindowEx(
        0,                              // Optional window styles.
        CLASS_NAME,                     // Window class
        L"Learn to Program Windows",    // Window text
        WS_OVERLAPPEDWINDOW,            // Window style
 
        // Size and position
        CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
 
        NULL,       // Parent window    
        NULL,       // Menu
        hInstance,  // Instance handle
        NULL        // Additional application data
    );
 
    if (hwnd == NULL)
    {
        return 0;
    }
 
    ShowWindow(hwnd, nCmdShow);
 
    // Run the message loop.
 
    MSG msg = { };
    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return 0;
}
 
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
 
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hwnd, &ps);
 
 
 
        FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
 
        EndPaint(hwnd, &ps);
    }
    return 0;
 
    }
    return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
 
 
 
 
 
typedef HRESULT(__stdcall* PRESENT9)(IDirect3DDevice9* pDevice, const RECT*, const RECT*, HWND, void*);
 
 
PRESENT9 g_D3D9_Present = 0;
BYTE g_codeFragment_p9[5] = { 0, 0, 0, 0, 0 };
BYTE g_jmp_p9[5] = { 0, 0, 0, 0, 0 };
DWORD present9 = 0;
bool indicator = 0;
D3DRECT rec = { 10, 10, 160, 240 }; //menu size
ID3DXFont* m_font = 0;
RECT fontRect = { 10, 15, 120, 120 };
D3DCOLOR fontColor = 0;
D3DCOLOR bkgColor = 0;
 
 
 
 
 
void DrawIndicator(void* pDevice)
{
    IDirect3DDevice9* dev = (IDirect3DDevice9*)pDevice; //get the actual D3D-device
    dev->BeginScene();
 
    if (indicator)
 
    {
        HDC hdc = GetDC(0);
        RECT rect = { 20, 20, 200, 200 };
        SetTextColor(hdc, RGB(255, 0, 0));
        SetBkMode(hdc, TRANSPARENT);
        SetBkColor(hdc, RGB(0, 255, 0, 0));
        DrawText(hdc, L"Directx Hook", -1, &rect, DT_LEFT);
 
    
 
        
        
    //PlaySound(L"H:\\Program Files (x86)\\GTA SA Revision2\\GAMES\\CNN Intro.wav", NULL, SND_ASYNC);
    //Sleep(1000);
 
    //CreateProcess(L"H:\\Program Files(x86)\\GTA SA Revision2\\GAMES\\CNN Intro.mp4", NULL, NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);
            
    
 
 
 
    }
    
 
 
    dev->EndScene();
}
 
//get the VMT and the hooking functions offsets
void GetDevice9Methods()
{
    IDirect3D9* d3d9_ptr;
    IDirect3DDevice9* pDevice;
    DWORD* vtablePtr;
    D3DPRESENT_PARAMETERS d3dpp;
    static HMODULE d3d9_handle = 0;
    HWND hWnd = CreateWindowExA(0, "STATIC", "dummy", 0, 0, 0, 0, 0, 0, 0, 0, 0);
    d3d9_handle = LoadLibraryA("d3d9.dll");
    d3d9_ptr = Direct3DCreate9(D3D_SDK_VERSION);
    ZeroMemory(&d3dpp, sizeof(d3dpp));
    d3dpp.Windowed = 1;
    d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
    IDirect3D9_CreateDevice(d3d9_ptr, 0, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &pDevice);
    vtablePtr = (DWORD*)(*((DWORD*)pDevice));
    present9 = vtablePtr[17] - (DWORD)d3d9_handle;
    IDirect3DDevice9_Release(pDevice);
    IDirect3D9_Release(d3d9_ptr);
    FreeLibrary(d3d9_handle);
    CloseHandle(hWnd);
}
 
HRESULT HookedPresent9(IDirect3DDevice9* pDevice, const RECT* src, const RECT* dest, HWND hWnd, void* unused)
{
    BYTE* codeDest = (BYTE*)g_D3D9_Present; //restore the original Present() bytes
    codeDest[0] = g_codeFragment_p9[0];
    *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_codeFragment_p9 + 1));
    DrawIndicator(pDevice); //draw the menu
    DWORD res = g_D3D9_Present(pDevice, src, dest, hWnd, unused); //place the hook back
    codeDest[0] = g_jmp_p9[0];
    *((DWORD*)(codeDest + 1)) = *((DWORD*)(g_jmp_p9 + 1));
    return res;
}
 
void HookDevice9Methods()
{
    DWORD g_savedProtection_p9 = 0;
    HMODULE hD3D9 = GetModuleHandleA("d3d9.dll"); //get the actual d3d9.dll address
    g_D3D9_Present = (PRESENT9)((DWORD)hD3D9 + present9); //calculate the actual Present() address
    g_jmp_p9[0] = 0xE9; //fill the codecave array ("jmp hooked_present")    
    DWORD addr = (DWORD)HookedPresent9 - (DWORD)g_D3D9_Present - 5; //calculate the hooked Present() address
    memcpy(g_jmp_p9 + 1, &addr, sizeof(DWORD)); //write it into the cave
    memcpy(g_codeFragment_p9, g_D3D9_Present, 5); //save the first 5 (jmp + addr) bytes of the original Present() 
    VirtualProtect(g_D3D9_Present, 8, PAGE_EXECUTE_READWRITE, &g_savedProtection_p9); //make the code writable\executable
    memcpy(g_D3D9_Present, g_jmp_p9, 5); //write the codecave in the beginning of the original Present()
}
 
//hooking thread main function
DWORD WINAPI TF(LPVOID)
{
    GetDevice9Methods(); //get the VMT and the offsets
    HookDevice9Methods(); //actually, hook the needed functions 
    return 0;
}
 
//hotkeys thread main function
DWORD WINAPI KeyboardHook(LPVOID)
{
    while (1)
    {
        if (GetAsyncKeyState(VK_F4))
        {
            indicator = !indicator;
            Beep(500, 200);
 
        }
        Sleep(100);
    }
    return 0;
}
 
int _stdcall DllMain(HINSTANCE hInst, DWORD ul_reason_for_call, void* lpReserved)
{
    switch (ul_reason_for_call)
    {
    case DLL_PROCESS_ATTACH: //if we are attached into the game's process
 
 
        CreateThread(0, 0, TF, 0, 0, 0); //start D3D-hooking thread
        CreateThread(0, 0, KeyboardHook, 0, 0, 0); //start hotkeys thread
    }
    return 1;
}
но он выводит только текст, а как сделать, что бы окно выводилось поверх
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.09.2020, 22:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Как создать мини-игру
Здравствуйте, нужна помощь, не получается создать мини игру, в которой надо сделать 10 десять...

Как внедрить в окно другой программы свою инфу?
Привет. Есть такая прога - Mumble, она создана для голосового общения и ее очень часто используют...

Как сделать так что бы батник мониторил процесс и если процесс перезепустился то запуск или перезапуск другой программы
помогите , как сделать так что бы батник мониторил процесс и если процесс перезепустился то запуск...

Как написать бот для мини игры?
Всем привет! У меня такая ситуация, Я уезжаю на некоторое время из города, но мне нужно что бы я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.