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

  #1  
Старый 18.01.2023, 23:07
Yuriy Code
Постоянный
Регистрация: 01.05.2021
Сообщений: 752
С нами: 2650753

Репутация: 98


По умолчанию

Пытаюсь вызвать функцию из samp.dll, но крашит. Что не так?





C++:





Код:
SF
->
getSAMP
(
)
->
registerChatCommand
(
"func"
,
[
]
(
std
::
string params
)
{
using
func_type
=
int
(
__stdcall
*
)
(
const
char
*
a1
,
int
a2
,
int
a3
)
;
func_type func
=
reinterpret_cast

(
(
DWORD
)
(
GetModuleHandle
(
"samp.dll"
)
+
0x9C2C0
)
)
;
func
(
"Func called"
,
0x3E8
,
5
)
;
}
)
;
 
Ответить с цитированием

  #2  
Старый 19.01.2023, 02:56
kin4stat
Флудер
Регистрация: 06.11.2017
Сообщений: 2,759
С нами: 4483143

Репутация: 183


По умолчанию

Цитата:
Сообщение от Yuriy Code  

Пытаюсь вызвать функцию из samp.dll, но крашит. Что не так?

C++:





Код:
SF
->
getSAMP
(
)
->
registerChatCommand
(
"func"
,
[
]
(
std
::
string params
)
{
using
func_type
=
int
(
__stdcall
*
)
(
const
char
*
a1
,
int
a2
,
int
a3
)
;
func_type func
=
reinterpret_cast

(
(
DWORD
)
(
GetModuleHandle
(
"samp.dll"
)
+
0x9C2C0
)
)
;
func
(
"Func called"
,
0x3E8
,
5
)
;
}
)
;

В оригинале там
Код:
thiscall
, и сигнатура выглядит вот так:

Код:
void __thiscall sub_A05D0(CGame *this, char *text, int duration, int style)
Но CGame можно опустить, потому что он не используется. Короче тебе просто повезло.

А ошибка в том, что ты прибавляешь к результату GetModuleHandle число напрямую. А под ним лежит указатель, поэтому прибавляется неверное количество байт. Правильно будет вот так:

C++:





Код:
SF
->
getSAMP
(
)
->
registerChatCommand
(
"func"
,
[
]
(
std
::
string params
)
{
using
func_type
=
void
(
__stdcall
*
)
(
const
char
*
,
int
,
int
)
;
auto
sampbase
=
reinterpret_cast

(
GetModuleHandle
(
"samp.dll"
)
)
;
func_type func
=
reinterpret_cast

(
sampbase
+
0x9C2C0
)
;
func
(
"Func called"
,
1000
,
5
)
;
}
)
;


А еще правильнее вот так:

C++:





Код:
SF
->
getSAMP
(
)
->
registerChatCommand
(
"func"
,
[
]
(
std
::
string params
)
{
using
func_type
=
void
(
__thiscall
*
)
(
void
*
,
const
char
*
,
int
,
int
)
;
auto
sampbase
=
reinterpret_cast

(
GetModuleHandle
(
"samp.dll"
)
)
;
func_type func
=
reinterpret_cast

(
sampbase
+
0x9C2C0
)
;
func
(
*
reinterpet_cast

(
sampbase
+
/* R3 Addr: 0x26E8F4 */
)
,
"Func called"
,
1000
,
5
)
;
}
)
;
 
Ответить с цитированием

  #3  
Старый 23.01.2023, 22:26
ARMOR
Флудер
Регистрация: 02.02.2019
Сообщений: 5,070
С нами: 3831395

Репутация: 183


По умолчанию

Как можно получить ID процесса по его названию? Нашел такую функцию в интернете:



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


C++:





Код:
DWORD
GetProcessID
(
const
char
*
processName
)
{
if
(
!
processName
)
return
0
;
DWORD id
=
0
;
HANDLE hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
0
)
;
if
(
hSnap
)
{
PROCESSENTRY32 pe32
=
{
sizeof
(
PROCESSENTRY32
)
}
;
if
(
Process32First
(
hSnap
,
&
pe32
)
)
{
while
(
Process32Next
(
hSnap
,
&
pe32
)
)
{
if
(
strcmp
(
processName
,
pe32
.
szExeFile
)
==
0
)
{
id
=
pe32
.
th32ProcessID
;
break
;
}
}
}
}
CloseHandle
(
hSnap
)
;
return
id
;
}


Но она выдает ошибку:

