- 320
- 545
fontawesome
fontawesome
Пробовал в хуке вот так:Как по мне это гавно метод. Лучше в хуке на рпк менять
if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowTextDraw)
{
stTextDrawTransmit txd;
WORD txdID, cTextLen; char cText[800];
params->bitStream->ResetReadPointer();
params->bitStream->Read(txdID);
params->bitStream->Read((PCHAR)&txd, sizeof(stTextDrawTransmit));
params->bitStream->Read(cTextLen);
params->bitStream->Read(cText, cTextLen);
params->bitStream->ResetReadPointer();
cText[cTextLen] = '\0';
if (txdID == 6) {
params->bitStream->ResetWritePointer();
params->bitStream->Write(txdID);
params->bitStream->Write((PCHAR)&txd, sizeof(stTextDrawTransmit));
strcpy_s(cText, "Test");
params->bitStream->Write(cText, strlen(cText));
}
return true;
}
Вот так надоПробовал в хуке вот так:
Видно я не правильно перезаписываю, потому что в чат выбивает вот это: Warning: ignoring large TextDraw size=25940Код:if (params->packetId == ScriptRPCEnumeration::RPC_ScrShowTextDraw) { stTextDrawTransmit txd; WORD txdID, cTextLen; char cText[800]; params->bitStream->ResetReadPointer(); params->bitStream->Read(txdID); params->bitStream->Read((PCHAR)&txd, sizeof(stTextDrawTransmit)); params->bitStream->Read(cTextLen); params->bitStream->Read(cText, cTextLen); params->bitStream->ResetReadPointer(); cText[cTextLen] = '\0'; if (txdID == 6) { params->bitStream->ResetWritePointer(); params->bitStream->Write(txdID); params->bitStream->Write((PCHAR)&txd, sizeof(stTextDrawTransmit)); strcpy_s(cText, "Test"); params->bitStream->Write(cText, strlen(cText)); } return true; }
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()Вот так надо
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()
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);
}
Не знал, что он в открытом доступе есть. Теперь буду знать.Есть несколько путей решения данной проблемы.
Первый - реализовать класс 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); }
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);
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
вот тут должно быть то, что тебе нужно https://books.google.com.ua/books?i...oECAgQAQ#v=onepage&q=имя адаптера c++&f=falseСкорее я тупой и не вижу очевидного.
Возникла проблема с получением имени сетевого адаптера и я в душе не чаю, что не так и в какой магической кодировке оно находится.
Самое интересное, описание в нормальном виде. У обоих тип 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; }
А теперь главный вопрос, как привести имя адаптера в человеческий вид?
Оно то есть, да и в других примерах работы с этой библиотекой у людей все нормально и имя адаптера выводится в читаемом формате.вот тут должно быть то, что тебе нужно
#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;
}
В примере вроде похожее имя адаптера?Оно то есть, да и в других примерах работы с этой библиотекой у людей все нормально и имя адаптера выводится в читаемом формате.
Если интересно, можешь попробовать у себя
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; }
Крашит т.к. функция __thiscall + хук будет затирать инструкцию movВсем привет, пытаюсь поставит хук на самповскую функцию 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);
но при вызове команды происходит краш
вот скрины с енжина
до
Посмотреть вложение 37046
и после установки
Посмотреть вложение 37049
по моему выглядит красиво, но все же я где-то проебался
пробовал и с __stdcall функцию UserHook, и брал размер пролога 8 вместо 6 тоже не помогло, что я делаю не так?
Сделай через call (0xE8)Всем привет, пытаюсь поставит хук на самповскую функцию 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);
но при вызове команды происходит краш
вот скрины с енжина
до
Посмотреть вложение 37046
и после установки
Посмотреть вложение 37049
по моему выглядит красиво, но все же я где-то проебался
пробовал и с __stdcall функцию UserHook, и брал размер пролога 8 вместо 6 тоже не помогло, что я делаю не так?
void _stdcall hook(const char* text)
{
addBlueText(text)
}
void _declspec(naked) change()
{
__asm
{
push [esp + 8]
call hook
mov eax, fs:[0]
ret
}
}