PDA

Просмотр полной версии : Делаем лаунчер SA-MP или инжект при запуске процесса


MogAika
04.09.2013, 22:37
Мало кто знает что-то, кроме добавления функций в собейт по левым урокам. Так вот, в этот раз буду говорить про другие вещи, может быть вам придет что-то новое в голову.

Мы создадим новый процесс с 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);




PROFIT!!!

Если вам надо подключить собейт, который лежит в другом файле, нежели 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
#include

CentiuS
06.09.2013, 15:37
Спасибо огромное) Если будет время, сделаю CRMP hacked client

MogAika
06.09.2013, 18:50
обновил капельку

reAL
04.01.2015, 00:42
не подключает мою DLL.

Пробовал подгрузить sobeit (dll), c другим названием.

В чём может быть проблема. Знаю старая тема, но возник вопрос.