1674498319091.pngARMOR · 23 Янв 2023 в 21:26' data-fancybox="lb-post-1242938" data-lb-caption-extra-html="" data-lb-sidebar-href="" data-single-image="1" data-src="https://www.blast.hk/attachments/187046/" style="cursor: pointer;" title="1674498319091.png">
 
Ответить с цитированием

  #4  
Старый 23.01.2023, 22:29
EclipsedFlow
Познавший АНТИЧАТ
Регистрация: 18.09.2017
Сообщений: 1,044
С нами: 4553429

Репутация: 153


По умолчанию

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

Как можно получить ID процесса по его названию? Нашел такую функцию в интернете:

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


C++:





Код:
DWORD
GetProcessID
(
const
char
*
processName
)
{
if
(
!
processName
)
return
0
;
DWORD id
=
0
;
HANDLE hSnap
=
CreateToolhelp32Snapshot
(
TH32CS_SNAPPROCESS
,
0
)
;
if
(
hSnap
)
{
PROCESSENTRY32 pe32
=
{
sizeof
(
PROCESSENTRY32
)
}
;
if
(
Process32First
(
hSnap
,
&
pe32
)
)
{
while
(
Process32Next
(
hSnap
,
&
pe32
)
)
{
if
(
strcmp
(
processName
,
pe32
.
szExeFile
)
==
0
)
{
id
=
pe32
.
th32ProcessID
;
break
;
}
}
}
}
CloseHandle
(
hSnap
)
;
return
id
;
}


Но она выдает ошибку:
В настройках проекта выбери - многобайтовую кодировку.

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




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

  #5  
Старый 23.01.2023, 22:27
Dark_Knight
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами: 6921957

Репутация: 183


По умолчанию

Поставь компиляцию строк в мультибайте, а не в unicode
 
Ответить с цитированием

  #6  
Старый 26.01.2023, 14:13
Young123
Новичок
Регистрация: 08.10.2022
Сообщений: 10
С нами: 1895177

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

Как можно вызвать функции из libsamp.so или libgtasa.so на samp mobile? Я в этом мало знаю, как это можно сделать? (К примеру вывод текста в чат)
 
Ответить с цитированием

  #7  
Старый 29.01.2023, 17:29
Young123
Новичок
Регистрация: 08.10.2022
Сообщений: 10
С нами: 1895177

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

Помогите, компилю, но текст не выводится (делаю на самп мобайл)

Код:





Код:
#include "main.h"
#include "armhook.h"

void AddMessageJumpQ(const char* text, unsigned int time, unsigned short flag, bool bPreviousBrief)
{
    ((void(__cdecl*)(const char*, unsigned int, unsigned short, bool))(g_libGTASA+0x4D1EA4))(text, time, flag, bPreviousBrief);
}

void InitializeAndLoad() {
    while (*reinterpret_cast(g_libGTASA+0x9E75B8) != 9) {
        std::this_thread::sleep_for(std::chrono::milliseconds(100u));
    }
    AddMessageJumpQ("~r~Hello from blast.hk", 5000, 0, false);
}
 
Ответить с цитированием

  #8  
Старый 06.02.2023, 06:05
writeline
Новичок
Регистрация: 16.01.2022
Сообщений: 28
С нами: 2276608

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

Есть какой либо сорц по смени имени окна уже после подключения к серверу либо инициализации плагина?​По типу такого:




Может кто то, что нибудь подсказать?
 
Ответить с цитированием

  #9  
Старый 06.02.2023, 13:29
AdCKuY_DpO4uLa
Постоянный
Регистрация: 05.08.2018
Сообщений: 372
С нами: 4091290

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

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

Есть какой либо сорц по смени имени окна уже после подключения к серверу либо инициализации плагина?​По типу такого:



Может кто то, что нибудь подсказать?

SetWindowText(handle, "Заголовок");
 
Ответить с цитированием

  #10  
Старый 06.02.2023, 22:58
writeline
Новичок
Регистрация: 16.01.2022
Сообщений: 28
С нами: 2276608

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

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

SetWindowText(handle, "Заголовок");
Подскажи если сможешь, почему не хочет работать? 🧐

C++:





Код:
void
windtext
(
)
{
HWND hwnd
=
FindWindow
(
NULL
,
"GTA:SA:MP"
)
;
if
(
hwnd
==
NULL
)
{
MessageBox
(
NULL
,
"Window not found!"
,
"Error"
,
MB_OK
)
;
}
std
::
string newText
=
"GTA:BLAST.HK"
;
SetWindowText
(
hwnd
,
newText
.
c_str
(
)
)
;
}
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.