HOME FORUMS MEMBERS RECENT POSTS LOG IN  
× Авторизация
Имя пользователя:
Пароль:
Нет аккаунта? Регистрация
Баннер 1   Баннер 2
НОВЫЕ ТОРГОВАЯ НОВОСТИ ЧАТ
loading...
Скрыть
Вернуться   ANTICHAT > ПРОГРАММИРОВАНИЕ > С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

  #21  
Старый 05.10.2019, 05:42
DivineSomeone
Новичок
Регистрация: 31.10.2017
Сообщений: 1
С нами: 4491604

Репутация: 1
По умолчанию

А получить координаты костей можно как-то через удалённый способ? :/
 
Ответить с цитированием

  #22  
Старый 06.07.2020, 00:26
Vintik
Познавший АНТИЧАТ
Регистрация: 18.08.2017
Сообщений: 1,568
С нами: 4598023

Репутация: 183


По умолчанию

@CleanLegend помоги братец

C++:





Код:
#include 
#include 
#include 
#include 
int
processId
;
int
GetProcessIdByWindowName
(
std
::
string windowName
)
{
HWND window
=
FindWindowA
(
NULL
,
reinterpret_cast

(
windowName
.
c_str
(
)
)
)
;
int
pId
=
0
;
GetWindowThreadProcessId
(
window
,
reinterpret_cast

(
&
pId
)
)
;
return
pId
;
}
template

T
readMem
(
int
address
)
{
T buf
;
HANDLE h
=
OpenProcess
(
PROCESS_VM_READ
,
false
,
processId
)
;
ReadProcessMemory
(
h
,
reinterpret_cast

(
address
)
,
&
buf
,
sizeof
(
T
)
,
NULL
)
;
CloseHandle
(
h
)
;
return
buf
;
}
template

void
writeMem
(
int
address
,
T buf
)
{
HANDLE h
=
OpenProcess
(
PROCESS_VM_WRITE
,
false
,
processId
)
;
int
oldProtect
=
0
;
VirtualProtectEx
(
h
,
reinterpret_cast

(
address
)
,
sizeof
(
T
)
,
PAGE_READWRITE
,
reinterpret_cast

(
&
oldProtect
)
)
;
WriteProcessMemory
(
h
,
reinterpret_cast

(
address
)
,
&
buf
,
sizeof
(
T
)
,
NULL
)
;
VirtualProtectEx
(
h
,
reinterpret_cast

(
address
)
,
sizeof
(
T
)
,
oldProtect
,
reinterpret_cast

(
&
oldProtect
)
)
;
CloseHandle
(
h
)
;
}
struct
AddMessageArg
{
DWORD arg1
;
int
arg2
;
const
char
*
arg3
;
int
arg4
;
int
arg5
;
int
arg6
;
}
;
typedef
void
(
__cdecl
*
AddMessage
)
(
DWORD
,
int
,
const
char
*
,
int
,
int
,
int
)
;
DWORD __stdcall
RemoteThread
(
AddMessageArg
*
arg
)
{
AddMessage msg
=
(
AddMessage
)
(
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
+
0x64010
)
)
;
// передаем адрес
msg
(
arg
->
arg1
,
arg
->
arg2
,
arg
->
arg3
,
arg
->
arg4
,
arg
->
arg5
,
arg
->
arg6
)
;
// вызываем
return
0
;
}
void
__stdcall
RemoteThread_end
(
)
{
}
void
AddSampMessage
(
std
::
string message
,
int
color
)
{
AddMessageArg funcArg
;
funcArg
.
arg1
=
readMem

(
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
+
0x21A0E4
)
)
;
funcArg
.
arg2
=
4
;
funcArg
.
arg3
=
message
.
c_str
(
)
;
funcArg
.
arg4
=
0
;
funcArg
.
arg5
=
color
;
funcArg
.
arg6
=
0
;
HANDLE h
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
false
,
processId
)
;
LPVOID pRemoteThread
=
VirtualAllocEx
(
h
,
NULL
,
reinterpret_cast

(
RemoteThread_end
)
-
reinterpret_cast

(
RemoteThread
)
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
WriteProcessMemory
(
h
,
pRemoteThread
,
reinterpret_cast

(
RemoteThread
)
,
(
reinterpret_cast

(
RemoteThread_end
)
-
reinterpret_cast

(
RemoteThread
)
)
,
0
)
;
AddMessageArg
*
myArg
=
reinterpret_cast

(
VirtualAllocEx
(
h
,
NULL
,
sizeof
(
AddMessageArg
)
,
MEM_COMMIT
,
PAGE_READWRITE
)
)
;
writeMem

(
reinterpret_cast

(
myArg
)
,
funcArg
)
;
HANDLE h2
=
CreateRemoteThread
(
h
,
0
,
0
,
(
LPTHREAD_START_ROUTINE
)
pRemoteThread
,
myArg
,
0
,
0
)
;
CloseHandle
(
h2
)
;
VirtualFreeEx
(
h
,
myArg
,
sizeof
(
AddMessageArg
)
,
MEM_RELEASE
)
;
CloseHandle
(
h
)
;
}
int
main
(
)
{
processId
=
GetProcessIdByWindowName
(
"GTA:SA:MP"
)
;
AddSampMessage
(
"This is C++, wow!"
,
0
)
;
}


