 |
|

10.08.2019, 01:50
|
|
Новичок
Регистрация: 01.11.2013
Сообщений: 22
С нами:
6593689
Репутация:
51
|
|
Сообщение от Cake_
Вот так надо
C++:
Код:
bool
CALLBACK
incomingRPC
(
stRakNetHookParams
*
params
)
{
if
(
params
->
packetId
==
ScriptRPCEnumeration
::
RPC_ScrShowTextDraw
)
{
WORD wTextID
,
cTextLen
;
stTextDrawTransmit data
;
char
cText
[
65535
]
;
BitStream
*
bsData
=
params
->
bitStream
;
bsData
->
Read
(
wTextID
)
;
bsData
->
Read
(
(
PCHAR
)
&
data
,
sizeof
(
stTextDrawTransmit
)
)
;
bsData
->
Read
(
cTextLen
)
;
bsData
->
Read
(
cText
,
cTextLen
)
;
cText
[
cTextLen
]
=
'\0'
;
stTextDrawTransmit MyTD
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
GetTransmit
(
125
,
MyTD
)
;
MyTD
.
fBoxHeight
=
0.249999
;
MyTD
.
fLetterWidth
=
0.300000
;
MyTD
.
dwBoxColor
=
-
16776961
;
MyTD
.
byteShadow
=
0
;
MyTD
.
byteOutline
=
-
1
;
MyTD
.
dwBackgroundColor
=
-
1
;
MyTD
.
byteStyle
=
2
;
MyTD
.
byteProportional
=
1
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
125
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Create
(
125
,
&
MyTD
,
"DIAMOND"
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
126
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
127
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
128
)
;
SF
->
getSAMP
(
)
->
getInfo
(
)
->
pPools
->
pTextdraw
->
Delete
(
129
)
;
}
;
return
true
;
}
;
Такой метод я пробовал, да он работает. Но вопрос как также сделать в собе, т.к. там нет функций pPools->pTextdraw->Delete() и pPools->pTextdraw->Create()
|
|
|

10.08.2019, 19:04
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от Adder
Такой метод я пробовал, да он работает. Но вопрос как также сделать в собе, т.к. там нет функций pPools->pTextdraw->Delete() и pPools->pTextdraw->Create()
Есть несколько путей решения данной проблемы.
Первый - реализовать класс textdraw (обертку над пулом). Можно взять реализацию из SAMPAPI, благо он опенсурс.
Но если тебе нужны лишь эти две функции, то смысла тянуть весь класс в проект не особо вижу.
Второй - просто добавить эти две функции.
C++:
Код:
stTextdraw
*
CreateTextDraw
(
int
nId
,
stTextDrawTransmit
*
pTransmit
,
const
char
*
szText
)
{
return
(
(
stTextdraw
*
(
__thiscall
*
)
(
stTextdrawPool
*
,
int
,
stTextDrawTransmit
*
,
const
char
*
)
)
(
g_dwSAMP_Addr
+
0x1AE20
)
)
(
g_SAMP
->
pPools
->
pTextdraw
,
nId
,
pTransmit
,
szText
)
;
}
void
DeleteTextDraw
(
uint16_t
nId
)
{
(
(
void
(
__thiscall
*
)
(
stTextdrawPool
*
,
uint16_t
)
)
(
g_dwSAMP_Addr
+
0x1AD00
)
)
(
g_SAMP
->
pPools
->
pTextdraw
,
nId
)
;
}
Не факт, что работает - проверь. У самого нет возможности проверить.
|
|
|

10.08.2019, 19:29
|
|
Новичок
Регистрация: 01.11.2013
Сообщений: 22
С нами:
6593689
Репутация:
51
|
|
Сообщение от Roger571
Есть несколько путей решения данной проблемы.
Первый - реализовать класс textdraw (обертку над пулом). Можно взять реализацию из SAMPAPI, благо он опенсурс.
Но если тебе нужны лишь эти две функции, то смысла тянуть весь класс в проект не особо вижу.
Второй - просто добавить эти две функции.
C++:
Код:
stTextdraw
*
CreateTextDraw
(
int
nId
,
stTextDrawTransmit
*
pTransmit
,
const
char
*
szText
)
{
return
(
(
stTextdraw
*
(
__thiscall
*
)
(
stTextdrawPool
*
,
int
,
stTextDrawTransmit
*
,
const
char
*
)
)
(
g_dwSAMP_Addr
+
0x1AE20
)
)
(
g_SAMP
->
pPools
->
pTextdraw
,
nId
,
pTransmit
,
szText
)
;
}
void
DeleteTextDraw
(
uint16_t
nId
)
{
(
(
void
(
__thiscall
*
)
(
stTextdrawPool
*
,
uint16_t
)
)
(
g_dwSAMP_Addr
+
0x1AD00
)
)
(
g_SAMP
->
pPools
->
pTextdraw
,
nId
)
;
}
Не факт, что работает - проверь. У самого нет возможности проверить.
Не знал, что он в открытом доступе есть. Теперь буду знать.
И перезаписать получилось, я что-то тупанул и забыл длину записать. Поэтому нормально не перезаписывало.
За функции спасибо
|
|
|

