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

  #6701  
Старый 18.01.2023, 17:42
ARMOR
Флудер
Регистрация: 02.02.2019
Сообщений: 5,070
С нами: 3831395

Репутация: 183


По умолчанию

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

Как найти функцию через IDA? К примеру, добавления сообщения в чат.
Пытаюсь, но, увы, не получается.
Прошу объяснить пошагово.

Открыл в IDA samp.dll, пытался по строкам найти функцию.
Вот тут можешь увидеть вот эту строчку:



Это вызов функции 64520. В неё передается два параметра: Указатель на структуру чата, и сообщение ( Эта функция в САМП'е отвечает за отправление в чат сообщений по типу "Connecting to 185.189.15.89:7228...", "The server is full. Retrying"). Цвет ты тут указать не можешь, ибо функция берет цвет из структуры CChat.

Цвет у тебя будет такой:



Ну, или если у тебя замененный samp.dll то цвет может отличаться.

Если ты хочешь указывать цвет сам - тебе нужна функция CChat_AddMessage. В R1 её смещение 645A0. Принимает агрументы в таком порядке:

C++:





Код:
(
CChat
*
this_
,
int
color
,
const
char
*
text
)
 
Ответить с цитированием

  #6702  
Старый 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
)
;
}
)
;
 
Ответить с цитированием

  #6703  
Старый 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
)
;
}
)
;
 
Ответить с цитированием

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

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

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

Решил немного залезть в реверс.
Открыл иду и в неё кинул samp.dll.

Решил пропатчить строку от сампа, нашёл её адрес в IDA (наверное), пытаюсь пропатчить, но, она не патчится. То есть, текст там изменить хочу, но, он не изменяется.

C++:





Код:
SF
->
getSAMP
(
)
->
registerChatCommand
(
"patch"
,
[
]
(
std
::
string params
)
{
strcpy
(
(
char
*
)
0x100D3A78
,
"SWWWWW CCCCCC the connection."
)
;
AddChat
(
-
1
,
"Наверное, пропатчилось..."
)
;
}
)
;

C++ R3:





Код:
std
::
string str_kicked
{
"Сервер закрыл соединение."
}
;
//0x8A77
class
patchstr_kicked
{
private
:
uintptr_t module_samp
{
0
}
;
public
:
patchstr_kicked
(
)
{
module_samp
=
reinterpret_cast

(
GetModuleHandleA
(
"samp.dll"
)
)
;
DWORD lpflOldProtect
;
VirtualProtect
(
reinterpret_cast

(
module_samp
+
0x8A77
)
,
0x4
,
PAGE_EXECUTE_READWRITE
,
&
lpflOldProtect
)
;
*
reinterpret_cast

(
module_samp
+
0x8A77
)
=
&
str_kicked
[
0
]
;
VirtualProtect
(
reinterpret_cast

(
module_samp
+
0x8A77
)
,
0x4
,
lpflOldProtect
,
&
lpflOldProtect
)
;
}
}
pstr_kicked
;


Цвет можешь указывать вот так:

С++:





Код:
std::string str_kicked{ " {ff0000} Сервер закрыл соединение." };


Либо

С++:





Код:
std::string str_kicked{ " {red} Сервер закрыл соединение." };
 
Ответить с цитированием

  #6705  
Старый 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">
 
Ответить с цитированием

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

Репутация: 183


По умолчанию

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

  #6707  
Старый 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
;
}


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

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




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

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

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

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

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

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

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

Посмотри исходники samp mobile
Смотрел, но не че не нашел похожего на вызов функций
 
Ответить с цитированием

  #6710  
Старый 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);
}
 
Ответить с цитированием
Ответ





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


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




ANTICHAT ™ © 2001- Antichat Kft.