 |
|

16.08.2019, 12:18
|
|
Постоянный
Регистрация: 28.02.2018
Сообщений: 307
С нами:
4319022
Репутация:
113
|
|
Сообщение от p1cador
@Stiopko, код, реализующий перенаправление из функции в другое место хоть и [S]говно[/S]плоховат, но свою задачу выполняет (не поленился, проверил дебагером).
Возможно, ты создал объект Hook на стеке, в результате чего после выхода из области видимости, автоматически вызвался деструктор. Попробуй создавать его на куче через new
а что в коде говно, хочу узнать чтоби в будущем писать меньше говна
upd: нашел ошибку там вместо memset((void*)(addr - 4), 0x90, size-4);
нужно memset((void*)(addr + 4), 0x90, size-4);
Сообщение от p1cador
@Stiopko
Возможно, ты создал объект Hook на стеке, в результате чего после выхода из области видимости, автоматически вызвался деструктор. Попробуй создавать его на куче через new
upd: не знал что такое может быть, я просто его в вектор записываю, попробую указатель записывать
upd: все работает, спасибо
|
|
|

16.08.2019, 22:47
|
|
Познавший АНТИЧАТ
Регистрация: 22.02.2017
Сообщений: 1,474
С нами:
4852492
Репутация:
88
|
|
Сообщение от Stiopko
Здарова, сделал я структуру для хука, но она почему-то не ставит хук, хотя просто функция работала нормально, как можно решить?
C++:
Код:
struct
Hook
{
DWORD addr
=
NULL
;
byte
*
data
=
nullptr
;
size_t size
=
NULL
;
Hook
(
const
DWORD
&
addr
,
const
DWORD
&
func
,
const
size_t
&
size
=
5
)
{
this
->
data
=
new
byte
[
size
]
;
this
->
size
=
size
;
this
->
addr
=
addr
;
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
data
,
(
void
*
)
addr
,
size
)
;
memset
(
(
void
*
)
(
addr
-
4
)
,
0x90
,
size
-
4
)
;
*
(
byte
*
)
(
addr
)
=
0xE9
;
// jmp
*
(
unsigned
int
*
)
(
addr
+
1
)
=
func
-
(
addr
+
5
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
}
~
Hook
(
)
{
if
(
data
!=
nullptr
)
{
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
(
void
*
)
addr
,
data
,
size
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
delete
[
]
data
;
}
}
}
;
C++:
[CODE]
void
injectCall
(
char
*
mainaddrress
,
char
*
target
,
size_t bytes
=
5
)
{
DWORD protection
=
PAGE_READWRITE
;
VirtualProtect
(
mainaddrress
,
bytes
,
protection
,
&
protection
)
;
*
mainaddrress
=
0xE8
;
*
reinterpret_cast
(
mainaddrress
+
1
)
=
reinterpret_cast
(
target
)
-
(
reinterpret_cast
(
mainaddrress
)
+
5
)
;
for
(
size_t i
=
5
;
i
(
mainaddrress
+
1
)
=
reinterpret_cast
(
target
)
-
(
reinterpret_cast
(
mainaddrress
)
+
5
)
;
for
(
size_t i
=
5
;
i
|
|
|

17.08.2019, 16:43
|
|
Участник форума
Регистрация: 19.03.2014
Сообщений: 222
С нами:
6395080
Репутация:
128
|
|
Сообщение от Stiopko
а что в коде говно, хочу узнать чтоби в будущем писать меньше говна
не предусмотрена возможность вызова оригинальной функции
не предусмотрена возможность установки более одного хука на функцию
не сохранены значения регистров
|
|
|

17.08.2019, 16:50
|
|
Постоянный
Регистрация: 28.02.2018
Сообщений: 307
С нами:
4319022
Репутация:
113
|
|
Сообщение от p1cador
не предусмотрена возможность вызова оригинальной функции
не предусмотрена возможность установки более одного хука на функцию
не сохранены значения регистров
Сообщение от p1cador
не предусмотрена возможность установки более одного хука на функцию
Будит)
Только, что закончил
C++:
Код:
struct
Hook
{
DWORD addr
=
NULL
;
byte
*
data
=
nullptr
;
size_t size
=
NULL
;
DWORD trampoline
=
NULL
;
size_t addBytesSize
=
NULL
;
Hook
(
const
DWORD
&
addr
,
const
DWORD
&
func
,
const
char
*
addBytes
,
const
size_t
&
addBytesSize
,
const
size_t
&
size
=
5
)
{
// addBytes для пуша аргументов функции func
this
->
data
=
new
byte
[
size
]
;
this
->
size
=
size
;
this
->
addr
=
addr
;
this
->
addBytesSize
=
addBytesSize
;
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
data
,
(
void
*
)
addr
,
size
)
;
trampoline
=
(
DWORD
)
VirtualAlloc
(
0
,
addBytesSize
+
size
+
12
,
MEM_COMMIT
|
MEM_RESERVE
,
PAGE_EXECUTE_READWRITE
)
;
// pushad / addBytes / call func / popad / замененные байты / джамп назад
*
(
byte
*
)
trampoline
=
0x60
;
// pushad
memcpy
(
(
void
*
)
(
trampoline
+
1
)
,
addBytes
,
addBytesSize
)
;
// addBytes
*
(
byte
*
)
(
trampoline
+
addBytesSize
+
1
)
=
0xE8
;
//call
*
(
size_t
*
)
(
trampoline
+
addBytesSize
+
2
)
=
func
-
(
trampoline
+
addBytesSize
+
6
)
;
// func
*
(
byte
*
)
(
trampoline
+
addBytesSize
+
6
)
=
0x61
;
// popad
memcpy
(
(
void
*
)
(
trampoline
+
addBytesSize
+
7
)
,
data
,
size
)
;
// замененные байты
*
(
byte
*
)
(
trampoline
+
addBytesSize
+
size
+
7
)
=
0xE9
;
// jmp
*
(
size_t
*
)
(
trampoline
+
addBytesSize
+
size
+
8
)
=
addr
+
5
-
(
trampoline
+
addBytesSize
+
size
+
12
)
;
// jmp to
memset
(
(
void
*
)
(
addr
+
4
)
,
0x90
,
size
-
4
)
;
*
(
byte
*
)
(
addr
)
=
0xE9
;
// jmp
*
(
unsigned
int
*
)
(
addr
+
1
)
=
trampoline
-
(
addr
+
5
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
}
~
Hook
(
)
{
if
(
data
!=
nullptr
)
{
DWORD dwProt
=
PAGE_EXECUTE_READWRITE
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
&
dwProt
)
;
memcpy
(
(
void
*
)
addr
,
data
,
size
)
;
VirtualProtect
(
(
void
*
)
addr
,
size
,
dwProt
,
NULL
)
;
memset
(
(
void
*
)
trampoline
,
NULL
,
addBytesSize
+
size
+
12
)
;
VirtualFree
(
(
void
*
)
trampoline
,
addBytesSize
+
size
+
12
,
MEM_RELEASE
)
;
delete
[
]
data
;
}
}
}
;
|
|
|

17.08.2019, 17:04
|
|
Постоянный
Регистрация: 28.02.2018
Сообщений: 307
С нами:
4319022
Репутация:
113
|
|
Сообщение от ШPEK
Ты используешь jmp, вместо ret
где, я не понил?
Есть ли у кого-то адрес функции которая вызывается когда в чате нажимают ентер? Мне просто нужно заменить текст, я искал в СЕ, всегда когда я заменял текст было уже поздно и плагин узнавал что его вызывают
-----------------------
Решено, если кому надо вот по этому адресу 0x65DB4 делаем хук там сохраняем регистры , потом lea ebp,[esi+000014E5] и все в ebp адрес нашей строки далее пушим в стек и вызываем функу
|
|
|

18.08.2019, 09:58
|
|
Новичок
Регистрация: 12.08.2019
Сообщений: 6
С нами:
3555044
Репутация:
1
|
|
Сообщение от Cake_
рпк и пакеты это разные вещи. рпк отправляются / приходят в момент какого-то события например сервер показал нам диалог в этот момент нам приходит ShowDialog - ID: 61. а пакеты же используются для того чтобы отправлять информацию серверу об твоём хп / позиции / положении твоей камеры / являешься ли ты наблюдателем / отправка BULLET SYNC(в момент стрельбы) пример, когда мы двигаемся отправляется он фут дата (ID_PLAYER_SYNC), оно отправляется даже когда персонаж не двигается(отправляется с меньшей частотой)
update: https://github.com/BrunoBM16/samp-pa.../wiki/RPC-List тут можешь глянуть инфу об всех пакетах / rpc
Здравствуйте. Это опять я
Ссылку которую вы отправили, там кажется некоторые устарели (или я что то не понял, вообщем иногда данные не правильно берутся). Как мне понять это самому по RPC ? Ну например я перехватил RPC которую отправил клиент -> сервер. Как мне его прочитать ? Есть ли какой либо способ сделать так, что бы я мог определять параметры пакета ?
|
|
|

18.08.2019, 10:30
|
|
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами:
4472205
Репутация:
163
|
|
Сообщение от MuhaPW
Здравствуйте. Это опять я 
Ссылку которую вы отправили, там кажется некоторые устарели (или я что то не понял, вообщем иногда данные не правильно берутся). Как мне понять это самому по RPC ? Ну например я перехватил RPC которую отправил клиент -> сервер. Как мне его прочитать ? Есть ли какой либо способ сделать так, что бы я мог определять параметры пакета ?
Софт - RakLogger+ (0.3.7)
RakLogger+ by FYP BLASTHACK.NET Сниффер RakNet-трафика для SA-MP. Функционал: Логирование в файл входящих/исходящих пакетов и RPC. Получение списка зарегистрированных RPC. Вывод данных на экран. Сохранение в формате JSON. Гибкая настройка. Описание настроек Секция "settings" - основные...
blast.hk
|
|
|

18.08.2019, 10:31
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
Сообщение от MuhaPW
Здравствуйте. Это опять я 
Ссылку которую вы отправили, там кажется некоторые устарели (или я что то не понял, вообщем иногда данные не правильно берутся). Как мне понять это самому по RPC ? Ну например я перехватил RPC которую отправил клиент -> сервер. Как мне его прочитать ? Есть ли какой либо способ сделать так, что бы я мог определять параметры пакета ?
Нечего там не устарело. Читать битсрим нужно строго в той последовательности которой они иницилизированы на гитхабе.
|
|
|

18.08.2019, 10:57
|
|
Новичок
Регистрация: 13.10.2017
Сообщений: 28
С нами:
4516996
Репутация:
13
|
|
hi
как правильно настроить проект так, чтобы не оставалось всяких следов в памяти связанных с твоей учетной записью, самой студией и тд
и еще, имгуи тоже оставляет следы, как исправить?

|
|
|

18.08.2019, 11:50
|
|
Постоянный
Регистрация: 14.11.2017
Сообщений: 319
С нами:
4472205
Репутация:
163
|
|
Сообщение от enziweee
hi
как правильно настроить проект так, чтобы не оставалось всяких следов в памяти связанных с твоей учетной записью, самой студией и тд
и еще, имгуи тоже оставляет следы, как исправить?
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|