C++:
Код:
#include
#include
#include
#include
#include
using
namespace
std
;
#define FUNC_CMessages__AddMessageJumpQ 0x69F1E0
DWORD
GetProcessIdByName
(
const
std
::
wstring
&
proc_name
)
{
PROCESSENTRY32 entry
;
entry
.
dwSize
=
sizeof
(
PROCESSENTRY32
)
;
DWORD ids
;
DWORD mids
;
HANDLE snapshot
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
NULL
)
;
if
(
Process32First
(
snapshot
,
&
entry
)
)
{
while
(
Process32Next
(
snapshot
,
&
entry
)
)
if
(
entry
.
szExeFile
==
proc_name
)
{
mids
=
entry
.
th32ModuleID
;
ids
=
entry
.
th32ProcessID
;
cout
pAdr
;
// передаем адрес
msg
(
sArg
->
text
,
sArg
->
time
,
sArg
->
flag
,
sArg
->
bPreviousBrief
)
;
// вызываем
return
0
;
}
void
__stdcall
RemoteThread_end
(
)
{
}
int
main
(
)
{
setlocale
(
LC_ALL
,
"Russian"
)
;
strcpy_s
(
FuncArgs
.
text
,
"Hello world!"
)
;
FuncArgs
.
time
=
500
;
FuncArgs
.
flag
=
NULL
;
FuncArgs
.
bPreviousBrief
=
false
;
FuncArgs
.
pAdr
=
0x69F1E0
;
// получаем хэндл процесса
HANDLE hProcess
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
FALSE
,
GetProcessIdByName
(
L
"gta_sa.exe"
)
)
;
// Выделяем память под наш поток в gta_sa
LPVOID pRemoteThread
=
VirtualAllocEx
(
hProcess
,
NULL
,
(
DWORD_PTR
)
RemoteThread_end
-
(
DWORD_PTR
)
RemoteThread
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
// Записываем его
WriteProcessMemory
(
hProcess
,
pRemoteThread
,
(
LPVOID
)
RemoteThread
,
(
(
DWORD_PTR
)
RemoteThread_end
-
(
DWORD_PTR
)
RemoteThread
)
,
0
)
;
// Выделяем память для нашего объекта в gta_sa
Struct
*
myArg
=
(
Struct
*
)
VirtualAllocEx
(
hProcess
,
NULL
,
sizeof
(
Struct
)
,
MEM_COMMIT
,
PAGE_READWRITE
)
;
// Записываем его
WriteProcessMemory
(
hProcess
,
myArg
,
&
FuncArgs
,
sizeof
(
Struct
)
,
NULL
)
;
// Запускаем наш поток pRemoteThread с аргументами myArg
HANDLE hThread
=
CreateRemoteThread
(
hProcess
,
0
,
0
,
(
LPTHREAD_START_ROUTINE
)
pRemoteThread
,
myArg
,
0
,
0
)
;
// Закрываем дескриптор потока
CloseHandle
(
hThread
)
;
// Освобождаем выделенную память
VirtualFreeEx
(
hProcess
,
myArg
,
sizeof
(
Struct
)
,
MEM_RELEASE
)
;
// Закрываем дескриптор процесса
CloseHandle
(
hProcess
)
;
}
практически не отличается от кода в заголовке, разве что функция получения pID другая (но 100 процентов рабочая), и strcpy заменил на strcpy_s, т.к. на что то ругался
я так то новичок в c++, пытаюсь постепенно понять значения неизвестных функций
UPD: нашел способ поставить strcpy как у автора темы, но все равно получаю ошибку.
SA-MP 0.3.7
Exception At Address: 0x13500013
Base: 0x041E0000
ОЙ ахахаах переключил на x86 и заработало). Не подскажите, а почему раньше не работало?
_SendMSG msg = (_SendMSG)sArg->pAdr; // передаем адрес . В этой строчке мы передаем адрес функции нашему прототипу функции, верно?
А для чего нужна пустая функция void __stdcall RemoteThread_end() {}?