 |
|

18.01.2023, 17:42
|
|
Флудер
Регистрация: 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
)
|
|
|

18.01.2023, 23:07
|
|
Постоянный
Регистрация: 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
)
;
}
)
;
|
|
|

19.01.2023, 02:56
|
|
Флудер
Регистрация: 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
)
;
}
)
;
В оригинале там
, и сигнатура выглядит вот так:
Код:
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
)
;
}
)
;
|
|
|

19.01.2023, 14:22
|
|
Новичок
Регистрация: 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} Сервер закрыл соединение." };
|
|
|

23.01.2023, 22:26
|
|
Флудер
Регистрация: 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">

|
|
|

23.01.2023, 22:27
|
|
Флудер
Регистрация: 18.03.2013
Сообщений: 4,080
С нами:
6921957
Репутация:
183
|
|
Поставь компиляцию строк в мультибайте, а не в unicode
|
|
|

23.01.2023, 22:29
|
|
Познавший АНТИЧАТ
Регистрация: 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
;
}
Но она выдает ошибку:
В настройках проекта выбери - многобайтовую кодировку.
|
|
|

26.01.2023, 14:13
|
|
Новичок
Регистрация: 08.10.2022
Сообщений: 10
С нами:
1895177
Репутация:
3
|
|
Как можно вызвать функции из libsamp.so или libgtasa.so на samp mobile? Я в этом мало знаю, как это можно сделать? (К примеру вывод текста в чат)
|
|
|

26.01.2023, 14:31
|
|
Новичок
Регистрация: 08.10.2022
Сообщений: 10
С нами:
1895177
Репутация:
3
|
|
Сообщение от withay
Посмотри исходники samp mobile
Смотрел, но не че не нашел похожего на вызов функций
|
|
|

29.01.2023, 17:29
|
|
Новичок
Регистрация: 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)
|
|
|
|