Укажите на ошибки, почему сообщение в чат не отправляется, непон.

И да, на эту строку

C++:





Код:
VirtualFreeEx
(
h
,
myArg
,
sizeof
(
AddMessageArg
)
,
MEM_RELEASE
)
;


Выдаёт пред, очково

Код:





Код:
Предупреждение    C6333    Недопустимый параметр:  передача MEM_RELEASE и ненулевого параметра dwSize в "VirtualFreeEx" не допускается.  Это приведет к сбою вызова.
 
Ответить с цитированием

  #23  
Старый 06.07.2020, 14:22
CleanLegend
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами: 6908018

Репутация: 213
По умолчанию

Цитата:
Сообщение от Vintik  

@CleanLegend помоги братец

C++:





Код:
DWORD __stdcall
RemoteThread
(
AddMessageArg
*
arg
)
{
AddMessage msg
=
(
AddMessage
)
(
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
+
0x64010
)
)
;
// передаем адрес
msg
(
arg
->
arg1
,
arg
->
arg2
,
arg
->
arg3
,
arg
->
arg4
,
arg
->
arg5
,
arg
->
arg6
)
;
// вызываем
return
0
;
}

GetModuleHandleA не может быть вызвана таким путем, нужно получить адрес на него через GetProcAdress и позже уже передать в структуру.

Тоже самое и с текстом: "samp.dll", в памяти игры у тебя его нет, поэтому тоже ошибка, передавай в структуру.

Цитата:
Сообщение от Vintik  

C++:





Код:
HANDLE h2
=
CreateRemoteThread
(
h
,
0
,
0
,
(
LPTHREAD_START_ROUTINE
)
pRemoteThread
,
myArg
,
0
,
0
)
;
CloseHandle
(
h2
)
;
VirtualFreeEx
(
h
,
myArg
,
sizeof
(
AddMessageArg
)
,
MEM_RELEASE
)
;

Ошибка с освобождением памяти. Нужно ждать пока поток закончится, а только после освобождать память:

C++:





Код:
WaitForSingleObject
(
h2
,
INFINITE
)
;
// после CreateRemoteThread


Цитата:
Сообщение от Vintik  

C++:





Код:
VirtualFreeEx
(
h
,
myArg
,
sizeof
(
AddMessageArg
)
,
MEM_RELEASE
)
;


Выдаёт пред, очково

Код:





Код:
Предупреждение    C6333    Недопустимый параметр:  передача MEM_RELEASE и ненулевого параметра dwSize в "VirtualFreeEx" не допускается.  Это приведет к сбою вызова.

Вместо размера нужно указывать 0, компилятор тебе об это написал.
 
Ответить с цитированием

  #24  
Старый 06.07.2020, 17:18
Vintik
Познавший АНТИЧАТ
Регистрация: 18.08.2017
Сообщений: 1,568
С нами: 4598023

Репутация: 183


По умолчанию

@CleanLegend опять какая-то ерунда.

1594114830318.pngVintik · 6 Июл 2020 в 16:18' data-fancybox="lb-post-524694" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/61639/" style="cursor: pointer;" title="1594114830318.png">


Что уж теперь не так то? Я всё пофиксил из того, что ты сказал.

Цитата:
Сообщение от Спойлер  


C++:





Код:
#include 
#include 
#include 
#include 
int
processId
;
DWORD sampdll
;
int
GetProcessIdByWindowName
(
std
::
string windowName
)
{
HWND window
=
FindWindowA
(
NULL
,
reinterpret_cast

(
windowName
.
c_str
(
)
)
)
;
int
pId
=
0
;
GetWindowThreadProcessId
(
window
,
reinterpret_cast

(
&
pId
)
)
;
return
pId
;
}
DWORD
GetModuleBaseAddress
(
DWORD pid
,
const
char
*
name
)
{
HANDLE snapshot
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPMODULE
,
pid
)
;
MODULEENTRY32 mEntry
;
mEntry
.
dwSize
=
sizeof
(
MODULEENTRY32
)
;
do
{
if
(
!
strcmp
(
(
const
char
*
)
mEntry
.
szModule
,
name
)
)
{
CloseHandle
(
snapshot
)
;
return
(
DWORD
)
mEntry
.
modBaseAddr
;
}
}
while
(
Module32Next
(
snapshot
,
&
mEntry
)
)
;
}
template

