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

Статус
В этой теме нельзя размещать новые ответы.

MogAika

Известный
Автор темы
Друг
237
441
Мало кто знает что-то, кроме добавления функций в собейт по левым урокам. Так вот, в этот раз буду говорить про другие вещи, может быть вам придет что-то новое в голову.
Мы создадим новый процесс с 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 <windows.h>
#include <tlhelp32.h>
 

CentiuS

Известный
15
10
Спасибо огромное) Если будет время, сделаю CRMP hacked client
 

reAL

Новичок
1
0
не подключает мою DLL.
Пробовал подгрузить sobeit (dll), c другим названием.
В чём может быть проблема. Знаю старая тема, но возник вопрос.
 
Последнее редактирование:
Статус
В этой теме нельзя размещать новые ответы.