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

Sadow

Известный
1,411
582
C++:
size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* response)
{
    response->append((char*)contents, size * nmemb);
    return size * nmemb;
}

int main()
{
    CURL* curl = curl_easy_init();
    if (curl)
    {
        std::string url = "http://google.com/api";
    
 
        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_COOKIEFILE, "");
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        std::string response;
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
    
        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            std::cout << "error res one: " << curl_easy_strerror(res) << std::endl;
            return 1;
        }

        curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        response.clear();
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);

        res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            std::cout << "error res two: " << curl_easy_strerror(res) << std::endl;
            return 1;
        }

        std::cout << "res res one: " << response << std::endl;
        curl_easy_cleanup(curl);
    }

    return 0;
}
Не работает

Вот мой код:

говнокод на c++:
#include <iostream>
#include <regex>
#include <curl/curl.h>

using namespace std;

size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* response);

int main()
{
    CURL* curl = curl_easy_init();
    string resp;

    smatch m;
    string token;

    curl_httppost* formpost = NULL;
    curl_httppost* lastptr = NULL;

    curl_slist* headers = curl_slist_append(NULL, "Content-Type: multipart/form-data");

    if (curl)
    {
        curl_easy_setopt(curl, CURLOPT_URL, "https://www.blast.hk/members/451976/");

        curl_easy_setopt(curl, CURLOPT_COOKIE, "xf_user=VALUE");
        curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers);

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resp);

        CURLcode res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            cout << "Error : " << curl_easy_strerror(res) << endl;
            return 1;
        }

        if (regex_search(resp, m, regex("csrf: '(\\S*)'")))
            if (m.size() > 0)
                token = m.str(1);
        resp.clear();

        curl_easy_setopt(curl, CURLOPT_URL, "https://www.blast.hk/members/451976/post");
       
        curl_formadd(&formpost, &lastptr,
            CURLFORM_COPYNAME, "xfToken",
            CURLFORM_COPYCONTENTS, token,
            CURLFORM_END);

        curl_formadd(&formpost, &lastptr,
            CURLFORM_COPYNAME, "_xfToken",
            CURLFORM_COPYCONTENTS, token,
            CURLFORM_END);

        curl_formadd(&formpost, &lastptr,
            CURLFORM_COPYNAME, "_xfResponseType",
            CURLFORM_COPYCONTENTS, "json",
            CURLFORM_END);

        curl_formadd(&formpost, &lastptr,
            CURLFORM_COPYNAME, "message_html",
            CURLFORM_COPYCONTENTS, "<p>asd</p>",
            CURLFORM_END);

        curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);

        curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteCallback);
        curl_easy_setopt(curl, CURLOPT_WRITEDATA, &resp);

        res = curl_easy_perform(curl);
        if (res != CURLE_OK)
        {
            cout << "Error: " << curl_easy_strerror(res) << endl;
            return 1;
        }

        cout << resp << endl;

        curl_formfree(formpost);
        curl_slist_free_all(headers);
        curl_easy_cleanup(curl);
    }
}

size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* response)
{
    response->append((char*)contents, size * nmemb);
    return size * nmemb;
}
 
Последнее редактирование:

0x9

Участник
43
32
как с помощью plugin sdk можно найти определенную текстуру на машине и изменить ей цвет?
 

вайега52

cache miss
Модератор
3,060
3,295
При помощи sampapi получаю указатель на зааттаченный объект, как в дальнейшем я могу обращаться к его полям?

C++:
#include "sampapi/CObject.h"


CObject* pObject = sampapi::v037r3::RefNetGame()->GetPlayerPool()->m_localInfo.m_pObject->m_pPed->m_accessories.m_pObject[1];
auto pEntity = pObject->m_pGameEntity // error
1709992204406.png
 

Musaigen

ihatemyself
Проверенный
1,710
1,610
При помощи sampapi получаю указатель на зааттаченный объект, как в дальнейшем я могу обращаться к его полям?

C++:
#include "sampapi/CObject.h"


CObject* pObject = sampapi::v037r3::RefNetGame()->GetPlayerPool()->m_localInfo.m_pObject->m_pPed->m_accessories.m_pObject[1];
auto pEntity = pObject->m_pGameEntity // error
Посмотреть вложение 234077
plugin-sdk
 

вайега52

cache miss
Модератор
3,060
3,295
Если коротко, мне надо сделать хук на рендер объектов и если они приаттачены ко мне - пропускать отрисовку, в псдк немного покопался, не нашел того, что надо. Решил сделать путем получения всех аксессуаров и сравнения их с тем, что рендерится
C++:
void __cdecl CPlugin::CRendererRenderOneNonRoadHooked(const decltype(CRendererRenderOneNonRoadHook)& hook, uintptr_t* pEntity)
{
    char entityType = *reinterpret_cast<unsigned char*>(*pEntity + 0x36) & 7;

    if (entityType == eEntityType::ENTITY_TYPE_OBJECT && GetKeyState(VK_RBUTTON) & 0x8000)
    {
        for (int i = 0; i < sampapi::v037r3::CPed::MAX_ACCESSORIES; i++)
        {
            CObject* pObject = sampapi::v037r3::RefNetGame()->GetPlayerPool()->m_localInfo.m_pObject->m_pPed->m_accessories.m_pObject[i];
            uintptr_t* pAccessoriesEntity = reinterpret_cast<uintptr_t*>(pObject->m_pGameEntity); // HUY PIZDA ZALUPA ERROR

            if (pEntity == pAccessoriesEntity) return;
        }
    }


    hook.get_trampoline()(pEntity);
}
 

