nmatez
Новичок
- 1
- 0
через СDog класспри изменении меняется для всей модели а мне надо как то сделать для определеного CVehicle
через СDog класспри изменении меняется для всей модели а мне надо как то сделать для определеного CVehicle
SFML Используй
#include <SFML/Graphics.hpp>
#include <iomanip>
#include <sstream>
std::string formatCoordinates(float x, float y, float z) {
std::ostringstream oss;
oss << std::fixed << std::setprecision(6);
oss << "X: " << x << ", Y: " << y << ", Z: " << z;
return oss.str();
}
int main() {
sf::RenderWindow window(sf::VideoMode(800, 600), "Coordinates Display");
sf::Font font;
font.loadFromFile("arial.ttf");
sf::Text coordinatesText;
coordinatesText.setFont(font);
coordinatesText.setCharacterSize(24);
coordinatesText.setFillColor(sf::Color::White);
coordinatesText.setPosition(600, 550);
float x = 761.897775f, y = 1526.382080f, z = 12.000000f; // тут передавай свои значения
while (window.isOpen()) {
sf::Event event;
while (window.pollEvent(event)) {
if (event.type == sf::Event::Closed)
window.close();
}
coordinatesText.setString(formatCoordinates(x, y, z));
window.clear(sf::Color::Black);
window.draw(coordinatesText);
window.display();
}
return 0;
}
как нопнуть весь худ гташки?
*reinterpret_cast<uint8_t*>(0x58FAE0) = 0xC3;
Кто-нибудь ставил нейкид хуки на линухе х86? Посоветуйте пожалуйста библиотеку, чтобы можно было вытаскивать регистры (можно даже не через саму либу, а через инлайн асм в нейкид функах)
А не подскажешь, как правильно изменить значение в eax (результат вызова функи) так, чтобы асм листинг не ломался (трамплинчик вроде называется)![]()
GitHub - wyrover/subhook: Super-simple hooking library for C/C++
Super-simple hooking library for C/C++. Contribute to wyrover/subhook development by creating an account on GitHub.github.com
А не подскажешь, как правильно изменить значение в eax (результат вызова функи) так, чтобы асм листинг не ломался (трамплинчик вроде называется)
Посмотреть вложение 267822
#include <subhook.h>
subhook_t original_function_hook;
typedef int (*original_func_t)(/* параметры */);
int my_hook_function(/* параметры */) {
// Получаем трамплин и вызываем оригинальную функцию
int result = ((original_func_t)subhook_get_trampoline(original_function_hook))(/* параметры */);
// Модифицируем результат (значение в eax)
result = /* твоя модификация например result * 2 */;
return result;
}
void setup_hook() {
original_function_hook = subhook_new((void*)original_function, (void*)my_hook_function);
subhook_install(original_function_hook);
}
Если ставить хук на call, то оно крашит, ибо там 6 байт, я так понимаю, на инструкцию, а хукер меняет только 5, а если ставить позже, оно разве не должно работать с нейкид функой?C++:#include <subhook.h> subhook_t original_function_hook; typedef int (*original_func_t)(/* параметры */); int my_hook_function(/* параметры */) { // Получаем трамплин и вызываем оригинальную функцию int result = ((original_func_t)subhook_get_trampoline(original_function_hook))(/* параметры */); // Модифицируем результат (значение в eax) result = /* твоя модификация например result * 2 */; return result; } void setup_hook() { original_function_hook = subhook_new((void*)original_function, (void*)my_hook_function); subhook_install(original_function_hook); }
а если хукнуть не сам call, а начало функции, на которую он указывает?Если ставить хук на call, то оно крашит, ибо там 6 байт, я так понимаю, на инструкцию, а хукер меняет только 5, а если ставить позже, оно разве не должно работать с нейкид функой?
А мне надо хукать функцию только в одном месте вызова (она вызывается и в других участках кода, но нужен именно этот)а если хукнуть не сам call, а начало функции, на которую он указывает?
хукни всю, и глянь адрес в конце стека, чтобы она соответствовала возврату на некст инструкцию после нужного тебе места хахахах, ну просто в сабхуке видимо иначе не сделать, если не дает размер указатьА мне надо хукать функцию только в одном месте вызова (она вызывается и в других участках кода, но нужен именно этот)
тогда попробую стильный, молодежный ктхук (я, кстати. это вроде делал через проверку адреса возврата, но получалось криво), у него вроде проблема только с нейкид хукамиеще конкретно в твоем случае это vtable вроде, ничо не мешает прочесть поинтер что там лежал (в ECX+E8), взяв это за адрес оригинальной функи, и записать туда самого себ
if (!pFont) {
if (FAILED(D3DXCreateFontA(pDevice, 48, 0, FW_BOLD, 1, FALSE, DEFAULT_CHARSET,
OUT_DEFAULT_PRECIS, ANTIALIASED_QUALITY, DEFAULT_PITCH | FF_DONTCARE,
"Arial", &pFont))) {
return;
}
}
RECT backgroundRect = { 0, 0, 512, 128 };
D3DRECT backgroundRectt = { 0, 0, 512, 128 };
pDevice->Clear(1, &backgroundRectt, D3DCLEAR_TARGET, D3DCOLOR_XRGB(255, 255, 255), 0, 0);
pFont->DrawTextA(nullptr, "test", -1, &backgroundRect, DT_CENTER | DT_VCENTER | DT_SINGLELINE, D3DCOLOR_XRGB(0, 0, 0));
void CNetGame__UpdateNetwork__HOOK(const decltype(CNetGame__UpdateNetwork_Hook) & hook, void * _this) {
Packet * packet = nullptr;
uint8_t * localdata = nullptr;
uint8_t state {};
for (packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive(); packet; packet = sampapi::v037r3::RefNetGame()->m_pRakClient->Receive()) {
localdata = packet -> data;
switch (state) {
localdata = packet->data;
if(*localdata == 40) state = localdata[5];
case 223: {
RakNet::BitStream bs((unsigned char * ) packet -> data, packet -> length, false);
uint8_t packetID;
uint32_t rpcID;
bs.Read(packetID);
bs.Read(rpcID);
if (rpcID == 15) {
sampapi::v037r3::RefChat() -> AddChatMessage("я тормоз", 0xFFFFFFFF, "я тормоз");
return;
}
break;
}
default:
break;
}
}
return hook.call_trampoline(_this);
}
void hooks::install_tormoz_updatenetwork_hook() {
CNetGame__UpdateNetwork_Hook.set_dest(0xAF20);
CNetGame__UpdateNetwork_Hook.set_cb(&CNetGame__UpdateNetwork__HOOK);
CNetGame__UpdateNetwork_Hook.install();
}