11.08.2019, 22:22
|
|
Постоянный
Регистрация: 28.02.2018
Сообщений: 307
С нами:
4319022
Репутация:
113
|
|
Всем привет, пытаюсь поставит хук на самповскую функцию SAMP_FUNC_SENDCMD 0x65C60
ставлю через https://blast.hk/threads/30412/
C++:
Код:
DWORD Trampoline
=
0x0
;
byte prologue
[
6
]
;
void
UserHook
(
void
*
_this
,
char
*
message
)
{
MessageBoxA
(
NULL
,
message
,
"sadasd"
,
NULL
)
;
__asm jmp Trampoline
}
// устанавливаю
DWORD Addr
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
SAMP_FUNC_SENDCMD
;
Trampoline
=
MakeJump
(
Addr
,
(
DWORD
)
&
UserHook
,
prologue
,
6
)
;
но при вызове команды происходит краш
вот скрины с енжина
до
и после установки
по моему выглядит красиво, но все же я где-то проебался
пробовал и с __stdcall функцию UserHook, и брал размер пролога 8 вместо 6 тоже не помогло, что я делаю не так?
|
|
|

11.08.2019, 22:41
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Скорее я тупой и не вижу очевидного.
Возникла проблема с получением имени сетевого адаптера и я в душе не чаю, что не так и в какой магической кодировке оно находится.
Самое интересное, описание в нормальном виде. У обоих тип char*, ес шо.
Вот, сообсна, код.
C++:
Код:
PIP_ADAPTER_INFO pAdapter
=
pAdapterInfo
;
while
(
pAdapter
)
{
Log
(
"Adapter Name: %s %s\n"
,
pAdapter
->
AdapterName
,
pAdapter
->
Description
)
;
Log
(
"IP Address: %s\n"
,
pAdapter
->
IpAddressList
.
IpAddress
.
String
)
;
pAdapter
=
pAdapter
->
Next
;
}
Вот лог:
{D387BCE2-FD49-4AFA-AA49-E7634ED15008} Intel(R) Ethernet Connection (2) I219-V
А теперь главный вопрос, как привести имя адаптера в человеческий вид?
|
|
|

11.08.2019, 22:51
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
Сообщение от Roger571
Скорее я тупой и не вижу очевидного.
Возникла проблема с получением имени сетевого адаптера и я в душе не чаю, что не так и в какой магической кодировке оно находится.
Самое интересное, описание в нормальном виде. У обоих тип char*, ес шо.
Вот, сообсна, код.
C++:
Код:
PIP_ADAPTER_INFO pAdapter
=
pAdapterInfo
;
while
(
pAdapter
)
{
Log
(
"Adapter Name: %s %s\n"
,
pAdapter
->
AdapterName
,
pAdapter
->
Description
)
;
Log
(
"IP Address: %s\n"
,
pAdapter
->
IpAddressList
.
IpAddress
.
String
)
;
pAdapter
=
pAdapter
->
Next
;
}
Вот лог:
А теперь главный вопрос, как привести имя адаптера в человеческий вид?
вот тут должно быть то, что тебе нужно https://books.google.com.ua/books?i...oECAgQAQ#v=onepage&q=имя адаптера c++&f=false
|
|
|

