ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Общие вопросы программирования (https://forum.antichat.xyz/forumdisplay.php?f=206)
-   -   Краш при инжекте samp.dll (https://forum.antichat.xyz/showthread.php?t=1397195)

derr0x 05.08.2021 21:16

Короче решил написать свой самп клиент:

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
;
}



Все должно работать, но я хз почему не работает, помогите пж

hinazuki 06.08.2021 12:42

Решил?

derr0x 06.08.2021 12:46

Цитата:

Сообщение от Mayako

Решил?

нет

Что никто не писал самп клиент свой? Что вообще ни так я смотрел оригинал сурсы сампа, там по сути просто создается процесс gta_sa.exe с агрументами и потом инжектится samp.dll

Помогите пожалуйста кто нибудь, уже 2 день решить не могу

.deserve 07.08.2021 08:52

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

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 называется.


Время: 20:24