T
readMem
(
int
address
)
{
T buf
;
HANDLE h
=
OpenProcess
(
PROCESS_VM_READ
,
false
,
processId
)
;
ReadProcessMemory
(
h
,
reinterpret_cast

(
address
)
,
&
buf
,
sizeof
(
T
)
,
NULL
)
;
CloseHandle
(
h
)
;
return
buf
;
}
template

void
writeMem
(
int
address
,
T buf
)
{
HANDLE h
=
OpenProcess
(
PROCESS_VM_WRITE
,
false
,
processId
)
;
int
oldProtect
=
0
;
VirtualProtectEx
(
h
,
reinterpret_cast

(
address
)
,
sizeof
(
T
)
,
PAGE_READWRITE
,
reinterpret_cast

(
&
oldProtect
)
)
;
WriteProcessMemory
(
h
,
reinterpret_cast

(
address
)
,
&
buf
,
sizeof
(
T
)
,
NULL
)
;
VirtualProtectEx
(
h
,
reinterpret_cast

(
address
)
,
sizeof
(
T
)
,
oldProtect
,
reinterpret_cast

(
&
oldProtect
)
)
;
CloseHandle
(
h
)
;
}
struct
AddMessageArg
{
DWORD arg1
;
int
arg2
;
const
char
*
arg3
;
int
arg4
;
int
arg5
;
int
arg6
;
DWORD addr
;
}
;
typedef
void
(
__cdecl
*
AddMessage
)
(
DWORD
,
int
,
const
char
*
,
int
,
int
,
int
)
;
DWORD __stdcall
RemoteThread
(
AddMessageArg
*
arg
)
{
AddMessage msg
=
(
AddMessage
)
arg
->
addr
;
msg
(
arg
->
arg1
,
arg
->
arg2
,
arg
->
arg3
,
arg
->
arg4
,
arg
->
arg5
,
arg
->
arg6
)
;
return
0
;
}
void
__stdcall
RemoteThread_end
(
)
{
}
void
AddSampMessage
(
std
::
string message
,
int
color
)
{
AddMessageArg funcArg
;
funcArg
.
arg1
=
readMem

(
sampdll
+
0x21A0E4
)
;
funcArg
.
arg2
=
4
;
funcArg
.
arg3
=
message
.
c_str
(
)
;
funcArg
.
arg4
=
0
;
funcArg
.
arg5
=
color
;
funcArg
.
arg6
=
0
;
funcArg
.
addr
=
sampdll
+
0x64010
;
HANDLE h
=
OpenProcess
(
PROCESS_ALL_ACCESS
,
false
,
processId
)
;
LPVOID pRemoteThread
=
VirtualAllocEx
(
h
,
NULL
,
reinterpret_cast

(
RemoteThread_end
)
-
reinterpret_cast

(
RemoteThread
)
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
WriteProcessMemory
(
h
,
pRemoteThread
,
reinterpret_cast

(
RemoteThread
)
,
(
reinterpret_cast

(
RemoteThread_end
)
-
reinterpret_cast

(
RemoteThread
)
)
,
0
)
;
AddMessageArg
*
myArg
=
reinterpret_cast

(
VirtualAllocEx
(
h
,
NULL
,
sizeof
(
AddMessageArg
)
,
MEM_COMMIT
,
PAGE_READWRITE
)
)
;
writeMem

(
reinterpret_cast

(
myArg
)
,
funcArg
)
;
HANDLE h2
=
CreateRemoteThread
(
h
,
0
,
0
,
reinterpret_cast

(
pRemoteThread
)
,
myArg
,
0
,
0
)
;
WaitForSingleObject
(
h2
,
INFINITE
)
;
CloseHandle
(
h2
)
;
VirtualFreeEx
(
h
,
myArg
,
0
,
MEM_RELEASE
)
;
CloseHandle
(
h
)
;
}
int
main
(
)
{
processId
=
GetProcessIdByWindowName
(
"GTA:SA:MP"
)
;
sampdll
=
GetModuleBaseAddress
(
processId
,
"samp.dll"
)
;
AddSampMessage
(
"This is C++, wow!"
,
0
)
;
}


 
Ответить с цитированием

  #25  
Старый 14.07.2020, 20:19
CleanLegend
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами: 6908018

Репутация: 213
По умолчанию

Цитата:
Сообщение от Vintik  

@CleanLegend опять какая-то ерунда.

Цитата:
Сообщение от Спойлер  


C++:





Код:
#include 
struct
AddMessageArg
{
DWORD arg1
;
int
arg2
;
const
char
*
arg3
;
int
arg4
;
int
arg5
;
int
arg6
;
DWORD addr
;
}
;


скорее всего из за того, что ты передаешь в указатель arg3 строку из локального процесса, но в самом процессе gta_sa по этому указатлю такого нет, поэтому лучше заполнить буфер: char arg3[256]. в гайде у меня пример на этом построен
 
Ответить с цитированием

  #26  
Старый 14.07.2020, 22:16
Vintik
Познавший АНТИЧАТ
Регистрация: 18.08.2017
Сообщений: 1,568
С нами: 4598023

Репутация: 183


По умолчанию

Цитата:
Сообщение от CleanLegend  

скорее всего из за того, что ты передаешь в указатель arg3 строку из локального процесса, но в самом процессе gta_sa по этому указатлю такого нет, поэтому лучше заполнить буфер: char arg3[256]. в гайде у меня пример на этом построен
Хорошо, спасибо, проверю. И еще скажи, пожалуйста, а как узнавать количество аргументов функций? Чтобы вызвать функцию, надо знать все её аргументы (и, соответственно, их количество).

Второй второй. Я сделал на DLL коллбэк (обычный 5-байтовый jmp в начале функции) на исходящее от тебя в чат сообщение и хотел бы понять, как игнорировать (не пропускать сообщение) в некоторых случаях (например, если текст содержит мат) – пытался сделать jmp в конец функции, но краш.
 
Ответить с цитированием

  #27  
Старый 14.07.2020, 22:40
CleanLegend
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами: 6908018

Репутация: 213
По умолчанию

Цитата:
Сообщение от Vintik  

Хорошо, спасибо, проверю. И еще скажи, пожалуйста, а как узнавать количество аргументов функций? Чтобы вызвать функцию, надо знать все её аргументы (и, соответственно, их количество).
Второй второй. Я сделал на DLL коллбэк (обычный 5-байтовый jmp в начале функции) на исходящее от тебя в чат сообщение и хотел бы понять, как игнорировать (не пропускать сообщение) в некоторых случаях (например, если текст содержит мат) – пытался сделать jmp в конец функции, но краш.
самый простой вариант через IDA.

что бы игнорировать функцию просто поставь ret(если функция не возвращает никаких аргументов)
 
Ответить с цитированием

  #28  
Старый 15.07.2020, 00:13
Vintik
Познавший АНТИЧАТ
Регистрация: 18.08.2017
Сообщений: 1,568
С нами: 4598023

Репутация: 183


По умолчанию

Цитата:
Сообщение от CleanLegend  

самый простой вариант через IDA.

что бы игнорировать функцию просто поставь ret(если функция не возвращает никаких аргументов)
1) IDA в CE норм? как конкретно?

