- 237
- 444
Мало кто знает что-то, кроме добавления функций в собейт по левым урокам. Так вот, в этот раз буду говорить про другие вещи, может быть вам придет что-то новое в голову.
Мы создадим новый процесс с gta_sa и подключим к ней samp.dll.
Казалось бы, чего тут крутого? А крутость в том, что вы сможете заинжектить кучу своих dll-ок до запуска игры!
Для начала напишем функцию инжекта.
Как она работает:
Теперь перейдем к подключению к серверу:
PROFIT!!!
Если вам надо подключить собейт, который лежит в другом файле, нежели 3d39.dll, то за место
ставьте
Удачи в создании своих клиентов
P.S: Вы можете создавать свои dll и инжектить их до запуска игры, что расширяет и упрощает возможности модифицирования программ.
P.S: Нужно добавить в начале
Мы создадим новый процесс с gta_sa и подключим к ней samp.dll.
Казалось бы, чего тут крутого? А крутость в том, что вы сможете заинжектить кучу своих dll-ок до запуска игры!
Для начала напишем функцию инжекта.
Как она работает:
- Выделяем место в программе-жертве
- Копируем в это место строку с названием нашей dll
- Создаем у жертвы новый поток, в качестве начала потока укажем смещение функции "LoadLibraryA" из "kernel32.dll". В качестве аргумента передаем смещение на строку.
- PROFIT!!! Создается поток, который вызывает функцию DllMain в нашей дллке.
Код:
BOOL Inject(DWORD pId, LPSTR dllName)
{
HANDLE h = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pId);
if(h)
{
LPVOID LoadLibAddr = (LPVOID)GetProcAddress(GetModuleHandleA("kernel32.dll"), "LoadLibraryA");
LPVOID dereercomp = VirtualAllocEx(h, NULL, strlen(dllName), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
WriteProcessMemory(h, dereercomp, dllName, strlen(dllName), NULL);
HANDLE asdc = CreateRemoteThread(h, NULL, NULL, (LPTHREAD_START_ROUTINE)LoadLibAddr, dereercomp, 0, NULL);
WaitForSingleObject(asdc, INFINITE);
VirtualFreeEx(h, dereercomp, strlen(dllName), MEM_RELEASE);
CloseHandle(asdc);
CloseHandle(h);
return TRUE;
}
return FALSE;
}
- Для создания нового процесса используем функцию "CreateProcess" с аргументом CREATE_SUSPENDED
- В качестве параметра передадим строку формата "-c -n Ник -h Айпи -p Порт"
- Подключим samp.dll
- Запустим главный поток gta
Код:
STARTUPINFO cif;
ZeroMemory(&cif,sizeof(STARTUPINFO));
PROCESS_INFORMATION pi;
if(CreateProcess("gta_sa.exe", "-c -n NickName -h 228.227.226.225 -p 7777", NULL,NULL, FALSE, DETACHED_PROCESS | CREATE_SUSPENDED, NULL, NULL, &cif, &pi))
{
if(pi.hProcess!=NULL)
{
if(!Inject(pi.dwProcessId, "samp.dll"))
{
TerminateProcess(pi.hProcess, 0);
ExitProcess(0);
}
ResumeThread(pi.hThread);
}
} else MessageBox(NULL, "Failed to Create Process", "Error", MB_ICONERROR);
Если вам надо подключить собейт, который лежит в другом файле, нежели 3d39.dll, то за место
Код:
if(!Inject(pi.dwProcessId, "samp.dll"))
Код:
if(!Inject(pi.dwProcessId, "samp.dll") || !Inject(pi.dwProcessId, "sobeitdllname.dll"))
Удачи в создании своих клиентов
P.S: Вы можете создавать свои dll и инжектить их до запуска игры, что расширяет и упрощает возможности модифицирования программ.
P.S: Нужно добавить в начале
Код:
#include <windows.h>
#include <tlhelp32.h>