Другое С/С++ Вопрос - Ответ

Byte

Участник
100
18
Посмотреть вложение 267454

Есть какая либо реализация вывода координат в углу экрана как на скрине?
SFML Используй


C++:
#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;
}
 

whyega52

Eblang головного мозга
Модератор
2,844
2,789
Кто-нибудь ставил нейкид хуки на линухе х86? Посоветуйте пожалуйста библиотеку, чтобы можно было вытаскивать регистры (можно даже не через саму либу, а через инлайн асм в нейкид функах)
 

Byte

Участник
100
18
Кто-нибудь ставил нейкид хуки на линухе х86? Посоветуйте пожалуйста библиотеку, чтобы можно было вытаскивать регистры (можно даже не через саму либу, а через инлайн асм в нейкид функах)
 
  • Нравится
Реакции: whyega52

whyega52

Eblang головного мозга
Модератор
2,844
2,789
А не подскажешь, как правильно изменить значение в eax (результат вызова функи) так, чтобы асм листинг не ломался (трамплинчик вроде называется)
1744654334791.png
 
Последнее редактирование:

Byte

Участник
100
18
А не подскажешь, как правильно изменить значение в eax (результат вызова функи) так, чтобы асм листинг не ломался (трамплинчик вроде называется)
Посмотреть вложение 267822
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);
}
 

whyega52

Eblang головного мозга
Модератор
2,844
2,789
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, то оно крашит, ибо там 6 байт, я так понимаю, на инструкцию, а хукер меняет только 5, а если ставить позже, оно разве не должно работать с нейкид функой?
 

Byte

Участник
100
18
Если ставить хук на call, то оно крашит, ибо там 6 байт, я так понимаю, на инструкцию, а хукер меняет только 5, а если ставить позже, оно разве не должно работать с нейкид функой?
а если хукнуть не сам call, а начало функции, на которую он указывает?
 

whyega52

Eblang головного мозга
Модератор
2,844
2,789
а если хукнуть не сам call, а начало функции, на которую он указывает?
А мне надо хукать функцию только в одном месте вызова (она вызывается и в других участках кода, но нужен именно этот)
 

moreveal

Известный
Проверенный
930
625
А мне надо хукать функцию только в одном месте вызова (она вызывается и в других участках кода, но нужен именно этот)
хукни всю, и глянь адрес в конце стека, чтобы она соответствовала возврату на некст инструкцию после нужного тебе места хахахах, ну просто в сабхуке видимо иначе не сделать, если не дает размер указать

еще конкретно в твоем случае это vtable вроде, ничо не мешает прочесть поинтер что там лежал (в ECX+E8), взяв это за адрес оригинальной функи, и записать туда самого себя

можно кнш еще хук на байт позже ставить, но трамплин придется ручками чинить, что не круто
 
Последнее редактирование:
  • Нравится
Реакции: whyega52

whyega52

Eblang головного мозга
Модератор
2,844
2,789
еще конкретно в твоем случае это vtable вроде, ничо не мешает прочесть поинтер что там лежал (в ECX+E8), взяв это за адрес оригинальной функи, и записать туда самого себ
тогда попробую стильный, молодежный ктхук (я, кстати. это вроде делал через проверку адреса возврата, но получалось криво), у него вроде проблема только с нейкид хуками
 
  • Нравится
Реакции: Byte и moreveal

0x9

Новичок
15
2
подскажите пожалуйста как можно соединить текст и задний фон в одну текстуру?

C++:
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));
 

vmprotect

Известный
383
242
пытаюсь поставить хук на UpdateNetwork, но когда отправляю ракнет пакеты ничего не работает
zalupa code:
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();
}