2) а если возвращает чтот?
 
Ответить с цитированием

  #29  
Старый 15.07.2020, 12:08
CleanLegend
Постоянный
Регистрация: 28.03.2013
Сообщений: 495
С нами: 6908018

Репутация: 213
По умолчанию

Цитата:
Сообщение от Vintik  

1) IDA в CE норм? как конкретно?
2) а если возвращает чтот?
1. у IDA есть декомпилятор, она покажет псевдокод

2. анализируй функцию, если возврат идет в виде true/false , то будет примерно так:

C++:





Код:
true
:
mov eax
,
0x1
ret
false
(
обычно используется второй вариант
)
:
mov eax
,
0x0
ret

либо
xor
eax
,
eax
ret
 
Ответить с цитированием

  #30  
Старый 22.07.2020, 00:20
p1cador
Участник форума
Регистрация: 19.03.2014
Сообщений: 222
С нами: 6395080

Репутация: 128
По умолчанию

Также следует добавить, что взвращаемое функцией значение можно получить, разместив следуюищий код между созданием удаленного потока и закрытием хендла процесса:

C:





Код:
unsigned
__int32 retValue
=
0
;
while
(
WaitForSingleObject
(
hThread
,
0
)
!=
0
)
{
}
GetExitCodeThread
(
hThread
,
&
retValue
)
;
 
Ответить с цитированием
Ответ





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT ™ © 2001- Antichat Kft.

×

Создать сделку

Продавец: ник или ID

Название сделки:

Сумма USDT:

Срок сделки, дней:

Кто платит комиссию:

Условия сделки:

После создания сделки средства будут зарезервированы в холде до завершения сделки.

×

Мои сделки

Загрузка...
×

Сделка


Загрузка чата...