Краш при инжекте samp.dll

derr0x

Новичок
Автор темы
19
2
Удаление вопроса после решения проблемы
Короче решил написать свой самп клиент:
C++:
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;
}
int _tmain(int argc, _TCHAR* argv[])
{
    STARTUPINFOA cif; ZeroMemory(&cif, sizeof(STARTUPINFO));
    PROCESS_INFORMATION pi;
    if (CreateProcessA("D:\\Games\\GTA SAMP\\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, "D:\\Games\\GTA SAMP\\samp.dll"))
            {
                TerminateProcess(pi.hProcess, 0);
                ExitProcess(0);
            }
            ResumeThread(pi.hThread);
        }
    }
    else MessageBoxA(NULL, "Failed to Create Process", "Error", MB_ICONERROR);
    return 0;
}
Все должно работать, но я хз почему не работает, помогите пж
 
  • Нравится
Реакции: dendy.
Решение
Ты конечно молодец. Копировать научился, а всё остальное по твоему должно и так работать.

CreateProcessA создает процесс по указанному пути и с указанными аргументами, но большинство процессов, тем более игра (если ты не знал) тянут под себя еще кучу зависимостей. Мультиплеер в том числе. Откуда им нахер знать откуда тянуть ресурсы?
Ты создал манекен процесса и отрубил ему пути до зависимостей.

Если ты поместишь свой инжектор в папку с gta_sa.exe, то заметишь, что все работет. Ибо функция CreateProcessA будет всю работу делать за тебя и по умолчанию поставит дефолтный каталог на диск и каталог в котором находится модуль её исполняемый (в твоем случае инжектор).

Но она также предусматривает возможность изменения этого каталога. Так...

derr0x

Новичок
Автор темы
19
2
нет
Что никто не писал самп клиент свой? Что вообще ни так я смотрел оригинал сурсы сампа, там по сути просто создается процесс gta_sa.exe с агрументами и потом инжектится samp.dll
Помогите пожалуйста кто нибудь, уже 2 день решить не могу
 
Последнее редактирование:

.deserve

Участник
32
36
Ты конечно молодец. Копировать научился, а всё остальное по твоему должно и так работать.

CreateProcessA создает процесс по указанному пути и с указанными аргументами, но большинство процессов, тем более игра (если ты не знал) тянут под себя еще кучу зависимостей. Мультиплеер в том числе. Откуда им нахер знать откуда тянуть ресурсы?
Ты создал манекен процесса и отрубил ему пути до зависимостей.

Если ты поместишь свой инжектор в папку с gta_sa.exe, то заметишь, что все работет. Ибо функция CreateProcessA будет всю работу делать за тебя и по умолчанию поставит дефолтный каталог на диск и каталог в котором находится модуль её исполняемый (в твоем случае инжектор).

Но она также предусматривает возможность изменения этого каталога. Так вот если ты запускаешь свой инжектор не из директории где лежит gta_sa.exe, то тебе нужно изменить тот самый параметр CurrentDirectory (текущая директория), чтобы samp и gta_sa смогли тянуть зависимости.
По итогу получаешь:
C++:
CreateProcessA("D:\\Games\\GTA SAMP\\gta_sa.exe", "-c -n NickName -h 228.227.226.225 -p 7777", NULL, NULL, FALSE, DETACHED_PROCESS | CREATE_SUSPENDED, NULL, "D:\\Games\\GTA SAMP\\", &cif, &pi));

Ребята из мелкомягких документацию для таких как ты и пишут. Научитесь уже ей пользоваться. msdn называется.