korsarsan
Участник
- 82
- 31
Как нарисовать 3D круг на Imgui?
хукай и нопай 53 (onSendDeathNotification) и 52 (onSendDeathNotification) RPC по гайду Юры Кодаcode lua:
lua:local sampev = require("lib.samp.events") function sampev.onSendSpawn() setCharHealth(PLAYER_PED, 0) return false end function sampev.onSendDeathNotification() return false end
как эти две функи переписать на сф (sf 551)?
#include <iostream>
#include <fstream>
#include <string>
#include <Windows.h>
HHOOK gHookHandle;
LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode == HC_ACTION) {
LPCSTR lpLibFileName = reinterpret_cast<LPCSTR>(lParam);
char fullPath[MAX_PATH];
GetFullPathNameA(lpLibFileName, MAX_PATH, fullPath, nullptr);
char exePath[MAX_PATH];
GetModuleFileNameA(nullptr, exePath, MAX_PATH);
std::ofstream logFile("log.txt", std::ofstream::app);
logFile << "Program: " << exePath << ", Library: " << fullPath << std::endl;
logFile.close();
}
return CallNextHookEx(gHookHandle, nCode, wParam, lParam);
}
int main() {
HMODULE hKernel32 = GetModuleHandleA("kernel32.dll");
FARPROC pLoadLibraryA = GetProcAddress(hKernel32, "LoadLibraryA");
gHookHandle = SetWindowsHookExA(WH_CALLWNDPROC, HookProc, nullptr, 0);
std::cout << "Hook installed. Press any key to exit." << std::endl;
getchar();
UnhookWindowsHookEx(gHookHandle);
return 0;
}
RakNetInterface* - 3550Как можно получить указатель на RakPeer, не хукая его методы?
но ракклиент точно не брать из cnetgame, ибо его могут подменить. бери из конструктора ракклиентаRakNetInterface* - 3550
:get_samp_version_id
// 0AB1: @get_samp_version_id 0 _returned: ID 0@
30@ = 0
IF 0AA2: 31@ = "samp.dll" // IF and SET
THEN
31@ += 0x128
0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
IF 29@ == 0x5542F47A
THEN // 0.3.7 R1
30@ = 1
END
IF 29@ == 0x59C30C94
THEN // 0.3.7 R2
30@ = 2
END
IF 29@ == 0x5A6A3130
THEN // 0.3.DL
30@ = 3
END
31@ -= 8 // reading samp.dll + 0x120
0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1
IF 29@ == 0x5C0B4243
THEN // 0.3.7 R3
30@ = 4
END
IF 29@ == 0x5DD606CD
THEN // 0.3.7 R4
30@ = 5
END
IF 29@ == 0x6094ACAB
THEN // 0.3.7 R4 - v2
30@ = 6
END
IF 29@ == 0x6372C39E
THEN // 0.3.7 R5
30@ = 7
END
END
0AB2: ret 1 30@
:GetLocalPlayerName
{
0AB1: @GetLocalPlayerName 0 _Returned: NameInIntegerFormat 31@
}
IF 0AA2: 31@ = "samp.dll"
THEN
0AB1: @get_samp_version_id 0 _returned: ID 17@
IF 17@ > 0
THEN
IF 17@ == 1 // 0.3.7 R1
THEN
0A8E: 30@ = 31@ + 0x21A0F8 // SAMP_INFO_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x3CD // SAMP_PPOOLS_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x18 // SAMP_PPOOL_PLAYER_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
0A8E: 29@ = 31@ + 0x13CD0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
END
IF 17@ == 2 // 0.3.7 R2
THEN
0A8E: 30@ = 31@ + 0x21A100 // SAMP_INFO_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x3C5 // SAMP_PPOOLS_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
0A8E: 29@ = 31@ + 0x13D90 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
END
IF 17@ == 3 // 0.3.DL
THEN
0A8E: 30@ = 31@ + 0x2ACA24 // SAMP_INFO_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x3DE // SAMP_PPOOLS_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
0A8E: 29@ = 31@ + 0x170C0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
END
IF 17@ == 4 // 0.3.7 R3
THEN
0A8E: 30@ = 31@ + 0x26E8DC // SAMP_INFO_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x3DE // SAMP_PPOOLS_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
0A8E: 29@ = 31@ + 0x16EF0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
END
IF 17@ == 5 // 0.3.7 R4
THEN
0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x3DE // SAMP_PPOOLS_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
0A8E: 29@ = 31@ + 0x17560 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
END
IF 17@ == 6 // 0.3.7 R4 - v2
THEN
0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x3DE // SAMP_PPOOLS_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
0A8E: 29@ = 31@ + 0x175B0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
END
IF 17@ == 7 // 0.3.7 R5
THEN
0A8E: 30@ = 31@ + 0x26EB94 // SAMP_INFO_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x3DE // SAMP_PPOOLS_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET
0A8D: 30@ = readMem 30@ sz 4 vp 0
0A8E: 29@ = 31@ + 0x175B0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET
END
0AA8: call_function_method 29@ struct 30@ num_params 0 pop 0 _Returned: Name 28@
/// Returned value is in integer, convert integer to string to get string...
END
END
0AB2: ret 0
Это не идеальный код но для примера сойдет. Другую функцию можно по аналогии сделать.Can someone help me rewrite these snippets in C++? | Может ли кто-нибудь помочь мне переписать эти фрагменты на C++?
CLEO::get_samp_version_id // 0AB1: @get_samp_version_id 0 _returned: ID 0@ 30@ = 0 IF 0AA2: 31@ = "samp.dll" // IF and SET THEN 31@ += 0x128 0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1 IF 29@ == 0x5542F47A THEN // 0.3.7 R1 30@ = 1 END IF 29@ == 0x59C30C94 THEN // 0.3.7 R2 30@ = 2 END IF 29@ == 0x5A6A3130 THEN // 0.3.DL 30@ = 3 END 31@ -= 8 // reading samp.dll + 0x120 0A8D: 29@ = read_memory 31@ size 4 virtual_protect 1 IF 29@ == 0x5C0B4243 THEN // 0.3.7 R3 30@ = 4 END IF 29@ == 0x5DD606CD THEN // 0.3.7 R4 30@ = 5 END IF 29@ == 0x6094ACAB THEN // 0.3.7 R4 - v2 30@ = 6 END IF 29@ == 0x6372C39E THEN // 0.3.7 R5 30@ = 7 END END 0AB2: ret 1 30@CLEO::GetLocalPlayerName { 0AB1: @GetLocalPlayerName 0 _Returned: NameInIntegerFormat 31@ } IF 0AA2: 31@ = "samp.dll" THEN 0AB1: @get_samp_version_id 0 _returned: ID 17@ IF 17@ > 0 THEN IF 17@ == 1 // 0.3.7 R1 THEN 0A8E: 30@ = 31@ + 0x21A0F8 // SAMP_INFO_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x3CD // SAMP_PPOOLS_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x18 // SAMP_PPOOL_PLAYER_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 0A8E: 29@ = 31@ + 0x13CD0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET END IF 17@ == 2 // 0.3.7 R2 THEN 0A8E: 30@ = 31@ + 0x21A100 // SAMP_INFO_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x3C5 // SAMP_PPOOLS_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 0A8E: 29@ = 31@ + 0x13D90 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET END IF 17@ == 3 // 0.3.DL THEN 0A8E: 30@ = 31@ + 0x2ACA24 // SAMP_INFO_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x3DE // SAMP_PPOOLS_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 0A8E: 29@ = 31@ + 0x170C0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET END IF 17@ == 4 // 0.3.7 R3 THEN 0A8E: 30@ = 31@ + 0x26E8DC // SAMP_INFO_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x3DE // SAMP_PPOOLS_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 0A8E: 29@ = 31@ + 0x16EF0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET END IF 17@ == 5 // 0.3.7 R4 THEN 0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x3DE // SAMP_PPOOLS_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x8 // SAMP_PPOOL_PLAYER_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 0A8E: 29@ = 31@ + 0x17560 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET END IF 17@ == 6 // 0.3.7 R4 - v2 THEN 0A8E: 30@ = 31@ + 0x26EA0C // SAMP_INFO_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x3DE // SAMP_PPOOLS_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 0A8E: 29@ = 31@ + 0x175B0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET END IF 17@ == 7 // 0.3.7 R5 THEN 0A8E: 30@ = 31@ + 0x26EB94 // SAMP_INFO_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x3DE // SAMP_PPOOLS_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 30@ += 0x4 // SAMP_PPOOL_PLAYER_OFFSET 0A8D: 30@ = readMem 30@ sz 4 vp 0 0A8E: 29@ = 31@ + 0x175B0 // SAMP_GET_LOCAL_PLAYER_NAME_OFFSET END 0AA8: call_function_method 29@ struct 30@ num_params 0 pop 0 _Returned: Name 28@ /// Returned value is in integer, convert integer to string to get string... END END 0AB2: ret 0
int get_samp_version_id(void)
{
DWORD version_current = 0;
DWORD samp_base = GetModuleHandle("samp.dll");
if (samp_base)
{
DWORD version_id = *(DWORD*)(samp_base + 0x128);
switch (version_id) {
case 0x5542F47A: // R1
version_current = 1;
break;
case 0x59C30C94: // R2
version_current = 2;
break;
case 0x5A6A3130: // DL
version_current = 3;
break;
}
version_id = *(DWORD*)(samp_base + 0x120);
switch (version_id) {
case 0x5C0B4243: // R3
version_current = 4;
break;
case 0x5DD606CD: // R4 - v1
version_current = 5;
break;
case 0x6094ACAB: // R4 - v2
version_current = 6;
break;
case 0x6372C39E: // R5
version_current = 7;
break;
}
}
return version_id;
}
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HSHELL_WINDOWCREATED)
{
HWND hwnd = (HWND)lParam;
char title[1024];
GetWindowTextA(hwnd, title, sizeof(title));
cout << "Создано новое окно: " << title << endl;
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main()
{
// Устанавливаем глобальный хук на создание окон
HHOOK hook = SetWindowsHookEx(WH_SHELL, HookProcedure, NULL, 0);
if (hook == NULL)
{
cout << "Ошибка установки хука: " << GetLastError() << endl;
return 1;
}
// Ожидаем нажатия клавиши
cout << "Хук установлен. Нажмите любую клавишу для выхода." << endl;
cin.get();
// Отключаем хук
UnhookWindowsHookEx(hook);
return 0;
}
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode == HC_ACTION)
{
switch (wParam)
{
case WM_LBUTTONDOWN:
cout << "Нажата левая кнопка мыши" << endl;
break;
case WM_LBUTTONUP:
cout << "Отпущена левая кнопка мыши" << endl;
break;
case WM_RBUTTONDOWN:
cout << "Нажата правая кнопка мыши" << endl;
break;
case WM_RBUTTONUP:
cout << "Отпущена правая кнопка мыши" << endl;
break;
case WM_MBUTTONDOWN:
cout << "Нажата средняя кнопка мыши" << endl;
break;
case WM_MBUTTONUP:
cout << "Отпущена средняя кнопка мыши" << endl;
break;
default:
break;
}
}
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
int main()
{
// Запускаем процесс
STARTUPINFO si = { sizeof(si) };
PROCESS_INFORMATION pi;
if (!CreateProcess(L"C:\\Windows\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
{
cout << "Ошибка запуска процесса: " << GetLastError() << endl;
return 1;
}
// Устанавливаем глобальный хук на процесс
HHOOK hook = SetWindowsHookEx(WH_MOUSE_LL, HookProcedure, NULL, 0);
if (hook == NULL)
{
cout << "Ошибка установки хука: " << GetLastError() << endl;
return 1;
}
// Ожидаем завершения процесса
WaitForSingleObject(pi.hProcess, INFINITE);
// Отключаем хук
UnhookWindowsHookEx(hook);
// Закрываем дескрипторы процесса и потока
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return 0;
}


Я конечно не уверен, но почему у тебя HWND это просто скащеный lParam? HWND является же первым аргументом wndProc'аКто сможет помочь, почему не может установится хук, выводит мне: Ошибка установки хука: 1428, запускаю от имени администратора, антивируса нету, в чем может быть проблема? мб настройка проекта
C++:#include <Windows.h> #include <iostream> #include <string> using namespace std; LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HSHELL_WINDOWCREATED) { HWND hwnd = (HWND)lParam; char title[1024]; GetWindowTextA(hwnd, title, sizeof(title)); cout << "Создано новое окно: " << title << endl; } return CallNextHookEx(NULL, nCode, wParam, lParam); } int main() { // Устанавливаем глобальный хук на создание окон HHOOK hook = SetWindowsHookEx(WH_SHELL, HookProcedure, NULL, 0); if (hook == NULL) { cout << "Ошибка установки хука: " << GetLastError() << endl; return 1; } // Ожидаем нажатия клавиши cout << "Хук установлен. Нажмите любую клавишу для выхода." << endl; cin.get(); // Отключаем хук UnhookWindowsHookEx(hook); return 0; }
другие хуки работают, особенно те которые не требуют прав администратора, к примеру этот код работает
C++:#include <Windows.h> #include <iostream> #include <string> using namespace std; LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode == HC_ACTION) { switch (wParam) { case WM_LBUTTONDOWN: cout << "Нажата левая кнопка мыши" << endl; break; case WM_LBUTTONUP: cout << "Отпущена левая кнопка мыши" << endl; break; case WM_RBUTTONDOWN: cout << "Нажата правая кнопка мыши" << endl; break; case WM_RBUTTONUP: cout << "Отпущена правая кнопка мыши" << endl; break; case WM_MBUTTONDOWN: cout << "Нажата средняя кнопка мыши" << endl; break; case WM_MBUTTONUP: cout << "Отпущена средняя кнопка мыши" << endl; break; default: break; } } return CallNextHookEx(NULL, nCode, wParam, lParam); } int main() { // Запускаем процесс STARTUPINFO si = { sizeof(si) }; PROCESS_INFORMATION pi; if (!CreateProcess(L"C:\\Windows\\notepad.exe", NULL, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) { cout << "Ошибка запуска процесса: " << GetLastError() << endl; return 1; } // Устанавливаем глобальный хук на процесс HHOOK hook = SetWindowsHookEx(WH_MOUSE_LL, HookProcedure, NULL, 0); if (hook == NULL) { cout << "Ошибка установки хука: " << GetLastError() << endl; return 1; } // Ожидаем завершения процесса WaitForSingleObject(pi.hProcess, INFINITE); // Отключаем хук UnhookWindowsHookEx(hook); // Закрываем дескрипторы процесса и потока CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return 0; }![]()
это не решает проблемуЯ конечно не уверен, но почему у тебя HWND это просто скащеный lParam? HWND является же первым аргументом wndProc'а
#include <Windows.h>
#include <iostream>
#include <string>
using namespace std;
HHOOK hHook;
LRESULT CALLBACK HookProcedure(int nCode, WPARAM wParam, LPARAM lParam)
{
cout << "Хук продус" << endl;
if (nCode == HCBT_CREATEWND)
{
HWND hwnd = (HWND)wParam;
char title[1024];
GetWindowTextA(hwnd, title, sizeof(title));
cout << "Создано новое окно: " << title << endl;
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
int main()
{
// Устанавливаем глобальный хук на создание окон
hHook = SetWindowsHookEx(WH_CBT, (HOOKPROC)HookProcedure, NULL, GetCurrentThreadId());
if (hHook == NULL)
{
cout << "Ошибка установки хука: " << GetLastError() << endl;
return 1;
}
// Ожидаем нажатия клавиши
cout << "Хук установлен. Нажмите любую клавишу для выхода." << endl;
cin.get();
// Отключаем хук
UnhookWindowsHookEx(hHook);
return 0;
}