dekname
Участник
- 44
- 2
ок, какие есть варианты, если не делать метод статичным?Ну получишь ты адрес, че дальше то? Функция коллбэка __cdecl, методы класса __thiscall вот тебе и зависание, потому что стек чистится
ок, какие есть варианты, если не делать метод статичным?Ну получишь ты адрес, че дальше то? Функция коллбэка __cdecl, методы класса __thiscall вот тебе и зависание, потому что стек чистится
Никаких.ок, какие есть варианты, если не делать метод статичным?
Действительно, делай staticБез static'a же тоже можно сделать callback. Получить адрес через union и дописать this на текущий класс (thunk). Например так:
C++:// union union UnionCallbackCommand { using ptr_t = void(SomeClass::*)(const char*); ptr_t ptr; uint64_t addr_as_uint64; }; // получение адреса m_union_cmd_callback.ptr = &SomeClass::Command; // в private: UnionCallbackCommand m_union_cmd_callback; // регистрация команды: m_input->AddCommand("somecommand", (sampapi::CMDPROC)&m_union_cmd_callback.addr_as_uint64); // сам callback void SomeClass::Command(const char* cmd) { }
Но так я получаю зависание игры, как можно пофиксить?
Прямое право он имеет) https://en.wikipedia.org/wiki/As-if_rule https://en.cppreference.com/w/cpp/language/as_ifкого опускает? кто он такой чтобы опускать? какое у него право?
Посмотрите еще этот ответ, вопрос был похожий - https://www.blast.hk/threads/781/page-294#post-439421Что по-вашему эффективнее и лучше использовать в памяти: std::fill или memset?
сканить все процессы через: Process32First и Process32Next.Как проверить, запущен ли определенный процесс в диспетчере задач?
допустим callback я сделал для команды, но теперь мне нужен обработчик всех команд (detour по адресу base + 0x65A70). Т.е:Действительно, делай static
Ебани __cdecl метод, дальше в тханке пушь указатель на свой объект, делай call на обработчик, затем вытаскивай запушеные четыре байта, ретайся (первым аргументом в обработчике придется сделать адрес возврата).
CMDPROC CInput::GetCommandHandler(const char* pName) {
return ((CMDPROC(__thiscall*)(CInput*, const char*))GetAddress(0x65A70))(this, pName);
}
std::memcpy(&m_thunk[12], "\x55\x89\xe5\xff\x75\x08\xb9????\xb8????\xff\xd0\xc9\xc3", 20);
*(uintptr_t*)&m_thunk[19] = (uintptr_t)this;
*(uintptr_t*)&m_thunk[24] = m_union_cmd_callback.addr_as_uint64;
m_input->AddCommand("somecommand", (sampapi::CMDPROC)&m_thunk[12]);
Можно попробовать хукнуть функцию отправки через сокет(sendto или send), и отклонять отправку, пока не прошло необходимое кол-во времени.1.Ваш вопрос : Как можно после загрузки игры отключить raknet или сделать так чтоб не подключался к серверу необходимое количество времени
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Arial.ttf", 16, NULL, ImGui::GetIO().Fonts->GetGlyphRangesCyrillic());
(void)io;
ImGui_ImplWin32_Init(GetActiveWindow());
ImGui_ImplDX9_Init(pDevice);
ImGui::GetIO().MouseDrawCursor = 0;
После инициализации имгуи, вечно рисуется курсор (курсор винды)
пробовать отключать черезC++:ImGui::CreateContext(); ImGuiIO& io = ImGui::GetIO(); io.Fonts->AddFontFromFileTTF("C:\\Windows\\Fonts\\Arial.ttf", 16, NULL, ImGui::GetIO().Fonts->GetGlyphRangesCyrillic()); (void)io; ImGui_ImplWin32_Init(GetActiveWindow()); ImGui_ImplDX9_Init(pDevice);
не помоглоC++:ImGui::GetIO().MouseDrawCursor = 0;
io.ConfigFlags |= ImGuiConfigFlags_NoMouseCursorChange;
struct stPlayerPool
{
uint32_t MaxPlayerID;//???? not tested
uint16_t sLocalPlayerID;
void *pVTBL_txtHandler;
union
{
char szLocalPlayerName[16];
char *pszLocalPlayerName;
};
int iLocalPlayerNameLen;
int iLocalPlayerNameAllocated;
struct stLocalPlayer *pLocalPlayer;
int iLocalPlayerPing;
int iLocalPlayerScore;
struct stRemotePlayer *pRemotePlayer[SAMP_MAX_PLAYERS];
int iIsListed[SAMP_MAX_PLAYERS];
uint32_t ulUnk1[SAMP_MAX_PLAYERS];
}
у меня есть структура PlayerPool для R1
можете дать такую же структуру, но для R3?C++:struct stPlayerPool { uint32_t MaxPlayerID;//???? not tested uint16_t sLocalPlayerID; void *pVTBL_txtHandler; union { char szLocalPlayerName[16]; char *pszLocalPlayerName; }; int iLocalPlayerNameLen; int iLocalPlayerNameAllocated; struct stLocalPlayer *pLocalPlayer; int iLocalPlayerPing; int iLocalPlayerScore; struct stRemotePlayer *pRemotePlayer[SAMP_MAX_PLAYERS]; int iIsListed[SAMP_MAX_PLAYERS]; uint32_t ulUnk1[SAMP_MAX_PLAYERS]; }
enum { MAX_PLAYERS = 1004 };
int m_nLargestId;
CPlayerInfo* m_pObject[MAX_PLAYERS];
BOOL m_bNotEmpty[MAX_PLAYERS];
BOOL m_bPrevCollisionFlag[MAX_PLAYERS];
struct SAMPAPI_EXPORT {
int m_nPing;
int m_nScore;
ID m_nId;
std::string m_szName;
CLocalPlayer* m_pObject;
} m_localInfo;
C++:enum { MAX_PLAYERS = 1004 }; int m_nLargestId; CPlayerInfo* m_pObject[MAX_PLAYERS]; BOOL m_bNotEmpty[MAX_PLAYERS]; BOOL m_bPrevCollisionFlag[MAX_PLAYERS]; struct SAMPAPI_EXPORT { int m_nPing; int m_nScore; ID m_nId; std::string m_szName; CLocalPlayer* m_pObject; } m_localInfo;
struct SAMPAPI_EXPORT {
int m_nPing;
int m_nScore;
ID m_nId;
#ifndef _DEBUG
private:
int __alignment;
public:
#endif
std::string m_szName;
CLocalPlayer* m_pObject;
} m_localInfo;
Попробуй получить с помощью прочёсывания всех модулей. Вот пример получения всех функций.Вот если в процессе два .dll модуля с одинаковым названием, как можно получить оба? По хэндлу все время только 1
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
int main()
{
DWORD processId;
std::cin >> processId;
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, processId);
if (hModuleSnap == INVALID_HANDLE_VALUE) {
return 0;
}
MODULEENTRY32 me32;
me32.dwSize = sizeof(me32);
if (Module32First(hModuleSnap, &me32)) {
std::cout << " modules:" << std::endl;
do {
printf("%x %ws\n", (DWORD)me32.hModule, me32.szModule);
} while (Module32Next(hModuleSnap, &me32));
}
CloseHandle(hModuleSnap);
return 0;
}