Musaigen

ihatemyself
Проверенный
1,710
1,610
Если коротко, мне надо сделать хук на рендер объектов и если они приаттачены ко мне - пропускать отрисовку, в псдк немного покопался, не нашел того, что надо. Решил сделать путем получения всех аксессуаров и сравнения их с тем, что рендерится
C++:
void __cdecl CPlugin::CRendererRenderOneNonRoadHooked(const decltype(CRendererRenderOneNonRoadHook)& hook, uintptr_t* pEntity)
{
    char entityType = *reinterpret_cast<unsigned char*>(*pEntity + 0x36) & 7;

    if (entityType == eEntityType::ENTITY_TYPE_OBJECT && GetKeyState(VK_RBUTTON) & 0x8000)
    {
        for (int i = 0; i < sampapi::v037r3::CPed::MAX_ACCESSORIES; i++)
        {
            CObject* pObject = sampapi::v037r3::RefNetGame()->GetPlayerPool()->m_localInfo.m_pObject->m_pPed->m_accessories.m_pObject[i];
            uintptr_t* pAccessoriesEntity = reinterpret_cast<uintptr_t*>(pObject->m_pGameEntity); // HUY PIZDA ZALUPA ERROR

            if (pEntity == pAccessoriesEntity) return;
        }
    }


    hook.get_trampoline()(pEntity);
}
тебе просто нужен plugin-SDK чтобы определялся игровой CObject, в sampapi нет игровых структур, вместо них заглушки
 
  • Нравится
Реакции: ARMOR и вайега52

вайега52

cache miss
Модератор
3,060
3,295
тебе просто нужен plugin-SDK чтобы определялся игровой CObject, в sampapi нет игровых структур, вместо них заглушки
Если я правильно понял, CObject наследуется от Entity. Как его можно сравнить с нужной мне сущностью, которая передается в мой хук?

возможно я туплю, но вроде как туда передается самповский CObject
1710017089481.png
 
Последнее редактирование:

вайега52

cache miss
Модератор
3,060
3,295
Попробовал провернуть такой код, но странно, что объекты все равно продолжают рендериться:
C++:
void __cdecl CPlugin::CRendererRenderOneNonRoadHooked(const decltype(CRendererRenderOneNonRoadHook)& hook, uintptr_t* pEntity)
{
    char entityType =* reinterpret_cast<unsigned char* >(*pEntity + 0x36) & 7;

    if (entityType == eEntityType::ENTITY_TYPE_OBJECT && GetKeyState(VK_RBUTTON) & 0x8000)
    {
        for (int i = 0; i < sampapi::v037r3::CPed::MAX_ACCESSORIES; i++)
        {
            if (sampapi::v037r3::RefNetGame() != nullptr)
            {
                sampapi::v037r3::CPlayerPool* pPlayerPool = sampapi::v037r3::RefNetGame()->GetPlayerPool();
                if (pPlayerPool != nullptr && pPlayerPool->m_localInfo.m_pObject != nullptr && pPlayerPool->m_localInfo.m_pObject->m_pPed != nullptr)
                {
                    CObject* pObject = pPlayerPool->m_localInfo.m_pObject->m_pPed->m_accessories.m_pObject[i];

                    if (pObject != nullptr)
                    {
                        // 0x40 - m_pGameEntity
                        uintptr_t* pAccessoriesEntity = reinterpret_cast<uintptr_t*>(*reinterpret_cast<uintptr_t*>(pObject) + 0x40);
                        if (pEntity != nullptr && pEntity == pAccessoriesEntity) return;
                    }
                }
            }
        }
    }

    hook.get_trampoline()(pEntity);
}
 

horacy

Известный
111
98
Нужно убрать вот эти слова из памяти от DLL-Библиотеки, использую ManualMap. Слова берет из меню чита, также переменные.

Посмотреть вложение 233322
вам это нужно на базовом SA-MP? Если да, то сервер обычно проверяет его через rpc_clientcheck, чтобы проверить, совпадает ли данный адрес с тем, что в игре без читов, просто скопируйте ответы RPC из чистой игры и перехватите rpc_clientcheckresponse, а затем замените данные на оригинальные и отправьте их. назад.
 

вайега52

cache miss
Модератор
3,060
3,295
а текста "Connecting to" есть оффсет? если есть скинь плиз
если сама строка, то samp.dll + 0xE599C, если то, где передается ссылка на нее, то здесь: samp.dll + 0x85FE. Советую, скачать IDA и самому посмотреть оффсеты строк, это довольно легко
 
  • Нравится
Реакции: Z3roKwq и vmprotect

vmprotect

Известный
394
279
как в нынешней версии kthook'a используется kthook_simple ?

пример
C++:
samp_init_hook.after.connect(HOOK_after_samp_init)
в нынешней версии after, before, connect нету, каким образом можно использовать эту функцию?