11.08.2019, 23:04
|
|
Познающий
Регистрация: 22.07.2015
Сообщений: 58
С нами:
5689694
Репутация:
68
|
|
Сообщение от Cake_
вот тут должно быть то, что тебе нужно
Оно то есть, да и в других примерах работы с этой библиотекой у людей все нормально и имя адаптера выводится в читаемом формате.
Если интересно, можешь попробовать у себя
Сообщение от Спойлер
C++:
Код:
#pragma comment (lib, "Iphlpapi.lib")
#include "Windows.h"
#include "stdio.h"
#include "iphlpapi.h"
int
main
(
)
{
IP_ADAPTER_INFO
*
pAdapterInfo
;
ULONG ulOutBufLen
;
DWORD dwRetVal
;
pAdapterInfo
=
(
IP_ADAPTER_INFO
*
)
malloc
(
sizeof
(
IP_ADAPTER_INFO
)
)
;
ulOutBufLen
=
sizeof
(
IP_ADAPTER_INFO
)
;
if
(
GetAdaptersInfo
(
pAdapterInfo
,
&
ulOutBufLen
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterInfo
)
;
pAdapterInfo
=
(
IP_ADAPTER_INFO
*
)
malloc
(
ulOutBufLen
)
;
}
if
(
(
dwRetVal
=
GetAdaptersInfo
(
pAdapterInfo
,
&
ulOutBufLen
)
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterInfo
)
;
}
PIP_ADAPTER_INFO pAdapter
=
pAdapterInfo
;
while
(
pAdapter
)
{
printf
(
"Adapter Name: %s %s\n"
,
pAdapter
->
AdapterName
,
pAdapter
->
Description
)
;
printf
(
"IP Address: %s\n"
,
pAdapter
->
IpAddressList
.
IpAddress
.
String
)
;
pAdapter
=
pAdapter
->
Next
;
}
if
(
pAdapterInfo
)
free
(
pAdapterInfo
)
;
system
(
"pause"
)
;
return
0
;
}
|
|
|

11.08.2019, 23:06
|
|
Постоянный
Регистрация: 28.02.2018
Сообщений: 307
С нами:
4319022
Репутация:
113
|
|
Сообщение от Roger571
Оно то есть, да и в других примерах работы с этой библиотекой у людей все нормально и имя адаптера выводится в читаемом формате.
Если интересно, можешь попробовать у себя
Сообщение от Спойлер
C++:
Код:
#pragma comment (lib, "Iphlpapi.lib")
#include "Windows.h"
#include "stdio.h"
#include "iphlpapi.h"
int
main
(
)
{
IP_ADAPTER_INFO
*
pAdapterInfo
;
ULONG ulOutBufLen
;
DWORD dwRetVal
;
pAdapterInfo
=
(
IP_ADAPTER_INFO
*
)
malloc
(
sizeof
(
IP_ADAPTER_INFO
)
)
;
ulOutBufLen
=
sizeof
(
IP_ADAPTER_INFO
)
;
if
(
GetAdaptersInfo
(
pAdapterInfo
,
&
ulOutBufLen
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterInfo
)
;
pAdapterInfo
=
(
IP_ADAPTER_INFO
*
)
malloc
(
ulOutBufLen
)
;
}
if
(
(
dwRetVal
=
GetAdaptersInfo
(
pAdapterInfo
,
&
ulOutBufLen
)
)
!=
ERROR_SUCCESS
)
{
free
(
pAdapterInfo
)
;
}
PIP_ADAPTER_INFO pAdapter
=
pAdapterInfo
;
while
(
pAdapter
)
{
printf
(
"Adapter Name: %s %s\n"
,
pAdapter
->
AdapterName
,
pAdapter
->
Description
)
;
printf
(
"IP Address: %s\n"
,
pAdapter
->
IpAddressList
.
IpAddress
.
String
)
;
pAdapter
=
pAdapter
->
Next
;
}
if
(
pAdapterInfo
)
free
(
pAdapterInfo
)
;
system
(
"pause"
)
;
return
0
;
}
В примере вроде похожее имя адаптера?

|
|
|

11.08.2019, 23:13
|
|
Участник форума
Регистрация: 04.04.2017
Сообщений: 263
С нами:
4793630
Репутация:
133
|
|
|
|
|

11.08.2019, 23:32
|
|
Постоянный
Регистрация: 18.03.2017
Сообщений: 410
С нами:
4818548
Репутация:
133
|
|
Сообщение от Stiopko
Всем привет, пытаюсь поставит хук на самповскую функцию SAMP_FUNC_SENDCMD 0x65C60
ставлю через https://blast.hk/threads/30412/
C++:
Код:
DWORD Trampoline
=
0x0
;
byte prologue
[
6
]
;
void
UserHook
(
void
*
_this
,
char
*
message
)
{
MessageBoxA
(
NULL
,
message
,
"sadasd"
,
NULL
)
;
__asm jmp Trampoline
}
// устанавливаю
DWORD Addr
=
SF
->
getSAMP
(
)
->
getSAMPAddr
(
)
+
SAMP_FUNC_SENDCMD
;
Trampoline
=
MakeJump
(
Addr
,
(
DWORD
)
&
UserHook
,
prologue
,
6
)
;
но при вызове команды происходит краш
вот скрины с енжина
до
и после установки
по моему выглядит красиво, но все же я где-то проебался
пробовал и с __stdcall функцию UserHook, и брал размер пролога 8 вместо 6 тоже не помогло, что я делаю не так?
Крашит т.к. функция __thiscall + хук будет затирать инструкцию mov
https://blast.hk/threads/781/post-359737
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|